32 #ifndef VSMC_CORE_STATE_TUPLE_HPP
33 #define VSMC_CORE_STATE_TUPLE_HPP
39 #define VSMC_RUNTIME_ASSERT_CORE_STATE_TUPLE_COPY_SIZE_MISMATCH \
40 VSMC_RUNTIME_ASSERT((N == static_cast<size_type>(this->size())), \
41 ("**StateTuple::copy** SIZE MISMATCH"))
47 template <
MatrixOrder Order,
typename T,
typename... Types>
58 {
typedef typename std::tuple_element<Pos, state_tuple_type>::type
type;};
76 #if VSMC_HAS_CXX11_RVALUE_REFERENCES
78 data_(cxx11::
move(other.data_)) {}
95 template <
typename Archive>
99 template <
typename Archive>
106 static VSMC_CONSTEXPR const std::size_t dim_ =
sizeof...(Types) + 1;
108 template <
typename Archive, std::
size_t Pos>
111 ar & std::get<Pos>(data_);
115 template <
typename Archive>
118 template <
typename Archive, std::
size_t Pos>
119 void serialize (Archive &ar, Position<Pos>)
const
121 ar & std::get<Pos>(data_);
125 template <
typename Archive>
126 void serialize (Archive &, Position<dim_>)
const {}
129 template <
typename S>
138 template <std::
size_t Pos>
145 template <std::
size_t Pos>
150 template <
typename S>
159 template <std::
size_t Pos>
166 template <std::
size_t Pos>
171 size_type
size ()
const {
return size_;}
175 template <std::
size_t Pos,
typename OutputIter>
179 static_cast<const StateTuple<Order, T, Types...
> *>(
this);
180 for (size_type i = 0; i != size_; ++i, ++first)
184 template <std::
size_t Pos,
typename OutputIter>
188 template <
typename CharT,
typename Traits>
189 std::basic_ostream<CharT, Traits> &
print (
190 std::basic_ostream<CharT, Traits> &os,
char sepchar =
'\t')
const
192 if (dim_ == 0 || size_ == 0 || !os.good())
195 for (size_type i = 0; i != size_; ++i)
208 static VSMC_CONSTEXPR const std::size_t dim_ =
sizeof...(Types) + 1;
210 template <std::
size_t Pos,
typename CharT,
typename Traits>
211 void print_particle (std::basic_ostream<CharT, Traits> &os, size_type
id,
215 static_cast<const StateTuple<Order, T, Types...
> *>(
this);
220 template <
typename CharT,
typename Traits>
221 void print_particle (std::basic_ostream<CharT, Traits> &os, size_type
id,
222 char, Position<dim_ - 1>)
const
224 const StateTuple<Order, T, Types...> *sptr =
225 static_cast<const StateTuple<Order, T, Types...
> *>(
this);
226 os << sptr->state(
id, Position<dim_ - 1>()) <<
'\n';
230 template <
typename CharT,
typename Traits,
233 std::basic_ostream<CharT, Traits> &os,
235 {
return stuple.
print(os);}
239 template <
typename T,
typename... Types>
252 template <std::
size_t Pos>
253 typename state_tuple_base_type::template state_type<Pos>::type
255 {
return std::get<Pos>(state_[id]);}
257 template <std::
size_t Pos>
258 const typename state_tuple_base_type::template state_type<Pos>::type
260 {
return std::get<Pos>(state_[id]);}
262 template <std::
size_t Pos>
263 typename state_tuple_base_type::template state_type<Pos>::type
267 template <std::
size_t Pos>
268 const typename state_tuple_base_type::template state_type<Pos>::type
278 template <
typename IntType>
279 void copy (size_type N,
const IntType *copy_from)
283 for (size_type to = 0; to != N; ++to)
284 copy_particle(copy_from[to], to);
288 {state_[to] = state_[from];}
291 {
return state_pack_type(state_[
id]);}
294 {state_[id] = pack.data();}
296 #if VSMC_HAS_CXX11_RVALUE_REFERENCES
303 static VSMC_CONSTEXPR const std::size_t dim_ =
sizeof...(Types) + 1;
304 std::vector<std::tuple<T, Types...> > state_;
309 template <
typename T,
typename... Types>
323 template <std::
size_t Pos>
324 typename state_tuple_base_type::template state_type<Pos>::type
326 {
return std::get<Pos>(state_)[
id];}
328 template <std::
size_t Pos>
329 const typename state_tuple_base_type::template state_type<Pos>::type
331 {
return std::get<Pos>(state_)[
id];}
333 template <std::
size_t Pos>
334 typename state_tuple_base_type::template state_type<Pos>::type
338 template <std::
size_t Pos>
339 const typename state_tuple_base_type::template state_type<Pos>::type
343 template <std::
size_t Pos>
344 typename state_tuple_base_type::template state_type<Pos>::type
347 template <std::
size_t Pos>
348 const typename state_tuple_base_type::template state_type<Pos>::type
351 template <std::
size_t Pos>
352 typename state_tuple_base_type::template state_type<Pos>::type
353 *
data () {
return &std::get<Pos>(state_)[0];}
355 template <std::
size_t Pos>
356 const typename state_tuple_base_type::template state_type<Pos>::type
357 *
data ()
const {
return &std::get<Pos>(state_)[0];}
375 template <
typename IntType>
376 void copy (size_type N,
const IntType *copy_from)
380 for (size_type to = 0; to != N; ++to)
381 copy_particle(copy_from[to], to);
394 state_pack_type pack;
403 #if VSMC_HAS_CXX11_RVALUE_REFERENCES
410 static VSMC_CONSTEXPR const std::size_t dim_ =
sizeof...(Types) + 1;
411 std::tuple<std::vector<T>, std::vector<Types>...> state_;
413 template <std::
size_t Pos>
416 std::get<Pos>(state_).resize(N);
420 void init_state (size_type N, Position<
sizeof...(Types)>)
421 {
std::get<
sizeof...(Types)>(state_).resize(N);}
423 template <std::
size_t Pos,
typename PTRType>
424 void insert_data (PTRType &dptr, Position<Pos>)
const
426 std::get<Pos>(dptr) = data<Pos>();
427 insert_data(dptr, Position<Pos + 1>());
430 template <
typename PTRType>
431 void insert_data (PTRType &dptr, Position<
sizeof...(Types)>)
const
432 {
std::get<
sizeof...(Types)>(dptr) = data<
sizeof...(Types)>();}
434 template <std::
size_t Pos>
435 void copy_particle (size_type from, size_type to, Position<Pos>)
437 state(to, Position<Pos>()) = state(from, Position<Pos>());
438 copy_particle(from, to, Position<Pos + 1>());
441 void copy_particle (size_type, size_type, Position<dim_>) {}
443 template <std::
size_t Pos>
444 void pack_particle (size_type
id, state_pack_type &pack,
447 std::get<Pos>(pack.data()) = state(
id, Position<Pos>());
448 pack_particle(
id, pack, Position<Pos + 1>());
451 void pack_particle (size_type, state_pack_type &,
452 Position<dim_>)
const {}
454 template <std::
size_t Pos>
455 void unpack_particle (size_type
id,
const state_pack_type &pack,
458 state(
id, Position<Pos>()) = std::get<Pos>(pack.data());
459 unpack_particle(
id, pack, Position<Pos + 1>());
462 void unpack_particle (size_type,
const state_pack_type &,
465 #if VSMC_HAS_CXX11_RVALUE_REFERENCES
466 template <std::
size_t Pos>
467 void unpack_particle (size_type
id, state_pack_type &&pack,
470 state(
id, Position<Pos>()) =
cxx11::move(std::get<Pos>(pack.data()));
471 unpack_particle(
id,
cxx11::move(pack), Position<Pos + 1>());
474 void unpack_particle (size_type, state_pack_type &&, Position<dim_>) {}
480 #endif // VSMC_CORE_STATE_TUPLE_HPP
const state_tuple_base_type::template state_type< Pos >::type & state(size_type id, Position< Pos >) const
const Particle< S > * particle_ptr() const
state_tuple_base_type::template state_type< Pos >::type * data()
StateTupleBase< RowMajor, T, Types...> state_tuple_base_type
Particle class representing the whole particle set.
Particle< S > * mutable_particle_ptr() const
state_tuple_base_type::state_tuple_type * data()
#define VSMC_CONSTEXPR
constexpr
state_tuple_base_type::size_type size_type
const state_tuple_base_type::template state_type< Pos >::type * data() const
static constexpr std::size_t dim()
value_type & value()
Read and write access to the value collection object.
state_pack_type(state_pack_type &&other)
void serialize(Archive &ar, const unsigned)
void state_unpack(size_type id, const state_pack_type &pack)
const state_tuple_base_type::template state_type< Pos >::type & state(size_type id) const
const state_type< Pos >::type & state(Position< Pos >) const
#define VSMC_RUNTIME_ASSERT_CORE_STATE_TUPLE_COPY_SIZE_MISMATCH
const_single_particle_type(typename Particle< S >::size_type id, const Particle< S > *particle_ptr)
state_tuple_base_type::state_pack_type state_pack_type
state_type< Pos >::type & state() const
StateTupleBase(size_type N)
std::tuple< const T *, const Types *...> state_tuple_cptr_type
void read_state(Position< Pos >, OutputIter first) const
const state_tuple_base_type::state_tuple_type * data() const
const state_tuple_base_type::template state_type< Pos >::type & state(size_type id) const
Function template argument used for position.
void copy_particle(size_type from, size_type to)
Data are stored column by column in memory.
T & get(Array< T, N > &ary)
Array ADL of get.
state_pack_type state_pack(size_type id) const
state_tuple_base_type::template state_type< Pos >::type & state(size_type id)
state_tuple_base_type::state_tuple_ptr_type data()
void copy(size_type N, const IntType *copy_from)
state_tuple_base_type::state_tuple_cptr_type data() const
void copy_particle(size_type from, size_type to)
state_tuple_base_type::template state_type< Pos >::type & state(size_type id)
Data are stored row by row in memory.
remove_reference< T >::type && move(T &&t) noexcept
std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const Sampler< T > &sampler)
A const variant to SingleParticle.
const state_tuple_type & data() const
const state_tuple_base_type::template state_type< Pos >::type * data(Position< Pos >) const
void serialize(Archive &ar, const unsigned) const
std::tuple< T, Types...> state_tuple_type
state_pack_type & operator=(const state_pack_type &other)
void state_unpack(size_type id, const state_pack_type &pack)
static constexpr std::size_t dim()
state_tuple_base_type::state_pack_type state_pack_type
std::tuple_element< Pos, state_tuple_type >::type type
state_pack_type state_pack(size_type id) const
state_tuple_base_type::template state_type< Pos >::type & state(size_type id, Position< Pos >)
const state_type< Pos >::type & state() const
state_tuple_base_type::template state_type< Pos >::type * data(Position< Pos >)
A thin wrapper over a complete Particle.
state_tuple_base_type::size_type size_type
state_tuple_type & data()
std::basic_ostream< CharT, Traits > & print(std::basic_ostream< CharT, Traits > &os, char sepchar= '\t') const
static constexpr std::size_t dim()
state_pack_type(state_tuple_type &&tp)
state_pack_type(const state_tuple_type &tp)
const Particle< S > * particle_ptr() const
void state_unpack(size_type id, state_pack_type &&pack)
void copy(size_type N, const IntType *copy_from)
state_type< Pos >::type & state(Position< Pos >) const
StateTupleBase< ColMajor, T, Types...> state_tuple_base_type
std::tuple< T *, Types *...> state_tuple_ptr_type
state_tuple_base_type::template state_type< Pos >::type & state(size_type id, Position< Pos >)
const state_tuple_base_type::template state_type< Pos >::type & state(size_type id, Position< Pos >) const
state_pack_type(const state_pack_type &other)
void read_state(OutputIter first) const
void state_unpack(size_type id, state_pack_type &&pack)
single_particle_type(typename Particle< S >::size_type id, Particle< S > *particle_ptr)