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>
274 template<
template<
typename,
typename Enable =
void>
class S>
281 std::size_t write_offset = 0;
282 mutable std::size_t read_offset = 0;
300 std::size_t count = S<T>::size(*
this, item);
302 S<T>::to_datapack(*
this, item);
321 this->
allocate(S<T>::size(*
this, item));
322 S<T>::to_datapack(*
this, item);
342 return S<T>::size(*
this);
356 std::size_t
size(
const T& item)
const {
357 return S<T>::size(*
this, item);
388 read_offset = offset;
411 write_offset = offset;
422 S<T>::to_datapack(*
this, item);
434 T item = S<T>::from_datapack(*
this);
496 std::size_t count =
sizeof(T);
497 std::memcpy(&_data.
buffer[write_offset], &item, count);
515 void write(
const void* input_data, std::size_t count) {
516 std::memcpy(&_data.
buffer[write_offset], input_data, count);
534 std::size_t count =
sizeof(T);
535 std::memcpy(&item, &_data.
buffer[read_offset], count);
553 void read(
void* output_data, std::size_t count)
const {
554 std::memcpy(output_data, &_data.
buffer[read_offset], count);
595 return std::move(_data);
608 pack._data = std::move(data_pack);
620 pack._data = data_pack;
641 &this->_data.buffer[this->read_offset],
644 this->read_offset+=
size;
657 template<
template<
typename,
typename>
class S>
673 template<
typename PackType>
676 return sizeof(std::size_t);
685 template<
typename PackType>
688 parent.write(child._data.
size);
689 parent.expand(child._data.
size);
690 parent.write(child._data.
buffer, child._data.
size);
701 template<
typename PackType>
708 parent.read(child._data.
buffer, size);
723 struct Serializer<T, typename std::enable_if<std::is_fundamental<T>::value>::type> {
729 template<
typename PackType>
730 static std::size_t
size(
const PackType&) {
737 template<
typename PackType>
738 static std::size_t
size(
const PackType&,
const T&) {
750 template<
typename PackType>
762 template<
typename PackType>
786 template<
typename PackType>
787 static std::size_t
size(
const PackType&,
const std::string& str) {
788 return sizeof(std::size_t) + str.size();
797 template<
typename PackType>
799 pack.write(str.size());
800 pack.write(str.data(), str.size());
809 template<
typename PackType>
814 std::string str(&pack.data().buffer[pack.readOffset()], size);
815 pack.seekRead(pack.readOffset() + size);
832 template<
typename PackType>
833 static std::size_t
size(
const PackType& p,
const std::vector<T>& vec) {
834 std::size_t n = p.template size<std::size_t>();
835 for(
const T& item : vec)
836 n += p.template size(item);
849 template<
typename PackType>
850 static void to_datapack(PackType& pack,
const std::vector<T>& vec) {
851 pack.template put(vec.size());
852 for(
const T& item : vec)
853 pack.template put(item);
865 template<
typename PackType>
867 std::size_t size = pack.template get<std::size_t>();
869 for(std::size_t i = 0; i < size; i++)
870 data.emplace_back(pack.template get<T>());
891 template<
typename PackType>
892 static std::size_t
size(
const PackType& p,
const std::set<T>& set) {
893 std::size_t n = p.template size<std::size_t>();
895 n += p.template size(item);
908 template<
typename PackType>
910 pack.template put(set.size());
913 pack.template put(item);
928 template<
typename PackType>
930 std::size_t size = pack.template get<std::size_t>();
932 auto current_hint = set.end();
933 for(std::size_t i = 0; i < size; i++) {
936 set.emplace_hint(current_hint, pack.template get<T>());
938 current_hint = set.end();
957 template<
typename PackType>
958 static std::size_t
size(
const PackType& p,
const std::list<T>& list) {
959 std::size_t n = p.template size<std::size_t>();
960 for(
auto item : list)
961 n += p.template size(item);
974 template<
typename PackType>
975 static void to_datapack(PackType& pack,
const std::list<T>& list) {
976 pack.template put(list.size());
978 for(
auto item : list)
979 pack.
template put(item);
991 template<
typename PackType>
993 std::size_t size = pack.template get<std::size_t>();
995 for(std::size_t i = 0; i < size; i++) {
996 data.emplace_back(pack.template get<T>());
1009 template<
typename T>
1014 template<
typename PackType>
1015 static std::size_t
size(
const PackType& p,
const std::deque<T>& deque) {
1016 std::size_t n = p.template size<std::size_t>();
1017 for(
auto item : deque)
1018 n += p.template size(item);
1031 template<
typename PackType>
1033 pack.template put(deque.size());
1035 for(
auto item : deque)
1036 pack.template put(item);
1048 template<
typename PackType>
1050 std::size_t size = pack.template get<std::size_t>();
1051 std::deque<T> deque;
1052 for(std::size_t i = 0; i < size; i++) {
1053 deque.emplace_back(pack.template get<std::size_t>());
1069 template<
typename T1,
typename T2>
1076 template<
typename PackType>
1077 static std::size_t
size(
const PackType& p,
const std::pair<T1, T2>& pair) {
1078 return p.template size(pair.first)
1079 + p.template size(pair.second);
1091 template<
typename PackType>
1093 PackType& pack,
const std::pair<T1, T2>& pair) {
1094 pack.template put(pair.first);
1095 pack.template put(pair.second);
1107 template<
typename PackType>
1110 pack.template get<T1>(),
1111 pack.template get<T2>()
1126 template<
typename K,
typename T,
typename Comp,
typename Alloc>
1133 template<
typename PackType>
1136 const std::map<K, T, Comp, Alloc>& map) {
1137 std::size_t n = p.template size<std::size_t>();
1138 for(
auto& item : map)
1139 n += p.template size(item);
1152 template<
typename PackType>
1155 const std::map<K, T, Comp, Alloc>& map) {
1156 pack.template put(map.size());
1158 for(
auto& item : map)
1159 pack.template put(item);
1171 template<
typename PackType>
1173 const PackType& pack) {
1174 std::size_t size = pack.template get<std::size_t>();
1176 for(std::size_t i = 0; i < size; i++)
1178 map.end(), pack.template get<std::pair<K, T>>());
1193 template<
typename K,
typename T,
typename Hash,
typename KeyEq,
typename Alloc>
1194 struct Serializer<std::unordered_map<K, T, Hash, KeyEq, Alloc>> {
1200 template<
typename PackType>
1203 const std::unordered_map<K, T, Hash, KeyEq, Alloc>& map) {
1204 std::size_t n = p.template size<std::size_t>();
1205 for(
auto& item : map)
1206 n += p.template size(item);
1219 template<
typename PackType>
1222 const std::unordered_map<K, T, Hash, KeyEq, Alloc>& map) {
1223 pack.template put(map.size());
1225 for(
auto& item : map)
1226 pack.template put(item);
1238 template<
typename PackType>
1240 const PackType& pack) {
1241 std::size_t size = pack.template get<std::size_t>();
1242 std::unordered_map<K, T> map;
1243 for(std::size_t i = 0; i < size; i++)
1244 map.emplace(pack.template get<std::pair<K, T>>());
1259 template<
typename T, std::
size_t N>
1265 template<
typename PackType>
1266 static std::size_t
size(
const PackType& p,
const std::array<T, N>& array) {
1268 for(
auto item : array)
1269 n += p.template size(item);
1282 template<
typename PackType>
1283 static void to_datapack(PackType& pack,
const std::array<T, N>& array) {
1284 for(
auto item : array)
1285 pack.template put(item);
1297 template<
typename PackType>
1299 std::array<T, N> array;
1300 for(std::size_t i = 0; i < N; i++)
1301 array[i] = pack.template get<T>();
1318 template<
typename PackType>
1319 static std::size_t
size(
const PackType& p) {
1321 p.template size<int>()
1322 + p.template size<FPMAS_ID_TYPE>();
1328 template<
typename PackType>
1338 template<
typename PackType>
1340 pack.template put(
id.rank());
1341 pack.template put(
id.
id());
1349 template<
typename PackType>
1352 pack.template get<int>(), pack.template get<FPMAS_ID_TYPE>()
1381 template<
typename T,
typename Enable =
void>
1432 template<
template<
typename,
typename>
class S>
1434 o.setf(std::ios_base::hex, std::ios_base::basefield);
1435 o.setf(std::ios_base::showbase);
1436 for(std::size_t i = 0; i < pack.
data().size; i++)
1437 o << (
unsigned short) pack.
data().
buffer[i] <<
" ";
1438 o.unsetf(std::ios_base::showbase);
1439 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:275
std::size_t writeOffset() const
Definition: datapack.h:398
void seekRead(std::size_t offset=0) const
Definition: datapack.h:387
static BasicObjectPack< S > parse(DataPack &&data_pack)
Definition: datapack.h:606
std::size_t readOffset() const
Definition: datapack.h:375
BasicObjectPack< S > & operator=(const T &item)
Definition: datapack.h:320
T check() const
Definition: datapack.h:565
std::size_t size() const
Definition: datapack.h:341
void seekWrite(std::size_t offset=0)
Definition: datapack.h:410
void check(T &item) const
Definition: datapack.h:578
void write(const void *input_data, std::size_t count)
Definition: datapack.h:515
static BasicObjectPack< S > parse(const DataPack &data_pack)
Definition: datapack.h:618
DataPack dump()
Definition: datapack.h:592
void expand(std::size_t size)
Definition: datapack.h:478
void put(const T &item)
Definition: datapack.h:421
T get() const
Definition: datapack.h:433
void read(T &item) const
Definition: datapack.h:533
std::size_t size(const T &item) const
Definition: datapack.h:356
void read(void *output_data, std::size_t count) const
Definition: datapack.h:553
BasicObjectPack(const T &item)
Definition: datapack.h:299
void allocate(std::size_t size)
Definition: datapack.h:444
BasicObjectPack< S > extract(std::size_t size) const
Definition: datapack.h:636
const DataPack & data() const
Definition: datapack.h:364
void write(const T &item)
Definition: datapack.h:495
std::ostream & operator<<(std::ostream &o, const BasicObjectPack< S > &pack)
Definition: datapack.h:1433
BasicObjectPack< LightSerializer > LightObjectPack
Definition: datapack.h:1366
BasicObjectPack< Serializer > ObjectPack
Definition: datapack.h:1364
Definition: datapack.h:1382
static void to_datapack(LightObjectPack &pack, const T &item)
Definition: datapack.h:1409
static std::size_t size(const LightObjectPack &p, const T &item)
Definition: datapack.h:1398
static std::size_t size(const LightObjectPack &p)
Definition: datapack.h:1389
static T from_datapack(const LightObjectPack &pack)
Definition: datapack.h:1422
static void to_datapack(PackType &parent, const BasicObjectPack< S > &child)
Definition: datapack.h:686
static std::size_t size(const PackType &, const BasicObjectPack< S > &)
Definition: datapack.h:674
static BasicObjectPack< S > from_datapack(const PackType &parent)
Definition: datapack.h:702
static DistributedId from_datapack(const PackType &pack)
Definition: datapack.h:1350
static std::size_t size(const PackType &p)
Definition: datapack.h:1319
static void to_datapack(PackType &pack, const DistributedId &id)
Definition: datapack.h:1339
static std::size_t size(const PackType &p, const DistributedId &)
Definition: datapack.h:1329
static T from_datapack(const PackType &pack)
Definition: datapack.h:763
static std::size_t size(const PackType &, const T &)
Definition: datapack.h:738
static std::size_t size(const PackType &)
Definition: datapack.h:730
static void to_datapack(PackType &pack, const T &item)
Definition: datapack.h:751
static std::array< T, N > from_datapack(const PackType &pack)
Definition: datapack.h:1298
static std::size_t size(const PackType &p, const std::array< T, N > &array)
Definition: datapack.h:1266
static void to_datapack(PackType &pack, const std::array< T, N > &array)
Definition: datapack.h:1283
static std::size_t size(const PackType &p, const std::deque< T > &deque)
Definition: datapack.h:1015
static void to_datapack(PackType &pack, const std::deque< T > &deque)
Definition: datapack.h:1032
static std::deque< T > from_datapack(const PackType &pack)
Definition: datapack.h:1049
static std::size_t size(const PackType &p, const std::list< T > &list)
Definition: datapack.h:958
static void to_datapack(PackType &pack, const std::list< T > &list)
Definition: datapack.h:975
static std::list< T > from_datapack(const PackType &pack)
Definition: datapack.h:992
static void to_datapack(PackType &pack, const std::map< K, T, Comp, Alloc > &map)
Definition: datapack.h:1153
static std::map< K, T, Comp, Alloc > from_datapack(const PackType &pack)
Definition: datapack.h:1172
static std::size_t size(const PackType &p, const std::map< K, T, Comp, Alloc > &map)
Definition: datapack.h:1134
static std::size_t size(const PackType &p, const std::pair< T1, T2 > &pair)
Definition: datapack.h:1077
static std::pair< T1, T2 > from_datapack(const PackType &pack)
Definition: datapack.h:1108
static void to_datapack(PackType &pack, const std::pair< T1, T2 > &pair)
Definition: datapack.h:1092
static std::size_t size(const PackType &p, const std::set< T > &set)
Definition: datapack.h:892
static void to_datapack(PackType &pack, const std::set< T > &set)
Definition: datapack.h:909
static std::set< T > from_datapack(const PackType &pack)
Definition: datapack.h:929
Definition: datapack.h:777
static void to_datapack(PackType &pack, const std::string &str)
Definition: datapack.h:798
static std::size_t size(const PackType &, const std::string &str)
Definition: datapack.h:787
static std::string from_datapack(const PackType &pack)
Definition: datapack.h:810
static std::size_t size(const PackType &p, const std::unordered_map< K, T, Hash, KeyEq, Alloc > &map)
Definition: datapack.h:1201
static void to_datapack(PackType &pack, const std::unordered_map< K, T, Hash, KeyEq, Alloc > &map)
Definition: datapack.h:1220
static std::unordered_map< K, T, Hash, KeyEq, Alloc > from_datapack(const PackType &pack)
Definition: datapack.h:1239
static std::vector< T > from_datapack(const PackType &pack)
Definition: datapack.h:866
static std::size_t size(const PackType &p, const std::vector< T > &vec)
Definition: datapack.h:833
static void to_datapack(PackType &pack, const std::vector< T > &vec)
Definition: datapack.h:850
Definition: datapack.h:55