12#include "libmesh/elem.h"
13#include "libmesh/mesh_base.h"
21template <
class Cont,
class InputIt>
22void unpackCopy(Cont & container, InputIt & input_iterator);
32template <
typename BufferType,
typename BufferIter,
typename ValueType>
42template <
typename BufferType,
typename BufferIter,
typename ValueType>
51template <
typename ValueType,
typename BufferType>
57template <
typename BufferType,
typename BufferIter,
typename... ValueTypes>
65template <
typename BufferType,
typename BufferIter,
typename... ValueTypes>
74template <
typename BufferType,
typename... InputTypes>
81template <
typename BufferType,
typename ValueType>
82BufferType
pack(
const ValueType value);
87template <
typename BufferType,
typename ValueType>
88void unpack(
const BufferType value_as_buffer_type, ValueType & value);
94template <
typename BufferType>
95BufferType
pack(
const Elem * elem, MeshBase * mesh_base =
nullptr);
100template <
typename BufferType>
101void unpack(
const Elem *& elem,
const BufferType id_as_buffer_type, MeshBase * mesh_base);
112template <
typename BufferType>
116 return offset ? size + 1 : size;
125template <
typename BufferType,
typename InputType,
typename... Rest>
129 return offset +
sizeof(InputType) >
sizeof(BufferType)
137template <
typename BufferType,
typename BufferIter,
typename ValueType>
140 const BufferType *& src,
141 std::size_t & src_offset,
144 static_assert(
sizeof(ValueType) <=
sizeof(BufferType),
"ValueType will not fit into BufferType");
146 if (src_offset +
sizeof(ValueType) >
sizeof(BufferType))
152 std::memcpy(&output, (
char *)src + src_offset,
sizeof(ValueType));
153 src_offset +=
sizeof(ValueType);
159template <
typename BufferIter,
typename BufferType,
typename ValueType>
163 std::size_t & dest_offset,
164 const ValueType & input)
166 static_assert(
sizeof(ValueType) <=
sizeof(BufferType),
"ValueType will not fit into BufferType");
168 if (dest_offset +
sizeof(ValueType) >
sizeof(BufferType))
174 std::memcpy((
char *)&dest + dest_offset, &input,
sizeof(ValueType));
175 dest_offset +=
sizeof(ValueType);
179template <
class Cont,
class InputIt>
183 auto first = container.begin();
184 while (first != container.end())
185 *first++ = *input_iterator++;
188template <
typename BufferType,
typename BufferIter,
typename ValueType>
192 static_assert(
sizeof(ValueType) <=
sizeof(BufferType),
"ValueType will not fit into BufferType");
195 const ValueType * src =
values.data();
197 std::size_t dest_offset = 0;
198 for (std::size_t i = 0; i <
values.size(); ++i)
200 if (dest_offset +
sizeof(ValueType) >
sizeof(BufferType))
206 std::memcpy((
char *)&dest + dest_offset, &src[i],
sizeof(ValueType));
207 dest_offset +=
sizeof(ValueType);
214template <
typename BufferType,
typename BufferIter,
typename ValueType>
218 static_assert(
sizeof(ValueType) <=
sizeof(BufferType),
"ValueType will not fit into BufferType");
220 ValueType * dest =
values.data();
221 const BufferType * src =
nullptr;
223 std::size_t src_offset =
sizeof(BufferType);
224 for (std::size_t i = 0; i <
values.size(); ++i)
226 if (src_offset +
sizeof(ValueType) >
sizeof(BufferType))
232 std::memcpy(&dest[i], (
char *)src + src_offset,
sizeof(ValueType));
233 src_offset +=
sizeof(ValueType);
237template <
typename ValueType,
typename BufferType>
241 const double input_per_output = std::floor(
sizeof(BufferType) /
sizeof(ValueType));
242 return (std::size_t)std::ceil((
double)input_size / input_per_output);
245template <
typename BufferType,
typename BufferIter,
typename... ValueTypes>
249 std::size_t src_offset =
sizeof(BufferType);
250 const BufferType * src =
nullptr;
259template <
typename BufferType,
typename BufferIter,
typename... ValueTypes>
261mixedPack(BufferIter & out, ValueTypes
const &... values)
263 std::size_t dest_offset = 0;
268 out, dest, dest_offset, std::forward<ValueTypes const &>(
values)),
276template <
typename BufferType,
typename... InputTypes>
284template <
typename BufferType,
typename ValueType>
288 static_assert(
sizeof(ValueType) <=
sizeof(BufferType),
"Value will won't fit into buffer type");
290 BufferType value_as_buffer_type;
291 std::memcpy(&value_as_buffer_type, &value,
sizeof(ValueType));
292 return value_as_buffer_type;
295template <
typename BufferType,
typename ValueType>
297unpack(
const BufferType value_as_buffer_type, ValueType & value)
299 static_assert(
sizeof(ValueType) <=
sizeof(BufferType),
"Value will won't fit into buffer type");
300 std::memcpy(&value, &value_as_buffer_type,
sizeof(ValueType));
303template <
typename BufferType>
305pack(
const Elem * elem, MeshBase * libmesh_dbg_var(mesh_base ))
308 mooseAssert(mesh_base ? mesh_base->query_elem_ptr(
id) == elem :
true,
309 "Elem doesn't exist in mesh");
311 return pack<BufferType>(
id);
314template <
typename BufferType>
316unpack(
const Elem *& elem,
const BufferType id_as_buffer_type, MeshBase * mesh_base)
319 unpack<BufferType>(id_as_buffer_type,
id);
std::array< Real, 2 > values
static constexpr dof_id_type invalid_id
constexpr std::size_t mixedPackSizeHelper(const std::size_t offset, const std::size_t size)
Helper for mixedPackSize().
void mixedUnpackHelper(BufferIter &in, const BufferType *&src, std::size_t &src_offset, ValueType &output)
Helper for mixedUnpack()
void mixedPackHelper(BufferIter &out, BufferType &dest, std::size_t &dest_offset, const ValueType &input)
Helper for mixedPack()
void mixedUnpack(BufferIter &in, ValueTypes &... values)
Unpacks the mixed-values from in into values that were packed with mixedPack().
BufferType pack(const ValueType value)
Packs value into a value of type BufferType at a byte level, to be unpacked with the unpack() routine...
std::size_t reinterpretCopySize(const std::size_t input_size)
Gets the minimum number of values of BufferType needed to represent input_size values of ValueType.
void mixedPack(BufferIter &out, ValueTypes const &... values)
Packs the mixed-type values in values into out to be unpacked with mixedUnpack().
void reinterpretUnpackCopy(std::vector< ValueType > &values, BufferIter &in)
Packs the data from in into the vector values.
constexpr std::size_t mixedPackSize()
Gets the number of BufferType required to store the expanded InputTypes for use with mixedPack() and ...
void reinterpretPackCopy(const std::vector< ValueType > &values, BufferIter &out)
Packs the data in values into the iterator out and minimizes memory storage in said iterator.
void unpackCopy(Cont &container, InputIt &input_iterator)
Like std::copy, but passes the input iterator by reference.
void unpack(const BufferType value_as_buffer_type, ValueType &value)
Unpacks value_as_buffer_type (which is packed with pack()) into value at a byte level.