19 #ifndef TIMPI_PACKING_DECL_H 20 #define TIMPI_PACKING_DECL_H 32 #include <type_traits> 33 #include <unordered_map> 34 #include <unordered_set> 47 template <
typename T,
typename Enable>
65 template <
typename U>
static Yes &
test(U *);
69 template <
typename U>
static No &
test(
typename U::buffer_type *);
72 static constexpr
bool value =
sizeof(test<Derived>(
nullptr)) ==
sizeof(
Yes);
77 template <
typename T1,
typename T2>
80 typedef typename std::remove_const<T1>::type
cT1;
91 template <
typename T1,
typename T2>
92 class Packing<std::pair<T1, T2>,
93 typename std::enable_if<PairHasPacking<T1,T2>::value>::type>;
98 template <typename... Types>
104 static const bool value =
true;
107 template <
typename T,
typename... Types>
110 static const bool value =
119 template <
typename Enable>
120 class Packing<std::tuple<>, Enable>;
122 template <typename T, typename... Types>
123 class
Packing<std::tuple<T, Types...>,
124 typename std::enable_if<TupleHasPacking<T, Types...>::value>::type>;
128 template <typename T, std::size_t N>
129 class
Packing<std::array<T, N>,
130 typename std::enable_if<Has_buffer_type<Packing<T>>::value>::type>;
135 template <typename Container>
139 #define TIMPI_DECL_PACKING_RANGE_SUBCLASS(Container) \ 140 class Packing<Container, \ 141 typename std::enable_if<Has_buffer_type<Packing<typename Container::value_type>>::value || \ 142 TIMPI::StandardType<typename Container::value_type>::is_fixed_type>::type> 144 #define TIMPI_P_COMMA , 146 template <typename T, typename A>
149 template <typename T, typename A>
152 template <typename K, typename T, typename C, typename A>
155 template <typename K, typename T, typename C, typename A>
158 template <typename K, typename C, typename A>
161 template <typename K, typename C, typename A>
164 template <typename K, typename T, typename H, typename KE, typename A>
167 template <typename K, typename T, typename H, typename KE, typename A>
170 template <typename K, typename H, typename KE, typename A>
173 template <typename K, typename H, typename KE, typename A>
178 #define TIMPI_HAVE_STRING_PACKING 180 template <typename T>
181 class
Packing<std::basic_string<T>,
182 typename std::enable_if<TIMPI::StandardType<T>::is_fixed_type>::type>;
201 template <
typename Context,
typename buffertype,
202 typename OutputIter,
typename T>
203 inline OutputIter
unpack_range (
const typename std::vector<buffertype> & buffer,
206 const T * output_type );
216 template <
typename Context,
typename buffertype,
typename Iter>
217 inline Iter
pack_range (
const Context * context,
219 const Iter range_end,
220 typename std::vector<buffertype> & buffer,
221 std::size_t approx_buffer_size = 1000000);
227 template <
typename Context,
typename Iter>
230 const Iter range_end);
234 #endif // TIMPI_PACKING_H
Templated class to provide the appropriate MPI datatype for use with built-in C types or simple C++ c...
Define data types and (un)serialization functions for use when encoding a potentially-variable-size o...
OutputIter unpack_range(const typename std::vector< buffertype > &buffer, Context *context, OutputIter out_iter, const T *output_type)
Decode a range of potentially-variable-size objects from a data array.
static constexpr bool value
Iter pack_range(const Context *context, Iter range_begin, const Iter range_end, std::vector< buffertype > &buffer, std::size_t approx_buffer_size)
Helper function for range packing.
std::remove_const< T1 >::type cT1
TIMPI_DECL_PACKING_RANGE_SUBCLASS(std::vector< T TIMPI_P_COMMA A >)
std::size_t packed_range_size(const Context *context, Iter range_begin, const Iter range_end)
Helper function for range packing.