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