#pragma once #include #include #include #include #include #include #include #include #include #include namespace fc { namespace bip = boost::interprocess; template void to_variant( const bip::deque< T... >& t, fc::variant& v ) { std::vector vars(t.size()); for( size_t i = 0; i < t.size(); ++i ) { vars[i] = t[i]; } v = std::move(vars); } template void from_variant( const fc::variant& v, bip::deque< T, A... >& d ) { const variants& vars = v.get_array(); d.clear(); d.resize( vars.size() ); for( uint32_t i = 0; i < vars.size(); ++i ) { from_variant( vars[i], d[i] ); } } //bip::map == boost::map template void to_variant( const bip::map< K, V, T... >& var, fc::variant& vo ) { std::vector< variant > vars(var.size()); size_t i = 0; for( auto itr = var.begin(); itr != var.end(); ++itr, ++i ) vars[i] = fc::variant(*itr); vo = vars; } /* template void from_variant( const variant& var, bip::map& vo ) { const variants& vars = var.get_array(); vo.clear(); for( auto itr = vars.begin(); itr != vars.end(); ++itr ) vo.insert( itr->as< std::pair >() ); Not safe for interprocess. Needs allocator } */ template void to_variant( const bip::vector< T... >& t, fc::variant& v ) { std::vector vars(t.size()); for( size_t i = 0; i < t.size(); ++i ) { vars[i] = t[i]; } v = std::move(vars); } template void from_variant( const fc::variant& v, bip::vector< T, A... >& d ) { const variants& vars = v.get_array(); d.clear(); d.resize( vars.size() ); for( uint32_t i = 0; i < vars.size(); ++i ) { from_variant( vars[i], d[i] ); } } template void to_variant( const bip::set< T... >& t, fc::variant& v ) { std::vector vars; vars.reserve(t.size()); for( const auto& item : t ) { vars.emplace_back( item ); } v = std::move(vars); } /* template void from_variant( const fc::variant& v, bip::set< T, A... >& d ) { const variants& vars = v.get_array(); d.clear(); d.reserve( vars.size() ); for( uint32_t i = 0; i < vars.size(); ++i ) { from_variant( vars[i], d[i] ); Not safe for interprocess. Needs allocator } } */ template void to_variant( const bip::vector& t, fc::variant& v ) { if( t.size() ) v = variant(fc::to_hex(t.data(), t.size())); else v = ""; } template void from_variant( const fc::variant& v, bip::vector& d ) { auto str = v.as_string(); d.resize( str.size() / 2 ); if( d.size() ) { size_t r = fc::from_hex( str, d.data(), d.size() ); FC_ASSERT( r == d.size() ); } // std::string b64 = base64_decode( var.as_string() ); // vo = std::vector( b64.c_str(), b64.c_str() + b64.size() ); } namespace raw { namespace bip = boost::interprocess; template inline void pack( Stream& s, const bip::vector& value ) { pack( s, unsigned_int((uint32_t)value.size()) ); auto itr = value.begin(); auto end = value.end(); while( itr != end ) { fc::raw::pack( s, *itr ); ++itr; } } template inline void unpack( Stream& s, bip::vector& value ) { unsigned_int size; unpack( s, size ); value.clear(); value.resize(size); for( auto& item : value ) fc::raw::unpack( s, item ); } } }