adding tuple support to value
This commit is contained in:
parent
27abae9d01
commit
b568936c5e
3 changed files with 59 additions and 12 deletions
|
|
@ -5,6 +5,9 @@
|
||||||
#include <fc/aligned.hpp>
|
#include <fc/aligned.hpp>
|
||||||
|
|
||||||
namespace fc {
|
namespace fc {
|
||||||
|
template<typename A, typename B, typename C, typename D>
|
||||||
|
struct tuple;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief a dynamic container that can hold
|
* @brief a dynamic container that can hold
|
||||||
* integers, reals, strings, booleans, arrays, and
|
* integers, reals, strings, booleans, arrays, and
|
||||||
|
|
@ -27,6 +30,7 @@ namespace fc {
|
||||||
fc::vector<key_val> fields;
|
fc::vector<key_val> fields;
|
||||||
};
|
};
|
||||||
struct array {
|
struct array {
|
||||||
|
array( size_t s = 0 ):fields(s){}
|
||||||
//fc::string type;
|
//fc::string type;
|
||||||
fc::vector<value> fields;
|
fc::vector<value> fields;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -193,4 +193,5 @@ namespace fc {
|
||||||
new (holder) detail::value_holder();
|
new (holder) detail::value_holder();
|
||||||
fc::pack( *this, std::forward<T>(v) );
|
fc::pack( *this, std::forward<T>(v) );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
#include <fc/optional.hpp>
|
#include <fc/optional.hpp>
|
||||||
#include <fc/value.hpp>
|
#include <fc/value.hpp>
|
||||||
#include <fc/value_cast.hpp>
|
#include <fc/value_cast.hpp>
|
||||||
|
#include <fc/tuple.hpp>
|
||||||
|
|
||||||
namespace fc {
|
namespace fc {
|
||||||
struct void_t{};
|
struct void_t{};
|
||||||
|
|
@ -14,12 +15,18 @@ namespace fc {
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void unpack( const fc::value& jsv, T& v );
|
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>
|
template<typename T>
|
||||||
void pack( fc::value& jsv, const fc::optional<T>& v );
|
void pack( fc::value& jsv, const fc::optional<T>& v );
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void unpack( const fc::value& jsv, fc::optional<T>& v );
|
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, 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 = v; }
|
||||||
inline void pack( fc::value& jsv, fc::value&& v ) { jsv = fc::move(v); }
|
inline void pack( fc::value& jsv, fc::value&& v ) { jsv = fc::move(v); }
|
||||||
|
|
@ -189,18 +196,22 @@ namespace fc {
|
||||||
|
|
||||||
} // namesapce detail
|
} // namesapce detail
|
||||||
|
|
||||||
inline void unpack( const fc::value& jsv, bool& v ) { v = value_cast<bool>(jsv); }
|
inline void unpack( const fc::value& jsv, char& v ) {
|
||||||
inline void unpack( const fc::value& jsv, float& v ) { v = value_cast<float>(jsv); }
|
auto s = value_cast<fc::string>(jsv);
|
||||||
inline void unpack( const fc::value& jsv, double& v ) { v = value_cast<double>(jsv); }
|
if( s.size() ) v = s[0];
|
||||||
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, bool& v ) { v = value_cast<bool>(jsv); }
|
||||||
inline void unpack( const fc::value& jsv, uint32_t& v ) { v = value_cast<uint32_t>(jsv); }
|
inline void unpack( const fc::value& jsv, float& v ) { v = value_cast<float>(jsv); }
|
||||||
inline void unpack( const fc::value& jsv, uint64_t& v ) { v = value_cast<uint64_t>(jsv); }
|
inline void unpack( const fc::value& jsv, double& v ) { v = value_cast<double>(jsv); }
|
||||||
inline void unpack( const fc::value& jsv, int8_t& v ) { v = value_cast<int8_t>(jsv); }
|
inline void unpack( const fc::value& jsv, uint8_t& v ) { v = value_cast<uint8_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, uint16_t& v ) { v = value_cast<uint16_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, uint32_t& v ) { v = value_cast<uint32_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, uint64_t& v ) { v = value_cast<uint64_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, 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>
|
template<typename T>
|
||||||
void pack( fc::value& jsv, const fc::optional<T>& v ) {
|
void pack( fc::value& jsv, const fc::optional<T>& v ) {
|
||||||
|
|
@ -230,6 +241,37 @@ namespace fc {
|
||||||
++i;
|
++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>
|
template<typename T>
|
||||||
inline void unpack( const fc::value& jsv, fc::vector<T>& val ) {
|
inline void unpack( const fc::value& jsv, fc::vector<T>& val ) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue