22 #include "MCDataContainer.hpp" 24 #include "MCBinaryData.hpp" 25 #include "MCDataStorage.hpp" 27 #include "MCTypes.hpp" 29 #include <boost/iostreams/device/back_inserter.hpp> 30 #include <boost/iostreams/stream.hpp> 32 MCDataItemBase::MCDataItemBase() : DataPtr(nullptr)
37 MCDataItemBase::~MCDataItemBase()
42 void MCDataItemBase::LoadFromArchive(boost::archive::binary_iarchive& archive)
48 void MCDataItemBase::SaveToArchive(boost::archive::binary_oarchive& archive)
const 54 void MCDataItemBase::LoadFromArchive(eos::portable_iarchive& archive)
60 void MCDataItemBase::SaveToArchive(eos::portable_oarchive& archive)
const 66 void MCDataItemBase::DeleteData()
99 for (
auto& item :
Items)
118 std::vector<char> TempBuffer;
120 boost::iostreams::stream<boost::iostreams::back_insert_device<std::vector<char> > > OutStream(TempBuffer);
124 eos::portable_oarchive OutputArchive(OutStream);
126 OutputArchive << *
this;
128 boost::archive::binary_oarchive OutputArchive(OutStream);
130 OutputArchive << *
this;
135 memcpy(BinaryData->
GetData(), &TempBuffer[0], TempBuffer.size());
143 boost::iostreams::basic_array_source<char> Source((
char*)data.
GetData(), (std::size_t)data.
GetSize());
144 boost::iostreams::stream<boost::iostreams::basic_array_source<char> > InStream(Source);
150 eos::portable_iarchive InputArchive(InStream);
152 InputArchive >> *DataContainer;
157 delete DataContainer;
158 DataContainer =
nullptr;
164 boost::archive::binary_iarchive InputArchive(InStream);
166 InputArchive >> *DataContainer;
171 delete DataContainer;
172 DataContainer =
nullptr;
177 return DataContainer;
183 printf(
"Data container: %s\n",
Name.c_str());
184 std::string DebugStr =
"Data: ";
186 for (
auto& item :
Items)
188 DebugStr += item->DataName+
", ";
190 DebugStr.erase(DebugStr.size()-2, 2);
191 printf(
"%s\n", DebugStr.c_str());
197 MC::StringList DataNames;
199 for (
auto& item :
Items)
201 DataNames.push_back(item->DataName);
210 for (
auto iter =
Items.begin(); iter !=
Items.end(); ++iter)
212 if ((*iter)->DataName == item.DataName)
214 (*iter)->DeleteData();
220 Items.push_back(&item);
226 for (
auto item :
Items)
228 if (item->DataName == data_name)
245 for (
auto iter =
Items.begin(); iter !=
Items.end(); ++iter)
247 if ((*iter)->DataName == data_name)
249 (*iter)->DeleteData();
258 const std::string& data_name)
266 template<
class Archive>
267 void MCDataContainer::load(Archive& archive,
const unsigned int version)
271 std::string ContainerID;
273 archive & ContainerID;
274 if (ContainerID !=
"DataContainer")
276 MC_WARNING(
"The archive does not contain a data container.");
285 for (
int i = 0; i < ItemCount; ++i)
287 std::string DataName;
288 std::string TypeName;
294 #define MA_DATA_ITEM_LOAD(_basic_type) \ 295 if (TypeName == std::string(#_basic_type)) \ 297 NewItem = new MCDataItem<_basic_type>(*new _basic_type, DataName, false); \ 299 #define MA_DATA_ITEM_CONTAINER_LOAD(_container, _basic_type) \ 300 if (TypeName == std::string(#_container)+'<'+#_basic_type+", std::allocator<"+#_basic_type+"> >") \ 302 NewItem = new MCDataItem<_container<_basic_type> >(*new _container<_basic_type>, DataName, false); \ 304 #define MA_DATA_ITEM_TABLE_LOAD(_container, _basic_type) \ 305 if (TypeName == std::string(#_container)+'<'+#_container+'<'+#_basic_type+", std::allocator<"+#_basic_type+"> >"+ \ 306 ", std::allocator<"+#_container+'<'+#_basic_type+", std::allocator<"+#_basic_type+"> > > >") \ 308 NewItem = new MCDataItem<_container<_container<_basic_type> > >(*new _container<_container<_basic_type> >, DataName, false); \ 310 #define MA_DATA_ITEM_MAP_CONTAINER_LOAD(_map_container, _key_type, _value_type) \ 311 if (TypeName == std::string(#_map_container)+'<'+#_key_type+", "+#_value_type+ \ 312 ", std::less<"+#_key_type+">, std::allocator<std::pair<"+#_key_type+" const, "+#_value_type+"> > >") \ 314 NewItem = new MCDataItem<_map_container<_key_type, _value_type> > \ 315 (*new _map_container<_key_type, _value_type>, DataName, false); \ 317 #define MA_DATA_ITEM_CONTAINER_LOAD_BASIC_TYPES(_container) \ 318 MA_DATA_ITEM_CONTAINER_LOAD(_container, bool) \ 319 MA_DATA_ITEM_CONTAINER_LOAD(_container, int) \ 320 MA_DATA_ITEM_CONTAINER_LOAD(_container, float) \ 321 MA_DATA_ITEM_CONTAINER_LOAD(_container, double) \ 322 MA_DATA_ITEM_CONTAINER_LOAD(_container, char) 324 #define MA_DATA_ITEM_CONTAINER_LOAD_OTHER_TYPES(_container) \ 325 MA_DATA_ITEM_CONTAINER_LOAD(_container, short) \ 326 MA_DATA_ITEM_CONTAINER_LOAD(_container, unsigned char) \ 327 MA_DATA_ITEM_CONTAINER_LOAD(_container, unsigned short) \ 328 MA_DATA_ITEM_CONTAINER_LOAD(_container, unsigned int) \ 329 MA_DATA_ITEM_CONTAINER_LOAD(_container, uint8_t) \ 330 MA_DATA_ITEM_CONTAINER_LOAD(_container, uint16_t) \ 331 MA_DATA_ITEM_CONTAINER_LOAD(_container, uint32_t) \ 332 MA_DATA_ITEM_CONTAINER_LOAD(_container, int8_t) \ 333 MA_DATA_ITEM_CONTAINER_LOAD(_container, int16_t) \ 334 MA_DATA_ITEM_CONTAINER_LOAD(_container, int32_t) 336 #define MA_DATA_ITEM_TABLE_LOAD_BASIC_TYPES(_container) \ 337 MA_DATA_ITEM_TABLE_LOAD(_container, bool) \ 338 MA_DATA_ITEM_TABLE_LOAD(_container, int) \ 339 MA_DATA_ITEM_TABLE_LOAD(_container, float) \ 340 MA_DATA_ITEM_TABLE_LOAD(_container, double) \ 341 MA_DATA_ITEM_TABLE_LOAD(_container, char) 343 #define MA_DATA_ITEM_TABLE_LOAD_OTHER_TYPES(_container) \ 344 MA_DATA_ITEM_TABLE_LOAD(_container, short) \ 345 MA_DATA_ITEM_TABLE_LOAD(_container, unsigned char) \ 346 MA_DATA_ITEM_TABLE_LOAD(_container, unsigned short) \ 347 MA_DATA_ITEM_TABLE_LOAD(_container, unsigned int) \ 348 MA_DATA_ITEM_TABLE_LOAD(_container, uint8_t) \ 349 MA_DATA_ITEM_TABLE_LOAD(_container, uint16_t) \ 350 MA_DATA_ITEM_TABLE_LOAD(_container, uint32_t) \ 351 MA_DATA_ITEM_TABLE_LOAD(_container, int8_t) \ 352 MA_DATA_ITEM_TABLE_LOAD(_container, int16_t) \ 353 MA_DATA_ITEM_TABLE_LOAD(_container, int32_t) 355 MA_DATA_ITEM_LOAD(
bool)
356 MA_DATA_ITEM_LOAD(
int)
357 MA_DATA_ITEM_LOAD(
float)
358 MA_DATA_ITEM_LOAD(
double)
359 MA_DATA_ITEM_LOAD(
char)
361 if (TypeName == MCGetClassName<std::string>() || TypeName ==
"std::string")
366 MA_DATA_ITEM_CONTAINER_LOAD_BASIC_TYPES(std::vector)
368 if (TypeName ==
"std::vector<"+MCGetClassName<std::string>()+
", std::allocator<"+MCGetClassName<std::string>()+
" > >" ||
369 TypeName ==
"std::vector<std::string, std::allocator<std::string> >")
373 MA_DATA_ITEM_TABLE_LOAD_BASIC_TYPES(std::vector)
375 if (TypeName == std::string(
"std::vector<std::vector<"+MCGetClassName<std::string>()+
", std::allocator<"+MCGetClassName<std::string>()+
" > >")+
376 ", std::allocator<std::vector<"+MCGetClassName<std::string>()+
", std::allocator<"+MCGetClassName<std::string>()+
" > > > >" ||
377 TypeName == std::string(
"std::vector<std::vector<std::string, std::allocator<std::string> >")+
378 ", std::allocator<std::vector<std::string, std::allocator<std::string> > > >")
382 MA_DATA_ITEM_MAP_CONTAINER_LOAD(std::map,
float,
float)
410 #undef MA_DATA_ITEM_LOAD 411 #undef MA_DATA_ITEM_CONTAINER_LOAD 412 #undef MA_DATA_ITEM_CONTAINER_LOAD_BASIC_TYPES 413 #undef MA_DATA_ITEM_CONTAINER_LOAD_OTHER_TYPES 414 #undef MA_DATA_ITEM_TABLE_LOAD 415 #undef MA_DATA_ITEM_TABLE_LOAD_BASIC_TYPES 416 #undef MA_DATA_ITEM_TABLE_LOAD_OTHER_TYPES 420 MC_WARNING(
"Not supported type: %s -> Abort loading", TypeName.c_str());
423 NewItem->LoadFromArchive(archive);
424 Items.push_back(NewItem);
431 template<
class Archive>
432 void MCDataContainer::save(Archive& archive,
const unsigned int version)
const 436 std::string ContainerID =
"DataContainer";
438 archive & ContainerID;
442 int ItemCount =
Items.size();
445 for (
auto& item :
Items)
447 archive & item->DataName;
448 archive & item->TypeName;
449 item->SaveToArchive(archive);
456 template void MCDataContainer::load<boost::archive::binary_iarchive>(boost::archive::binary_iarchive&,
458 template void MCDataContainer::save<boost::archive::binary_oarchive>(boost::archive::binary_oarchive&,
459 const unsigned int)
const;
460 template void MCDataContainer::load<eos::portable_iarchive>(eos::portable_iarchive&,
const unsigned int);
461 template void MCDataContainer::save<eos::portable_oarchive>(eos::portable_oarchive&,
const unsigned int)
const;
virtual ~MCDataContainer()
Class destructor.
MCDataItemBase * GetData(const std::string &data_name)
Get a data item.
A helper class to fill the type info to the base structure.
void AddData(MCDataItemBase &item)
Add a new data item.
MC::DataItemBasePtrList Items
Data items.
bool IsPortable() const
Check if the data container is portable.
void Clear()
Clear the data container by destroying all data items.
void Dump() const
Dump container items.
#define MC_WARNING(...)
Warning macro.
Data container item base structure to store basic type info.
static bool IsVerbose()
Get the verbosity of the data storage domain.
MCDataContainer(const std::string &name, bool portable=false)
Class constructor.
std::string GetName() const
Get the data container name.
#define MC_UNUSED(a)
Helper macro to avoid compiler warning about unused function parameters.
MC::StringList GetDataNames() const
Get data item names.
virtual MCDataItemBase * GetInputArchiveDataType(const std::string &type_name, const std::string &data_name)
Create a custom data type in a derived container.
static MCDataContainer * Decode(const MCBinaryData &data, bool portable=false, MCDataContainer *instance=nullptr)
Load the data container from binary form.
unsigned char * GetData() const
Get direct access to the binary data.
const MC::DataItemBasePtrList & GetAllData() const
Get all data items.
#define MC_LOG(...)
Debug macro.
std::string Name
Data container name.
MCBinaryData * Encode() const
Save the data container into binary form.
bool Portable
Data container type (portable/non-portable)
void RemoveData(const std::string &data_name)
Remove a data item.
int GetSize() const
Get binary data size.