12 #include "libmesh/elem.h" 13 #include "libmesh/mesh_base.h" 21 template <
class Cont,
class InputIt>
22 void unpackCopy(Cont & container, InputIt & input_iterator);
32 template <
typename BufferType,
typename BufferIter,
typename ValueType>
42 template <
typename BufferType,
typename BufferIter,
typename ValueType>
51 template <
typename ValueType,
typename BufferType>
57 template <
typename BufferType,
typename BufferIter,
typename... ValueTypes>
58 void mixedUnpack(BufferIter & in, ValueTypes &... values);
65 template <
typename BufferType,
typename BufferIter,
typename... ValueTypes>
66 void mixedPack(BufferIter &
out, ValueTypes
const &... values);
74 template <
typename BufferType,
typename... InputTypes>
81 template <
typename BufferType,
typename ValueType>
87 template <
typename BufferType,
typename ValueType>
88 void unpack(
const BufferType value_as_buffer_type, ValueType &
value);
94 template <
typename BufferType>
95 BufferType
pack(
const Elem * elem, MeshBase * mesh_base =
nullptr);
100 template <
typename BufferType>
101 void unpack(
const Elem *& elem,
const BufferType id_as_buffer_type, MeshBase * mesh_base);
112 template <
typename BufferType>
113 constexpr std::size_t
116 return offset ? size + 1 : size;
125 template <
typename BufferType,
typename InputType,
typename... Rest>
126 constexpr std::size_t
129 return offset +
sizeof(InputType) >
sizeof(BufferType)
137 template <
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);
159 template <
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);
179 template <
class Cont,
class InputIt>
183 auto first = container.begin();
184 while (first != container.end())
185 *first++ = *input_iterator++;
188 template <
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);
214 template <
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);
237 template <
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);
245 template <
typename BufferType,
typename BufferIter,
typename... ValueTypes>
249 std::size_t src_offset =
sizeof(BufferType);
250 const BufferType * src =
nullptr;
259 template <
typename BufferType,
typename BufferIter,
typename... ValueTypes>
261 mixedPack(BufferIter & out, ValueTypes
const &... values)
263 std::size_t dest_offset = 0;
268 out, dest, dest_offset, std::forward<ValueTypes const &>(values)),
276 template <
typename BufferType,
typename... InputTypes>
277 constexpr std::size_t
284 template <
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;
295 template <
typename BufferType,
typename ValueType>
297 unpack(
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));
303 template <
typename BufferType>
305 pack(
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);
314 template <
typename BufferType>
316 unpack(
const Elem *& elem,
const BufferType id_as_buffer_type, MeshBase * mesh_base)
319 unpack<BufferType>(id_as_buffer_type, id);
void mixedPackHelper(BufferIter &out, BufferType &dest, std::size_t &dest_offset, const ValueType &input)
Helper for 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...
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 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.
constexpr std::size_t mixedPackSizeHelper(const std::size_t offset, const std::size_t size)
Helper for mixedPackSize().
void mixedUnpack(BufferIter &in, ValueTypes &... values)
Unpacks the mixed-values from in into values that were packed with mixedPack().
void mixedUnpackHelper(BufferIter &in, const BufferType *&src, std::size_t &src_offset, ValueType &output)
Helper for mixedUnpack()
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...
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
static const dof_id_type invalid_id
void mixedPack(BufferIter &out, ValueTypes const &... values)
Packs the mixed-type values in values into out to be unpacked with mixedUnpack(). ...
class infix_ostream_iterator if void
void unpackCopy(Cont &container, InputIt &input_iterator)
Like std::copy, but passes the input iterator by reference.
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...