提交 c200c0a9 编写于 作者: B Brian Johnson

Peer Review optimization requests. GH #2350

上级 a78e41f1
......@@ -254,16 +254,28 @@ DataStream& operator >> ( DataStream& ds, std::array<T,N>& v ) {
return ds;
}
template<typename DataStream, typename T, std::size_t N>
template<typename DataStream, typename T, std::size_t N,
std::enable_if_t<std::is_scalar<T>::value == false || std::is_pointer<T>::value == true, int> = 0>
DataStream& operator << ( DataStream& ds, const T (&v)[N] ) {
static_assert(!std::is_pointer<T>::value, "Pointers should not be serialized" );
ds << unsigned_int( N );
for( uint32_t i = 0; i < N; ++i )
ds << v[i];
return ds;
}
template<typename DataStream, typename T, std::size_t N>
template<typename DataStream, typename T, std::size_t N,
std::enable_if_t<std::is_scalar<T>::value == true && std::is_pointer<T>::value == false, int> = 0>
DataStream& operator << ( DataStream& ds, const T (&v)[N] ) {
ds << unsigned_int( N );
ds.write((char*)&v[0], sizeof(v));
return ds;
}
template<typename DataStream, typename T, std::size_t N,
std::enable_if_t<std::is_scalar<T>::value == false || std::is_pointer<T>::value == true, int> = 0>
DataStream& operator >> ( DataStream& ds, T (&v)[N] ) {
static_assert(!std::is_pointer<T>::value, "Pointers should not be serialized" );
unsigned_int s;
ds >> s;
eosio_assert( N == s.value, "T[] size and unpacked size don't match");
......@@ -272,6 +284,16 @@ DataStream& operator >> ( DataStream& ds, T (&v)[N] ) {
return ds;
}
template<typename DataStream, typename T, std::size_t N,
std::enable_if_t<std::is_scalar<T>::value == true && std::is_pointer<T>::value == false, int> = 0>
DataStream& operator >> ( DataStream& ds, T (&v)[N] ) {
unsigned_int s;
ds >> s;
eosio_assert( N == s.value, "T[] size and unpacked size don't match");
ds.read((char*)&v[0], sizeof(v));
return ds;
}
template<typename DataStream>
DataStream& operator << ( DataStream& ds, const vector<char>& v ) {
ds << unsigned_int( v.size() );
......
......@@ -140,12 +140,34 @@ namespace fc {
usec = fc::microseconds(usec_as_int64);
} FC_RETHROW_EXCEPTIONS( warn, "" ) }
template<typename Stream, typename T, size_t N>
template<typename Stream, typename T, size_t N,
std::enable_if_t<std::is_scalar<T>::value == false || std::is_pointer<T>::value == true, int>>
inline void pack( Stream& s, const fc::array<T,N>& v) {
for (uint64_t i = 0; i < N; ++i)
fc::raw::pack(s, v.data[i]);
}
template<typename Stream, typename T, size_t N,
std::enable_if_t<std::is_scalar<T>::value == true && std::is_pointer<T>::value == false, int>>
inline void pack( Stream& s, const fc::array<T,N>& v) {
s.write((const char*)&v.data[0], N*sizeof(T));
}
template<typename Stream, typename T, size_t N,
std::enable_if_t<std::is_scalar<T>::value == false || std::is_pointer<T>::value == true, int>>
inline void unpack( Stream& s, fc::array<T,N>& v)
{ try {
for (uint64_t i = 0; i < N; ++i)
fc::raw::unpack(s, v.data[i]);
} FC_RETHROW_EXCEPTIONS( warn, "fc::array<${type},${length}>", ("type",fc::get_typename<T>::name())("length",N) ) }
template<typename Stream, typename T, size_t N,
std::enable_if_t<std::is_scalar<T>::value == true && std::is_pointer<T>::value == false, int>>
inline void unpack( Stream& s, fc::array<T,N>& v)
{ try {
s.read((char*)&v.data[0], N*sizeof(T));
} FC_RETHROW_EXCEPTIONS( warn, "fc::array<${type},${length}>", ("type",fc::get_typename<T>::name())("length",N) ) }
template<typename Stream, typename T, size_t N>
inline void pack( Stream& s, T (&v)[N]) {
fc::raw::pack( s, unsigned_int((uint32_t)N) );
......@@ -160,7 +182,7 @@ namespace fc {
FC_ASSERT( size.value == N );
for (uint64_t i = 0; i < N; ++i)
fc::raw::unpack(s, v[i]);
} FC_RETHROW_EXCEPTIONS( warn, "fc::array<type,length>", ("type",fc::get_typename<T>::name())("length",N) ) }
} FC_RETHROW_EXCEPTIONS( warn, "${type} (&v)[${length}]", ("type",fc::get_typename<T>::name())("length",N) ) }
template<typename Stream, typename T>
inline void pack( Stream& s, const std::shared_ptr<T>& v)
......@@ -168,13 +190,6 @@ namespace fc {
fc::raw::pack( s, *v );
}
template<typename Stream, typename T, size_t N>
inline void unpack( Stream& s, fc::array<T,N>& v)
{ try {
for (uint64_t i = 0; i < N; ++i)
fc::raw::unpack(s, v.data[i]);
} FC_RETHROW_EXCEPTIONS( warn, "fc::array<type,length>", ("type",fc::get_typename<T>::name())("length",N) ) }
template<typename Stream, typename T>
inline void unpack( Stream& s, std::shared_ptr<T>& v)
{ try {
......
......@@ -111,8 +111,14 @@ namespace fc {
template<typename Stream> inline void pack( Stream& s, const std::vector<char>& value );
template<typename Stream> inline void unpack( Stream& s, std::vector<char>& value );
template<typename Stream, typename T, size_t N> inline void pack( Stream& s, const fc::array<T,N>& v);
template<typename Stream, typename T, size_t N> inline void unpack( Stream& s, fc::array<T,N>& v);
template<typename Stream, typename T, std::size_t N,
std::enable_if_t<std::is_scalar<T>::value == false || std::is_pointer<T>::value == true, int> = 0> inline void pack( Stream& s, const fc::array<T,N>& v);
template<typename Stream, typename T, std::size_t N,
std::enable_if_t<std::is_scalar<T>::value == true && std::is_pointer<T>::value == false, int> = 0> inline void pack( Stream& s, const fc::array<T,N>& v);
template<typename Stream, typename T, std::size_t N,
std::enable_if_t<std::is_scalar<T>::value == false || std::is_pointer<T>::value == true, int> = 0> inline void unpack( Stream& s, fc::array<T,N>& v);
template<typename Stream, typename T, std::size_t N,
std::enable_if_t<std::is_scalar<T>::value == true && std::is_pointer<T>::value == false, int> = 0> inline void unpack( Stream& s, fc::array<T,N>& v);
template<typename Stream> inline void pack( Stream& s, const bool& v );
template<typename Stream> inline void unpack( Stream& s, bool& v );
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册