forked from lthn/blockchain
Implemented kv-serialization for boost optional, implemented serialization as hed for POD
This commit is contained in:
parent
e9c3c7841f
commit
03480488a1
4 changed files with 89 additions and 3 deletions
|
|
@ -0,0 +1,55 @@
|
|||
// Copyright (c) 2006-2022, Andrey N. Sabelnikov, www.sabelnikov.net
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * 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.
|
||||
// * Neither the name of the Andrey N. Sabelnikov nor the
|
||||
// names of its contributors may be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// 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 OWNER 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.
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
|
||||
//should be done in global namespace
|
||||
#define KV_ENABLE_POD_SERIALIZATION_AS_HEX(type_name) \
|
||||
namespace epee \
|
||||
{ \
|
||||
namespace serialization \
|
||||
{ \
|
||||
template<class t_storage> \
|
||||
bool kv_serialize(const type_name& d, t_storage& stg, typename t_storage::hsection hparent_section, const char* pname) \
|
||||
{ \
|
||||
std::string s = epee::transform_t_pod_to_str(d); \
|
||||
return kv_serialize(s, stg, hparent_section, pname); \
|
||||
} \
|
||||
template<class t_storage> \
|
||||
bool kv_unserialize(type_name& d, t_storage& stg, typename t_storage::hsection hparent_section, const char* pname) \
|
||||
{ \
|
||||
std::string s; \
|
||||
bool r = kv_unserialize(s, stg, hparent_section, pname); \
|
||||
if (r) \
|
||||
{ \
|
||||
d = epee::transform_str_to_t_pod<decltype(d)>(s); \
|
||||
} \
|
||||
return r; \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
|
@ -429,6 +429,31 @@ namespace epee
|
|||
bool kv_unserialize(std::deque<t_type>& d, t_storage& stg, typename t_storage::hsection hparent_section, const char* pname)
|
||||
{
|
||||
return kv_serialization_overloads_impl_is_base_serializable_types<boost::mpl::contains<base_serializable_types<t_storage>, typename std::remove_const<t_type>::type>::value>::kv_unserialize(d, stg, hparent_section, pname);
|
||||
}
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
//boost::optional
|
||||
template<class t_type, class t_storage>
|
||||
bool kv_serialize(const boost::optional<t_type>& d, t_storage& stg, typename t_storage::hsection hparent_section, const char* pname)
|
||||
{
|
||||
if(d != boost::none)
|
||||
{
|
||||
return kv_serialize(*d, stg, hparent_section, pname);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
template<class t_type, class t_storage>
|
||||
bool kv_unserialize(boost::optional<t_type>& d, t_storage& stg, typename t_storage::hsection hparent_section, const char* pname)
|
||||
{
|
||||
d = t_type();
|
||||
bool r = kv_unserialize(*d, stg, hparent_section, pname);
|
||||
if (!r)
|
||||
{
|
||||
d = boost::none;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -20,7 +20,7 @@
|
|||
#include "crypto/range_proofs.h"
|
||||
#include "crypto/clsag.h"
|
||||
#include "boost_serialization_maps.h"
|
||||
|
||||
#include "serialization/keyvalue_enable_POD_serialize_as_string.h"
|
||||
//
|
||||
// binary serialization
|
||||
//
|
||||
|
|
@ -114,6 +114,12 @@ VARIANT_TAG(debug_archive, crypto::key_image, "key_image");
|
|||
VARIANT_TAG(debug_archive, crypto::signature, "signature");
|
||||
|
||||
|
||||
//
|
||||
// Key-value serialization
|
||||
//
|
||||
|
||||
KV_ENABLE_POD_SERIALIZATION_AS_HEX(crypto::scalar_t);
|
||||
|
||||
//
|
||||
// Boost serialization
|
||||
//
|
||||
|
|
|
|||
|
|
@ -400,7 +400,7 @@ namespace tools
|
|||
KV_SERIALIZE(m_spent_height)
|
||||
KV_SERIALIZE(m_flags)
|
||||
KV_SERIALIZE(m_amount)
|
||||
//KV_SERIALIZE_N(m_opt_blinding_mask, blinding_mask)
|
||||
KV_SERIALIZE_N(m_opt_blinding_mask, "blinding_mask")
|
||||
KV_SERIALIZE_EPHEMERAL_N(uint64_t, tools::wallet2::transfer_details_base_to_amount, "amount")
|
||||
KV_SERIALIZE_EPHEMERAL_N(std::string, tools::wallet2::transfer_details_base_to_tx_hash, "tx_id")
|
||||
END_KV_SERIALIZE_MAP()
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue