2
/// This file is part of Rheolef.
4
/// Copyright (C) 2000-2009 Pierre Saramito <Pierre.Saramito@imag.fr>
6
/// Rheolef is free software; you can redistribute it and/or modify
7
/// it under the terms of the GNU General Public License as published by
8
/// the Free Software Foundation; either version 2 of the License, or
9
/// (at your option) any later version.
11
/// Rheolef is distributed in the hope that it will be useful,
12
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
/// GNU General Public License for more details.
16
/// You should have received a copy of the GNU General Public License
17
/// along with Rheolef; if not, write to the Free Software
18
/// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
/// =========================================================================
21
# include "rheolef/hack_array.h"
24
// ===============================================================
26
// ===============================================================
27
template<class T, class A>
28
hack_array_seq_rep<T,A>::hack_array_seq_rep (const A& alloc)
36
template<class T, class A>
37
hack_array_seq_rep<T,A>::hack_array_seq_rep (const distributor& ownership, const parameter_type& param, const A& alloc)
39
_ownership (ownership),
41
_value_size (T::_size_of (_parameter)),
42
_data_size (T::_data_size(_parameter))
44
_init (_ownership, _parameter);
46
template<class T, class A>
47
hack_array_seq_rep<T,A>::hack_array_seq_rep (size_type n, const parameter_type& param, const A& alloc)
49
_ownership (distributor::decide, communicator(), n),
51
_value_size (T::_size_of (_parameter)),
52
_data_size (T::_data_size(_parameter))
54
_init (_ownership, _parameter);
56
template<class T, class A>
58
hack_array_seq_rep<T,A>::resize (const distributor& ownership, const parameter_type& param)
60
_ownership = ownership;
62
_value_size = T::_size_of (_parameter);
63
_data_size = T::_data_size(_parameter);
64
_init (_ownership, _parameter);
66
template<class T, class A>
68
hack_array_seq_rep<T,A>::resize (size_type n, const parameter_type& param)
70
_ownership = distributor (distributor::decide, communicator(), n);
72
_value_size = T::_size_of (_parameter);
73
_data_size = T::_data_size(_parameter);
74
_init (_ownership, _parameter);
76
template<class T, class A>
78
hack_array_seq_rep<T,A>::_init (const distributor& ownership, const parameter_type& param)
80
base::_ownership = distributor (ownership.dis_size()*_value_size, ownership.comm(), ownership.size()*_value_size),
81
base::resize (base::_ownership, std::numeric_limits<raw_type>::max());
82
size_type *p = base::begin().operator->();
83
for (size_type i = 0, n = ownership.size(); i < n; i++) {
86
q -> _set_parameter(param);
90
// ===============================================================
92
// ===============================================================
93
template <class T, class A>
94
template <class PutFunction>
96
hack_array_seq_rep<T,A>::put_values (odiststream& ops, PutFunction put_element) const
98
std::ostream& os = ops.os();
99
for (size_type i = 0; i < size(); i++) {
100
put_element (os, operator[](i));
105
template <class T, class A>
107
hack_array_seq_rep<T,A>::put_values (odiststream& ops) const
109
return put_values (ops, _array_put_element_type<generic_value_type>());
111
template <class T, class A>
112
template <class GetFunction>
114
hack_array_seq_rep<T,A>::get_values (idiststream& ips, GetFunction get_element) {
115
check_macro (load_chunk (ips.is(), begin(), end(), get_element), "read failed on input stream.");
118
template <class T, class A>
120
hack_array_seq_rep<T,A>::get_values (idiststream& ips)
122
return get_values (ips, _array_get_element_type<generic_value_type>());
125
} // namespace rheolef