adding tuple support to value

This commit is contained in:
Daniel Larimer 2012-10-26 01:00:06 -04:00
parent 27abae9d01
commit b568936c5e
3 changed files with 59 additions and 12 deletions

View file

@ -5,6 +5,9 @@
#include <fc/aligned.hpp>
namespace fc {
template<typename A, typename B, typename C, typename D>
struct tuple;
/**
* @brief a dynamic container that can hold
* integers, reals, strings, booleans, arrays, and
@ -27,6 +30,7 @@ namespace fc {
fc::vector<key_val> fields;
};
struct array {
array( size_t s = 0 ):fields(s){}
//fc::string type;
fc::vector<value> fields;
};

View file

@ -193,4 +193,5 @@ namespace fc {
new (holder) detail::value_holder();
fc::pack( *this, std::forward<T>(v) );
}
}

View file

@ -4,6 +4,7 @@
#include <fc/optional.hpp>
#include <fc/value.hpp>
#include <fc/value_cast.hpp>
#include <fc/tuple.hpp>
namespace fc {
struct void_t{};
@ -14,12 +15,18 @@ namespace fc {
template<typename T>
void unpack( const fc::value& jsv, T& v );
template<typename A, typename B, typename C, typename D>
void pack( fc::value& v, const tuple<A,B,C,D>& t );
template<typename A, typename B, typename C, typename D>
void unpack( const fc::value& val, tuple<A,B,C,D>& t );
template<typename T>
void pack( fc::value& jsv, const fc::optional<T>& v );
template<typename T>
void unpack( const fc::value& jsv, fc::optional<T>& v );
inline void pack( fc::value& jsv, const char& v ) { jsv = fc::string(&v,1); }
inline void pack( fc::value& jsv, const fc::value& v ) { jsv = v; }
inline void pack( fc::value& jsv, fc::value& v ) { jsv = v; }
inline void pack( fc::value& jsv, fc::value&& v ) { jsv = fc::move(v); }
@ -189,18 +196,22 @@ namespace fc {
} // namesapce detail
inline void unpack( const fc::value& jsv, bool& v ) { v = value_cast<bool>(jsv); }
inline void unpack( const fc::value& jsv, float& v ) { v = value_cast<float>(jsv); }
inline void unpack( const fc::value& jsv, double& v ) { v = value_cast<double>(jsv); }
inline void unpack( const fc::value& jsv, uint8_t& v ) { v = value_cast<uint8_t>(jsv); }
inline void unpack( const fc::value& jsv, uint16_t& v ) { v = value_cast<uint16_t>(jsv); }
inline void unpack( const fc::value& jsv, uint32_t& v ) { v = value_cast<uint32_t>(jsv); }
inline void unpack( const fc::value& jsv, uint64_t& v ) { v = value_cast<uint64_t>(jsv); }
inline void unpack( const fc::value& jsv, int8_t& v ) { v = value_cast<int8_t>(jsv); }
inline void unpack( const fc::value& jsv, int16_t& v ) { v = value_cast<int16_t>(jsv); }
inline void unpack( const fc::value& jsv, int32_t& v ) { v = value_cast<int32_t>(jsv); }
inline void unpack( const fc::value& jsv, int64_t& v ) { v = value_cast<int64_t>(jsv); }
inline void unpack( const fc::value& jsv, fc::string& v ) { v = value_cast<fc::string>(jsv); }
inline void unpack( const fc::value& jsv, char& v ) {
auto s = value_cast<fc::string>(jsv);
if( s.size() ) v = s[0];
}
inline void unpack( const fc::value& jsv, bool& v ) { v = value_cast<bool>(jsv); }
inline void unpack( const fc::value& jsv, float& v ) { v = value_cast<float>(jsv); }
inline void unpack( const fc::value& jsv, double& v ) { v = value_cast<double>(jsv); }
inline void unpack( const fc::value& jsv, uint8_t& v ) { v = value_cast<uint8_t>(jsv); }
inline void unpack( const fc::value& jsv, uint16_t& v ) { v = value_cast<uint16_t>(jsv); }
inline void unpack( const fc::value& jsv, uint32_t& v ) { v = value_cast<uint32_t>(jsv); }
inline void unpack( const fc::value& jsv, uint64_t& v ) { v = value_cast<uint64_t>(jsv); }
inline void unpack( const fc::value& jsv, int8_t& v ) { v = value_cast<int8_t>(jsv); }
inline void unpack( const fc::value& jsv, int16_t& v ) { v = value_cast<int16_t>(jsv); }
inline void unpack( const fc::value& jsv, int32_t& v ) { v = value_cast<int32_t>(jsv); }
inline void unpack( const fc::value& jsv, int64_t& v ) { v = value_cast<int64_t>(jsv); }
inline void unpack( const fc::value& jsv, fc::string& v ) { v = value_cast<fc::string>(jsv); }
template<typename T>
void pack( fc::value& jsv, const fc::optional<T>& v ) {
@ -230,6 +241,37 @@ namespace fc {
++i;
}
}
struct tuple_to_value_visitor {
tuple_to_value_visitor( value& v ):_val(v),_count(0) { }
template<typename T>
void operator()( T&& t ) {
_val[_count] = value(fc::forward<T>(t) );
++_count;
}
value& _val;
int _count;
};
struct tuple_from_value_visitor {
tuple_from_value_visitor( const value& v ):_val(v),_count(0) { }
template<typename T>
void operator()( T&& t ) {
if( _count < _val.size() ) unpack( _val[_count], t );
++_count;
}
const value& _val;
int _count;
};
template<typename A, typename B, typename C, typename D>
inline void pack( fc::value& val, const tuple<A,B,C,D>& t ) {
val = fc::value::array( tuple<A,B,C,D>::size );
t.visit( tuple_to_value_visitor(val) );
}
template<typename A, typename B, typename C, typename D>
inline void unpack( const fc::value& val, tuple<A,B,C,D>& t ) {
val = fc::value::array( tuple<A,B,C,D>::size );
t.visit( tuple_from_value_visitor(val) );
}
template<typename T>
inline void unpack( const fc::value& jsv, fc::vector<T>& val ) {