2014-07-23 09:03:52 -04:00
|
|
|
// Copyright (c) 2014, The Monero Project
|
|
|
|
//
|
2014-03-03 17:07:58 -05:00
|
|
|
// All rights reserved.
|
|
|
|
//
|
2014-07-23 09:03:52 -04:00
|
|
|
// Redistribution and use in source and binary forms, with or without modification, are
|
|
|
|
// permitted provided that the following conditions are met:
|
|
|
|
//
|
|
|
|
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
|
|
|
// conditions and the following disclaimer.
|
|
|
|
//
|
|
|
|
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
|
|
|
// of conditions and the following disclaimer in the documentation and/or other
|
|
|
|
// materials provided with the distribution.
|
|
|
|
//
|
|
|
|
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
|
|
|
// used to endorse or promote products derived from this software without specific
|
|
|
|
// prior written permission.
|
2014-03-03 17:07:58 -05:00
|
|
|
//
|
2014-07-23 09:03:52 -04:00
|
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
|
|
|
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
|
|
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
|
|
|
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
|
|
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
|
|
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
|
|
|
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
2014-03-03 17:07:58 -05:00
|
|
|
//
|
2014-07-23 09:03:52 -04:00
|
|
|
// Parts of this file are originally copyright (c) 2006-2013, Andrey N. Sabelnikov
|
2014-03-03 17:07:58 -05:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <boost/utility/value_init.hpp>
|
|
|
|
#include <boost/foreach.hpp>
|
|
|
|
#include "misc_log_ex.h"
|
|
|
|
#include "enableable.h"
|
|
|
|
#include "keyvalue_serialization_overloads.h"
|
2014-05-25 13:06:40 -04:00
|
|
|
#include "serialization/serialization.h"
|
|
|
|
|
2014-03-03 17:07:58 -05:00
|
|
|
namespace epee
|
|
|
|
{
|
|
|
|
/************************************************************************/
|
|
|
|
/* Serialize map declarations */
|
|
|
|
/************************************************************************/
|
|
|
|
#define BEGIN_KV_SERIALIZE_MAP() \
|
|
|
|
public: \
|
|
|
|
template<class t_storage> \
|
|
|
|
bool store( t_storage& st, typename t_storage::hsection hparent_section = nullptr) const\
|
|
|
|
{\
|
2014-05-25 13:06:40 -04:00
|
|
|
return serialize_map<true>(*this, st, hparent_section);\
|
2014-03-03 17:07:58 -05:00
|
|
|
}\
|
|
|
|
template<class t_storage> \
|
|
|
|
bool _load( t_storage& stg, typename t_storage::hsection hparent_section = nullptr)\
|
|
|
|
{\
|
2014-05-25 13:06:40 -04:00
|
|
|
return serialize_map<false>(*this, stg, hparent_section);\
|
2014-03-03 17:07:58 -05:00
|
|
|
}\
|
|
|
|
template<class t_storage> \
|
|
|
|
bool load( t_storage& stg, typename t_storage::hsection hparent_section = nullptr)\
|
|
|
|
{\
|
|
|
|
try{\
|
|
|
|
return serialize_map<false>(*this, stg, hparent_section);\
|
|
|
|
}\
|
|
|
|
catch(const std::exception& err) \
|
|
|
|
{ \
|
|
|
|
(void)(err); \
|
|
|
|
LOG_ERROR("Exception on unserializing: " << err.what());\
|
|
|
|
return false; \
|
|
|
|
}\
|
|
|
|
}\
|
|
|
|
template<bool is_store, class this_type, class t_storage> \
|
|
|
|
static bool serialize_map(this_type& this_ref, t_storage& stg, typename t_storage::hsection hparent_section) \
|
|
|
|
{
|
|
|
|
|
|
|
|
#define KV_SERIALIZE_N(varialble, val_name) \
|
|
|
|
epee::serialization::selector<is_store>::serialize(this_ref.varialble, stg, hparent_section, val_name);
|
|
|
|
|
|
|
|
#define KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N(varialble, val_name) \
|
|
|
|
epee::serialization::selector<is_store>::serialize_t_val_as_blob(this_ref.varialble, stg, hparent_section, val_name);
|
|
|
|
|
|
|
|
#define KV_SERIALIZE_VAL_POD_AS_BLOB_N(varialble, val_name) \
|
|
|
|
static_assert(std::is_pod<decltype(this_ref.varialble)>::value, "t_type must be a POD type."); \
|
|
|
|
KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N(varialble, val_name)
|
|
|
|
|
|
|
|
#define KV_SERIALIZE_CONTAINER_POD_AS_BLOB_N(varialble, val_name) \
|
|
|
|
epee::serialization::selector<is_store>::serialize_stl_container_pod_val_as_blob(this_ref.varialble, stg, hparent_section, val_name);
|
|
|
|
|
|
|
|
#define END_KV_SERIALIZE_MAP() return true;}
|
|
|
|
|
|
|
|
#define KV_SERIALIZE(varialble) KV_SERIALIZE_N(varialble, #varialble)
|
|
|
|
#define KV_SERIALIZE_VAL_POD_AS_BLOB(varialble) KV_SERIALIZE_VAL_POD_AS_BLOB_N(varialble, #varialble)
|
|
|
|
#define KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE(varialble) KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N(varialble, #varialble) //skip is_pod compile time check
|
|
|
|
#define KV_SERIALIZE_CONTAINER_POD_AS_BLOB(varialble) KV_SERIALIZE_CONTAINER_POD_AS_BLOB_N(varialble, #varialble)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|