1#ifndef FPMAS_IO_DATAPACK_H
2#define FPMAS_IO_DATAPACK_H
14#include "../api/utils/ptr_wrapper.h"
16namespace fpmas {
namespace io {
namespace datapack {
18 using api::utils::PtrWrapper;
54 template<
typename T,
typename Enable =
void>
300 template<
template<
typename,
typename Enable =
void>
class S>
307 std::size_t write_offset = 0;
308 mutable std::size_t read_offset = 0;
326 std::size_t count = S<T>::size(*
this, item);
328 S<T>::to_datapack(*
this, item);
347 this->
allocate(S<T>::size(*
this, item));
348 S<T>::to_datapack(*
this, item);
368 return S<T>::size(*
this);
382 std::size_t
size(
const T& item)
const {
383 return S<T>::size(*
this, item);
414 read_offset = offset;
437 write_offset = offset;
448 S<T>::to_datapack(*
this, item);
460 T item = S<T>::from_datapack(*
this);
522 std::size_t count =
sizeof(T);
523 std::memcpy(&_data.
buffer[write_offset], &item, count);
541 void write(
const void* input_data, std::size_t count) {
542 std::memcpy(&_data.
buffer[write_offset], input_data, count);
560 std::size_t count =
sizeof(T);
561 std::memcpy(&item, &_data.
buffer[read_offset], count);
579 void read(
void* output_data, std::size_t count)
const {
580 std::memcpy(output_data, &_data.
buffer[read_offset], count);
621 return std::move(_data);
634 pack._data = std::move(data_pack);
646 pack._data = data_pack;
667 &this->_data.buffer[this->read_offset],
670 this->read_offset+=
size;
683 template<
template<
typename,
typename>
class S>
699 template<
typename PackType>
702 return sizeof(std::size_t);
711 template<
typename PackType>
714 parent.write(child._data.
size);
715 parent.expand(child._data.
size);
716 parent.write(child._data.
buffer, child._data.
size);
727 template<
typename PackType>
734 parent.read(child._data.
buffer, size);
749 struct Serializer<T, typename std::enable_if<std::is_fundamental<T>::value>::type> {
755 template<
typename PackType>
756 static std::size_t
size(
const PackType&) {
763 template<
typename PackType>
764 static std::size_t
size(
const PackType&,
const T&) {
776 template<
typename PackType>
788 template<
typename PackType>
812 template<
typename PackType>
813 static std::size_t
size(
const PackType&,
const std::string& str) {
814 return sizeof(std::size_t) + str.size();
823 template<
typename PackType>
825 pack.write(str.size());
826 pack.write(str.data(), str.size());
835 template<
typename PackType>
840 std::string str(&pack.data().buffer[pack.readOffset()], size);
841 pack.seekRead(pack.readOffset() + size);
858 template<
typename PackType>
859 static std::size_t
size(
const PackType& p,
const std::vector<T>& vec) {
860 std::size_t n = p.template size<std::size_t>();
861 for(
const T& item : vec)
862 n += p.template size(item);
875 template<
typename PackType>
876 static void to_datapack(PackType& pack,
const std::vector<T>& vec) {
877 pack.template put(vec.size());
878 for(
const T& item : vec)
879 pack.template put(item);
891 template<
typename PackType>
893 std::size_t size = pack.template get<std::size_t>();
896 for(std::size_t i = 0; i < size; i++)
897 data.emplace_back(pack.template get<T>());
918 template<
typename PackType>
919 static std::size_t
size(
const PackType& p,
const std::set<T>& set) {
920 std::size_t n = p.template size<std::size_t>();
921 for(
const T& item : set)
922 n += p.template size(item);
935 template<
typename PackType>
937 pack.template put(set.size());
939 for(
const T& item : set)
940 pack.template put(item);
955 template<
typename PackType>
957 std::size_t size = pack.template get<std::size_t>();
959 auto current_hint = set.end();
960 for(std::size_t i = 0; i < size; i++) {
963 set.emplace_hint(current_hint, pack.template get<T>());
965 current_hint = set.end();
984 template<
typename PackType>
985 static std::size_t
size(
const PackType& p,
const std::list<T>& list) {
986 std::size_t n = p.template size<std::size_t>();
987 for(
const T& item : list)
988 n += p.template size(item);
1001 template<
typename PackType>
1003 pack.template put(list.size());
1005 for(
const T& item : list)
1006 pack.
template put(item);
1018 template<
typename PackType>
1020 std::size_t size = pack.template get<std::size_t>();
1022 for(std::size_t i = 0; i < size; i++) {
1023 data.emplace_back(pack.template get<T>());
1036 template<
typename T>
1041 template<
typename PackType>
1042 static std::size_t
size(
const PackType& p,
const std::deque<T>& deque) {
1043 std::size_t n = p.template size<std::size_t>();
1044 for(
auto item : deque)
1045 n += p.template size(item);
1058 template<
typename PackType>
1060 pack.template put(deque.size());
1062 for(
const T& item : deque)
1063 pack.template put(item);
1075 template<
typename PackType>
1077 std::size_t size = pack.template get<std::size_t>();
1078 std::deque<T> deque;
1079 for(std::size_t i = 0; i < size; i++) {
1080 deque.emplace_back(pack.template get<T>());
1096 template<
typename T1,
typename T2>
1103 template<
typename PackType>
1104 static std::size_t
size(
const PackType& p,
const std::pair<T1, T2>& pair) {
1105 return p.template size(pair.first)
1106 + p.template size(pair.second);
1118 template<
typename PackType>
1120 PackType& pack,
const std::pair<T1, T2>& pair) {
1121 pack.template put(pair.first);
1122 pack.template put(pair.second);
1134 template<
typename PackType>
1137 T1 first = pack.template get<T1>();
1138 T2 second = pack.template get<T2>();
1139 return {std::move(first), std::move(second)};
1153 template<
typename K,
typename T,
typename Comp,
typename Alloc>
1160 template<
typename PackType>
1163 const std::map<K, T, Comp, Alloc>& map) {
1164 std::size_t n = p.template size<std::size_t>();
1165 for(
const auto& item : map)
1166 n += p.template size(item);
1179 template<
typename PackType>
1182 const std::map<K, T, Comp, Alloc>& map) {
1183 pack.template put(map.size());
1185 for(
const auto& item : map)
1186 pack.template put(item);
1198 template<
typename PackType>
1200 const PackType& pack) {
1201 std::size_t size = pack.template get<std::size_t>();
1203 for(std::size_t i = 0; i < size; i++)
1205 map.end(), pack.template get<std::pair<K, T>>());
1220 template<
typename K,
typename T,
typename Hash,
typename KeyEq,
typename Alloc>
1221 struct Serializer<std::unordered_map<K, T, Hash, KeyEq, Alloc>> {
1227 template<
typename PackType>
1230 const std::unordered_map<K, T, Hash, KeyEq, Alloc>& map) {
1231 std::size_t n = p.template size<std::size_t>();
1232 for(
const auto& item : map)
1233 n += p.template size(item);
1246 template<
typename PackType>
1249 const std::unordered_map<K, T, Hash, KeyEq, Alloc>& map) {
1250 pack.template put(map.size());
1252 for(
const auto& item : map)
1253 pack.template put(item);
1265 template<
typename PackType>
1267 const PackType& pack) {
1268 std::size_t size = pack.template get<std::size_t>();
1269 std::unordered_map<K, T> map;
1271 for(std::size_t i = 0; i < size; i++)
1272 map.emplace(pack.template get<std::pair<K, T>>());
1287 template<
typename T, std::
size_t N>
1293 template<
typename PackType>
1294 static std::size_t
size(
const PackType& p,
const std::array<T, N>& array) {
1296 for(
const T& item : array)
1297 n += p.template size(item);
1310 template<
typename PackType>
1311 static void to_datapack(PackType& pack,
const std::array<T, N>& array) {
1312 for(
const T& item : array)
1313 pack.template put(item);
1325 template<
typename PackType>
1327 std::array<T, N> array;
1328 for(std::size_t i = 0; i < N; i++)
1329 array[i] = pack.template get<T>();
1346 template<
typename PackType>
1347 static std::size_t
size(
const PackType& p) {
1349 p.template size<int>()
1350 + p.template size<FPMAS_ID_TYPE>();
1356 template<
typename PackType>
1366 template<
typename PackType>
1368 pack.template put(
id.rank());
1369 pack.template put(
id.
id());
1377 template<
typename PackType>
1380 int p = pack.template get<int>();
1410 template<
typename T,
typename Enable =
void>
1461 template<
template<
typename,
typename>
class S>
1463 o.setf(std::ios_base::hex, std::ios_base::basefield);
1464 o.setf(std::ios_base::showbase);
1465 for(std::size_t i = 0; i < pack.
data().size; i++)
1466 o << (
unsigned short) pack.
data().
buffer[i] <<
" ";
1467 o.unsetf(std::ios_base::showbase);
1468 o.unsetf(std::ios_base::hex);
Definition: communication.h:16
std::size_t size
Definition: communication.h:23
char * buffer
Definition: communication.h:36
void resize(std::size_t count)
Definition: communication.h:130
Definition: distributed_id.h:89
Definition: datapack.h:301
std::size_t writeOffset() const
Definition: datapack.h:424
void seekRead(std::size_t offset=0) const
Definition: datapack.h:413
static BasicObjectPack< S > parse(DataPack &&data_pack)
Definition: datapack.h:632
std::size_t readOffset() const
Definition: datapack.h:401
BasicObjectPack< S > & operator=(const T &item)
Definition: datapack.h:346
T check() const
Definition: datapack.h:591
std::size_t size() const
Definition: datapack.h:367
void seekWrite(std::size_t offset=0)
Definition: datapack.h:436
void check(T &item) const
Definition: datapack.h:604
void write(const void *input_data, std::size_t count)
Definition: datapack.h:541
static BasicObjectPack< S > parse(const DataPack &data_pack)
Definition: datapack.h:644
DataPack dump()
Definition: datapack.h:618
void expand(std::size_t size)
Definition: datapack.h:504
void put(const T &item)
Definition: datapack.h:447
T get() const
Definition: datapack.h:459
void read(T &item) const
Definition: datapack.h:559
std::size_t size(const T &item) const
Definition: datapack.h:382
void read(void *output_data, std::size_t count) const
Definition: datapack.h:579
BasicObjectPack(const T &item)
Definition: datapack.h:325
void allocate(std::size_t size)
Definition: datapack.h:470
BasicObjectPack< S > extract(std::size_t size) const
Definition: datapack.h:662
const DataPack & data() const
Definition: datapack.h:390
void write(const T &item)
Definition: datapack.h:521
#define FPMAS_ID_TYPE
Definition: distributed_id.h:32
std::ostream & operator<<(std::ostream &o, const BasicObjectPack< S > &pack)
Definition: datapack.h:1462
BasicObjectPack< LightSerializer > LightObjectPack
Definition: datapack.h:1395
BasicObjectPack< Serializer > ObjectPack
Definition: datapack.h:1393
Definition: datapack.h:1411
static void to_datapack(LightObjectPack &pack, const T &item)
Definition: datapack.h:1438
static std::size_t size(const LightObjectPack &p, const T &item)
Definition: datapack.h:1427
static std::size_t size(const LightObjectPack &p)
Definition: datapack.h:1418
static T from_datapack(const LightObjectPack &pack)
Definition: datapack.h:1451
static void to_datapack(PackType &parent, const BasicObjectPack< S > &child)
Definition: datapack.h:712
static std::size_t size(const PackType &, const BasicObjectPack< S > &)
Definition: datapack.h:700
static BasicObjectPack< S > from_datapack(const PackType &parent)
Definition: datapack.h:728
static DistributedId from_datapack(const PackType &pack)
Definition: datapack.h:1378
static std::size_t size(const PackType &p)
Definition: datapack.h:1347
static void to_datapack(PackType &pack, const DistributedId &id)
Definition: datapack.h:1367
static std::size_t size(const PackType &p, const DistributedId &)
Definition: datapack.h:1357
static T from_datapack(const PackType &pack)
Definition: datapack.h:789
static std::size_t size(const PackType &, const T &)
Definition: datapack.h:764
static std::size_t size(const PackType &)
Definition: datapack.h:756
static void to_datapack(PackType &pack, const T &item)
Definition: datapack.h:777
static std::array< T, N > from_datapack(const PackType &pack)
Definition: datapack.h:1326
static std::size_t size(const PackType &p, const std::array< T, N > &array)
Definition: datapack.h:1294
static void to_datapack(PackType &pack, const std::array< T, N > &array)
Definition: datapack.h:1311
static std::size_t size(const PackType &p, const std::deque< T > &deque)
Definition: datapack.h:1042
static void to_datapack(PackType &pack, const std::deque< T > &deque)
Definition: datapack.h:1059
static std::deque< T > from_datapack(const PackType &pack)
Definition: datapack.h:1076
static std::size_t size(const PackType &p, const std::list< T > &list)
Definition: datapack.h:985
static void to_datapack(PackType &pack, const std::list< T > &list)
Definition: datapack.h:1002
static std::list< T > from_datapack(const PackType &pack)
Definition: datapack.h:1019
static void to_datapack(PackType &pack, const std::map< K, T, Comp, Alloc > &map)
Definition: datapack.h:1180
static std::map< K, T, Comp, Alloc > from_datapack(const PackType &pack)
Definition: datapack.h:1199
static std::size_t size(const PackType &p, const std::map< K, T, Comp, Alloc > &map)
Definition: datapack.h:1161
static std::size_t size(const PackType &p, const std::pair< T1, T2 > &pair)
Definition: datapack.h:1104
static std::pair< T1, T2 > from_datapack(const PackType &pack)
Definition: datapack.h:1135
static void to_datapack(PackType &pack, const std::pair< T1, T2 > &pair)
Definition: datapack.h:1119
static std::size_t size(const PackType &p, const std::set< T > &set)
Definition: datapack.h:919
static void to_datapack(PackType &pack, const std::set< T > &set)
Definition: datapack.h:936
static std::set< T > from_datapack(const PackType &pack)
Definition: datapack.h:956
Definition: datapack.h:803
static void to_datapack(PackType &pack, const std::string &str)
Definition: datapack.h:824
static std::size_t size(const PackType &, const std::string &str)
Definition: datapack.h:813
static std::string from_datapack(const PackType &pack)
Definition: datapack.h:836
static std::size_t size(const PackType &p, const std::unordered_map< K, T, Hash, KeyEq, Alloc > &map)
Definition: datapack.h:1228
static void to_datapack(PackType &pack, const std::unordered_map< K, T, Hash, KeyEq, Alloc > &map)
Definition: datapack.h:1247
static std::unordered_map< K, T, Hash, KeyEq, Alloc > from_datapack(const PackType &pack)
Definition: datapack.h:1266
static std::vector< T > from_datapack(const PackType &pack)
Definition: datapack.h:892
static std::size_t size(const PackType &p, const std::vector< T > &vec)
Definition: datapack.h:859
static void to_datapack(PackType &pack, const std::vector< T > &vec)
Definition: datapack.h:876
Definition: datapack.h:55