Skip to content

Commit

Permalink
Merge pull request #22 from abitmore/fix-class-serialization
Browse files Browse the repository at this point in the history
Fix class serialization
  • Loading branch information
abitmore authored Mar 18, 2018
2 parents 3286935 + d9ac269 commit efa4a50
Show file tree
Hide file tree
Showing 8 changed files with 81 additions and 16 deletions.
1 change: 1 addition & 0 deletions include/fc/crypto/aes.hpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#pragma once
#include <fc/io/raw_fwd.hpp>
#include <fc/crypto/sha512.hpp>
#include <fc/crypto/sha256.hpp>
#include <fc/uint128.hpp>
Expand Down
14 changes: 14 additions & 0 deletions include/fc/crypto/ripemd160.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,20 @@ class ripemd160
uint32_t _hash[5];
};

namespace raw {

template<typename T>
inline void pack( T& ds, const ripemd160& ep, uint32_t _max_depth ) {
ds << ep;
}

template<typename T>
inline void unpack( T& ds, ripemd160& ep, uint32_t _max_depth ) {
ds >> ep;
}

}

class variant;
void to_variant( const ripemd160& bi, variant& v );
void from_variant( const variant& v, ripemd160& bi );
Expand Down
14 changes: 14 additions & 0 deletions include/fc/crypto/sha224.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,20 @@ class sha224
uint32_t _hash[7];
};

namespace raw {

template<typename T>
inline void pack( T& ds, const sha224& ep, uint32_t _max_depth ) {
ds << ep;
}

template<typename T>
inline void unpack( T& ds, sha224& ep, uint32_t _max_depth ) {
ds >> ep;
}

}

class variant;
void to_variant( const sha224& bi, variant& v );
void from_variant( const variant& v, sha224& bi );
Expand Down
14 changes: 14 additions & 0 deletions include/fc/crypto/sha256.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,20 @@ class sha256
uint64_t _hash[4];
};

namespace raw {

template<typename T>
inline void pack( T& ds, const sha256& ep, uint32_t _max_depth ) {
ds << ep;
}

template<typename T>
inline void unpack( T& ds, sha256& ep, uint32_t _max_depth ) {
ds >> ep;
}

}

typedef sha256 uint256;

class variant;
Expand Down
14 changes: 14 additions & 0 deletions include/fc/crypto/sha512.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,20 @@ class sha512
uint64_t _hash[8];
};

namespace raw {

template<typename T>
inline void pack( T& ds, const sha512& ep, uint32_t _max_depth ) {
ds << ep;
}

template<typename T>
inline void unpack( T& ds, sha512& ep, uint32_t _max_depth ) {
ds >> ep;
}

}

typedef fc::sha512 uint512;

class variant;
Expand Down
9 changes: 3 additions & 6 deletions include/fc/io/raw.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -351,13 +351,10 @@ namespace fc {
const uint32_t max_depth;
};

// Default pack/unpack functions for classes (if_class<fc::true_type>) are removed due to recursion issue.
// Classes should implement pack/unpack functions explicitly.
template<typename IsClass=fc::true_type>
struct if_class{
template<typename Stream, typename T>
static inline void pack( Stream& s, const T& v, uint32_t _max_depth ) { s << v; }
template<typename Stream, typename T>
static inline void unpack( Stream& s, T& v, uint32_t _max_depth ) { s >> v; }
};
struct if_class;

template<>
struct if_class<fc::false_type> {
Expand Down
14 changes: 14 additions & 0 deletions include/fc/io/raw_fwd.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ namespace fc {
class path;
template<typename... Types> class static_variant;

class sha224;
class sha256;
class sha512;
class ripemd160;

template<typename IntType, typename EnumType> class enum_type;
namespace ip { class endpoint; }

Expand Down Expand Up @@ -96,6 +101,15 @@ namespace fc {
template<typename Stream> void unpack( Stream& s, fc::ecc::private_key&, uint32_t _max_depth=FC_PACK_MAX_DEPTH );
template<typename Stream> void pack( Stream& s, const fc::ecc::private_key&, uint32_t _max_depth=FC_PACK_MAX_DEPTH );

template<typename Stream> inline void unpack( Stream& s, fc::sha224&, uint32_t _max_depth=FC_PACK_MAX_DEPTH );
template<typename Stream> inline void pack( Stream& s, const fc::sha224&, uint32_t _max_depth=FC_PACK_MAX_DEPTH );
template<typename Stream> inline void unpack( Stream& s, fc::sha256&, uint32_t _max_depth=FC_PACK_MAX_DEPTH );
template<typename Stream> inline void pack( Stream& s, const fc::sha256&, uint32_t _max_depth=FC_PACK_MAX_DEPTH );
template<typename Stream> inline void unpack( Stream& s, fc::sha512&, uint32_t _max_depth=FC_PACK_MAX_DEPTH );
template<typename Stream> inline void pack( Stream& s, const fc::sha512&, uint32_t _max_depth=FC_PACK_MAX_DEPTH );
template<typename Stream> inline void unpack( Stream& s, fc::ripemd160&, uint32_t _max_depth=FC_PACK_MAX_DEPTH );
template<typename Stream> inline void pack( Stream& s, const fc::ripemd160&, uint32_t _max_depth=FC_PACK_MAX_DEPTH );

template<typename Stream, typename T> inline void pack( Stream& s, const T& v, uint32_t _max_depth=FC_PACK_MAX_DEPTH );
template<typename Stream, typename T> inline void unpack( Stream& s, T& v, uint32_t _max_depth=FC_PACK_MAX_DEPTH );

Expand Down
17 changes: 7 additions & 10 deletions tests/serialization_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,20 @@
namespace fc { namespace test {

struct item;
inline bool operator < ( const item& a, const item& b );
inline bool operator == ( const item& a, const item& b );
inline bool operator < ( const item& a, const item& b );

struct item_wrapper
{
item_wrapper() {}
item_wrapper(item&& it) { v.reserve(1); v.insert( it ); }
boost::container::flat_set<struct item> v;
};
inline bool operator < ( const item_wrapper& a, const item_wrapper& b );
inline bool operator == ( const item_wrapper& a, const item_wrapper& b );

inline bool operator == ( const item_wrapper& a, const item_wrapper& b )
{ return ( std::tie( a.v ) == std::tie( b.v ) ); }
inline bool operator < ( const item_wrapper& a, const item_wrapper& b )
{ return ( std::tie( a.v ) < std::tie( b.v ) ); }

struct item
{
Expand All @@ -29,17 +32,11 @@ namespace fc { namespace test {

inline bool operator == ( const item& a, const item& b )
{ return ( std::tie( a.level, a.w ) == std::tie( b.level, b.w ) ); }

inline bool operator < ( const item& a, const item& b )
{ return ( std::tie( a.level, a.w ) < std::tie( b.level, b.w ) ); }

inline bool operator == ( const item_wrapper& a, const item_wrapper& b )
{ return ( std::tie( a.v ) == std::tie( b.v ) ); }

inline bool operator < ( const item_wrapper& a, const item_wrapper& b )
{ return ( std::tie( a.v ) < std::tie( b.v ) ); }

} }
} } // namespace fc::test

FC_REFLECT( fc::test::item_wrapper, (v) );
FC_REFLECT( fc::test::item, (level)(w) );
Expand Down

0 comments on commit efa4a50

Please sign in to comment.