upgrade cereal
This commit is contained in:
@@ -62,9 +62,9 @@ namespace cereal
|
||||
~BinaryOutputArchive() CEREAL_NOEXCEPT = default;
|
||||
|
||||
//! Writes size bytes of data to the output stream
|
||||
void saveBinary( const void * data, std::size_t size )
|
||||
void saveBinary( const void * data, std::streamsize size )
|
||||
{
|
||||
auto const writtenSize = static_cast<std::size_t>( itsStream.rdbuf()->sputn( reinterpret_cast<const char*>( data ), size ) );
|
||||
auto const writtenSize = itsStream.rdbuf()->sputn( reinterpret_cast<const char*>( data ), size );
|
||||
|
||||
if(writtenSize != size)
|
||||
throw Exception("Failed to write " + std::to_string(size) + " bytes to output stream! Wrote " + std::to_string(writtenSize));
|
||||
@@ -97,9 +97,9 @@ namespace cereal
|
||||
~BinaryInputArchive() CEREAL_NOEXCEPT = default;
|
||||
|
||||
//! Reads size bytes of data from the input stream
|
||||
void loadBinary( void * const data, std::size_t size )
|
||||
void loadBinary( void * const data, std::streamsize size )
|
||||
{
|
||||
auto const readSize = static_cast<std::size_t>( itsStream.rdbuf()->sgetn( reinterpret_cast<char*>( data ), size ) );
|
||||
auto const readSize = itsStream.rdbuf()->sgetn( reinterpret_cast<char*>( data ), size );
|
||||
|
||||
if(readSize != size)
|
||||
throw Exception("Failed to read " + std::to_string(size) + " bytes from input stream! Read " + std::to_string(readSize));
|
||||
@@ -148,14 +148,14 @@ namespace cereal
|
||||
template <class T> inline
|
||||
void CEREAL_SAVE_FUNCTION_NAME(BinaryOutputArchive & ar, BinaryData<T> const & bd)
|
||||
{
|
||||
ar.saveBinary( bd.data, static_cast<std::size_t>( bd.size ) );
|
||||
ar.saveBinary( bd.data, static_cast<std::streamsize>( bd.size ) );
|
||||
}
|
||||
|
||||
//! Loading binary data
|
||||
template <class T> inline
|
||||
void CEREAL_LOAD_FUNCTION_NAME(BinaryInputArchive & ar, BinaryData<T> & bd)
|
||||
{
|
||||
ar.loadBinary(bd.data, static_cast<std::size_t>(bd.size));
|
||||
ar.loadBinary(bd.data, static_cast<std::streamsize>( bd.size ) );
|
||||
}
|
||||
} // namespace cereal
|
||||
|
||||
|
||||
@@ -40,6 +40,11 @@ namespace cereal
|
||||
{ RapidJSONException( const char * what_ ) : Exception( what_ ) {} };
|
||||
}
|
||||
|
||||
// Inform rapidjson that assert will throw
|
||||
#ifndef CEREAL_RAPIDJSON_ASSERT_THROWS
|
||||
#define CEREAL_RAPIDJSON_ASSERT_THROWS
|
||||
#endif // CEREAL_RAPIDJSON_ASSERT_THROWS
|
||||
|
||||
// Override rapidjson assertions to throw exceptions by default
|
||||
#ifndef CEREAL_RAPIDJSON_ASSERT
|
||||
#define CEREAL_RAPIDJSON_ASSERT(x) if(!(x)){ \
|
||||
@@ -47,8 +52,14 @@ namespace cereal
|
||||
#endif // RAPIDJSON_ASSERT
|
||||
|
||||
// Enable support for parsing of nan, inf, -inf
|
||||
#ifndef CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS
|
||||
#define CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS kWriteNanAndInfFlag
|
||||
#endif
|
||||
|
||||
// Enable support for parsing of nan, inf, -inf
|
||||
#ifndef CEREAL_RAPIDJSON_PARSE_DEFAULT_FLAGS
|
||||
#define CEREAL_RAPIDJSON_PARSE_DEFAULT_FLAGS kParseFullPrecisionFlag | kParseNanAndInfFlag
|
||||
#endif
|
||||
|
||||
#include "cereal/external/rapidjson/prettywriter.h"
|
||||
#include "cereal/external/rapidjson/ostreamwrapper.h"
|
||||
@@ -209,11 +220,13 @@ namespace cereal
|
||||
{
|
||||
case NodeType::StartArray:
|
||||
itsWriter.StartArray();
|
||||
// fall through
|
||||
case NodeType::InArray:
|
||||
itsWriter.EndArray();
|
||||
break;
|
||||
case NodeType::StartObject:
|
||||
itsWriter.StartObject();
|
||||
// fall through
|
||||
case NodeType::InObject:
|
||||
itsWriter.EndObject();
|
||||
break;
|
||||
@@ -477,7 +490,7 @@ namespace cereal
|
||||
}
|
||||
|
||||
Iterator(ValueIterator begin, ValueIterator end) :
|
||||
itsValueItBegin(begin), itsValueItEnd(end), itsIndex(0), itsType(Value)
|
||||
itsValueItBegin(begin), itsIndex(0), itsType(Value)
|
||||
{
|
||||
if( std::distance( begin, end ) == 0 )
|
||||
itsType = Null_;
|
||||
@@ -532,7 +545,7 @@ namespace cereal
|
||||
|
||||
private:
|
||||
MemberIterator itsMemberItBegin, itsMemberItEnd; //!< The member iterator (object)
|
||||
ValueIterator itsValueItBegin, itsValueItEnd; //!< The value iterator (array)
|
||||
ValueIterator itsValueItBegin; //!< The value iterator (array)
|
||||
size_t itsIndex; //!< The current index of this iterator
|
||||
enum Type {Value, Member, Null_} itsType; //!< Whether this holds values (array) or members (objects) or nothing
|
||||
};
|
||||
@@ -751,6 +764,31 @@ namespace cereal
|
||||
void epilogue( JSONInputArchive &, NameValuePair<T> const & )
|
||||
{ }
|
||||
|
||||
// ######################################################################
|
||||
//! Prologue for deferred data for JSON archives
|
||||
/*! Do nothing for the defer wrapper */
|
||||
template <class T> inline
|
||||
void prologue( JSONOutputArchive &, DeferredData<T> const & )
|
||||
{ }
|
||||
|
||||
//! Prologue for deferred data for JSON archives
|
||||
template <class T> inline
|
||||
void prologue( JSONInputArchive &, DeferredData<T> const & )
|
||||
{ }
|
||||
|
||||
// ######################################################################
|
||||
//! Epilogue for deferred for JSON archives
|
||||
/*! NVPs do not start or finish nodes - they just set up the names */
|
||||
template <class T> inline
|
||||
void epilogue( JSONOutputArchive &, DeferredData<T> const & )
|
||||
{ }
|
||||
|
||||
//! Epilogue for deferred for JSON archives
|
||||
/*! Do nothing for the defer wrapper */
|
||||
template <class T> inline
|
||||
void epilogue( JSONInputArchive &, DeferredData<T> const & )
|
||||
{ }
|
||||
|
||||
// ######################################################################
|
||||
//! Prologue for SizeTags for JSON archives
|
||||
/*! SizeTags are strictly ignored for JSON, they just indicate
|
||||
|
||||
@@ -128,19 +128,19 @@ namespace cereal
|
||||
~PortableBinaryOutputArchive() CEREAL_NOEXCEPT = default;
|
||||
|
||||
//! Writes size bytes of data to the output stream
|
||||
template <std::size_t DataSize> inline
|
||||
void saveBinary( const void * data, std::size_t size )
|
||||
template <std::streamsize DataSize> inline
|
||||
void saveBinary( const void * data, std::streamsize size )
|
||||
{
|
||||
std::size_t writtenSize = 0;
|
||||
std::streamsize writtenSize = 0;
|
||||
|
||||
if( itsConvertEndianness )
|
||||
{
|
||||
for( std::size_t i = 0; i < size; i += DataSize )
|
||||
for( std::size_t j = 0; j < DataSize; ++j )
|
||||
writtenSize += static_cast<std::size_t>( itsStream.rdbuf()->sputn( reinterpret_cast<const char*>( data ) + DataSize - j - 1 + i, 1 ) );
|
||||
for( std::streamsize i = 0; i < size; i += DataSize )
|
||||
for( std::streamsize j = 0; j < DataSize; ++j )
|
||||
writtenSize += itsStream.rdbuf()->sputn( reinterpret_cast<const char*>( data ) + DataSize - j - 1 + i, 1 );
|
||||
}
|
||||
else
|
||||
writtenSize = static_cast<std::size_t>( itsStream.rdbuf()->sputn( reinterpret_cast<const char*>( data ), size ) );
|
||||
writtenSize = itsStream.rdbuf()->sputn( reinterpret_cast<const char*>( data ), size );
|
||||
|
||||
if(writtenSize != size)
|
||||
throw Exception("Failed to write " + std::to_string(size) + " bytes to output stream! Wrote " + std::to_string(writtenSize));
|
||||
@@ -235,11 +235,11 @@ namespace cereal
|
||||
/*! @param data The data to save
|
||||
@param size The number of bytes in the data
|
||||
@tparam DataSize T The size of the actual type of the data elements being loaded */
|
||||
template <std::size_t DataSize> inline
|
||||
void loadBinary( void * const data, std::size_t size )
|
||||
template <std::streamsize DataSize> inline
|
||||
void loadBinary( void * const data, std::streamsize size )
|
||||
{
|
||||
// load data
|
||||
auto const readSize = static_cast<std::size_t>( itsStream.rdbuf()->sgetn( reinterpret_cast<char*>( data ), size ) );
|
||||
auto const readSize = itsStream.rdbuf()->sgetn( reinterpret_cast<char*>( data ), size );
|
||||
|
||||
if(readSize != size)
|
||||
throw Exception("Failed to read " + std::to_string(size) + " bytes from input stream! Read " + std::to_string(readSize));
|
||||
@@ -248,7 +248,7 @@ namespace cereal
|
||||
if( itsConvertEndianness )
|
||||
{
|
||||
std::uint8_t * ptr = reinterpret_cast<std::uint8_t*>( data );
|
||||
for( std::size_t i = 0; i < size; i += DataSize )
|
||||
for( std::streamsize i = 0; i < size; i += DataSize )
|
||||
portable_binary_detail::swap_bytes<DataSize>( ptr + i );
|
||||
}
|
||||
}
|
||||
@@ -308,7 +308,7 @@ namespace cereal
|
||||
(std::is_floating_point<TT>::value && std::numeric_limits<TT>::is_iec559),
|
||||
"Portable binary only supports IEEE 754 standardized floating point" );
|
||||
|
||||
ar.template saveBinary<sizeof(TT)>( bd.data, static_cast<std::size_t>( bd.size ) );
|
||||
ar.template saveBinary<sizeof(TT)>( bd.data, static_cast<std::streamsize>( bd.size ) );
|
||||
}
|
||||
|
||||
//! Loading binary data from portable binary
|
||||
@@ -320,7 +320,7 @@ namespace cereal
|
||||
(std::is_floating_point<TT>::value && std::numeric_limits<TT>::is_iec559),
|
||||
"Portable binary only supports IEEE 754 standardized floating point" );
|
||||
|
||||
ar.template loadBinary<sizeof(TT)>( bd.data, static_cast<std::size_t>( bd.size ) );
|
||||
ar.template loadBinary<sizeof(TT)>( bd.data, static_cast<std::streamsize>( bd.size ) );
|
||||
}
|
||||
} // namespace cereal
|
||||
|
||||
|
||||
@@ -101,31 +101,58 @@ namespace cereal
|
||||
//! @{
|
||||
|
||||
//! A class containing various advanced options for the XML archive
|
||||
/*! Options can either be directly passed to the constructor, or chained using the
|
||||
modifier functions for an interface analogous to named parameters */
|
||||
class Options
|
||||
{
|
||||
public:
|
||||
//! Default options
|
||||
static Options Default(){ return Options(); }
|
||||
|
||||
//! Default options with no indentation
|
||||
static Options NoIndent(){ return Options( std::numeric_limits<double>::max_digits10, false ); }
|
||||
|
||||
//! Specify specific options for the XMLOutputArchive
|
||||
/*! @param precision The precision used for floating point numbers
|
||||
@param indent Whether to indent each line of XML
|
||||
@param outputType Whether to output the type of each serialized object as an attribute */
|
||||
explicit Options( int precision = std::numeric_limits<double>::max_digits10,
|
||||
bool indent = true,
|
||||
bool outputType = false ) :
|
||||
itsPrecision( precision ),
|
||||
itsIndent( indent ),
|
||||
itsOutputType( outputType ) { }
|
||||
/*! @param precision_ The precision used for floating point numbers
|
||||
@param indent_ Whether to indent each line of XML
|
||||
@param outputType_ Whether to output the type of each serialized object as an attribute
|
||||
@param sizeAttributes_ Whether dynamically sized containers output the size=dynamic attribute */
|
||||
explicit Options( int precision_ = std::numeric_limits<double>::max_digits10,
|
||||
bool indent_ = true,
|
||||
bool outputType_ = false,
|
||||
bool sizeAttributes_ = true ) :
|
||||
itsPrecision( precision_ ),
|
||||
itsIndent( indent_ ),
|
||||
itsOutputType( outputType_ ),
|
||||
itsSizeAttributes( sizeAttributes_ )
|
||||
{ }
|
||||
|
||||
/*! @name Option Modifiers
|
||||
An interface for setting option settings analogous to named parameters.
|
||||
|
||||
@code{cpp}
|
||||
cereal::XMLOutputArchive ar( myStream,
|
||||
cereal::XMLOutputArchive::Options()
|
||||
.indent(true)
|
||||
.sizeAttributes(false) );
|
||||
@endcode
|
||||
*/
|
||||
//! @{
|
||||
|
||||
//! Sets the precision used for floaing point numbers
|
||||
Options & precision( int value ){ itsPrecision = value; return * this; }
|
||||
//! Whether to indent each line of XML
|
||||
Options & indent( bool enable ){ itsIndent = enable; return *this; }
|
||||
//! Whether to output the type of each serialized object as an attribute
|
||||
Options & outputType( bool enable ){ itsOutputType = enable; return *this; }
|
||||
//! Whether dynamically sized containers (e.g. vector) output the size=dynamic attribute
|
||||
Options & sizeAttributes( bool enable ){ itsSizeAttributes = enable; return *this; }
|
||||
|
||||
//! @}
|
||||
|
||||
private:
|
||||
friend class XMLOutputArchive;
|
||||
int itsPrecision;
|
||||
bool itsIndent;
|
||||
bool itsOutputType;
|
||||
bool itsSizeAttributes;
|
||||
};
|
||||
|
||||
//! Construct, outputting to the provided stream upon destruction
|
||||
@@ -137,7 +164,8 @@ namespace cereal
|
||||
OutputArchive<XMLOutputArchive>(this),
|
||||
itsStream(stream),
|
||||
itsOutputType( options.itsOutputType ),
|
||||
itsIndent( options.itsIndent )
|
||||
itsIndent( options.itsIndent ),
|
||||
itsSizeAttributes(options.itsSizeAttributes)
|
||||
{
|
||||
// rapidxml will delete all allocations when xml_document is cleared
|
||||
auto node = itsXML.allocate_node( rapidxml::node_declaration );
|
||||
@@ -182,7 +210,7 @@ namespace cereal
|
||||
itsNodes.top().node->append_attribute( itsXML.allocate_attribute( "type", "cereal binary data" ) );
|
||||
|
||||
finishNode();
|
||||
};
|
||||
}
|
||||
|
||||
//! @}
|
||||
/*! @name Internal Functionality
|
||||
@@ -289,6 +317,8 @@ namespace cereal
|
||||
itsNodes.top().node->append_attribute( itsXML.allocate_attribute( namePtr, valuePtr ) );
|
||||
}
|
||||
|
||||
bool hasSizeAttributes() const { return itsSizeAttributes; }
|
||||
|
||||
protected:
|
||||
//! A struct that contains metadata about a node
|
||||
struct NodeInfo
|
||||
@@ -330,6 +360,7 @@ namespace cereal
|
||||
std::ostringstream itsOS; //!< Used to format strings internally
|
||||
bool itsOutputType; //!< Controls whether type information is printed
|
||||
bool itsIndent; //!< Controls whether indenting is used
|
||||
bool itsSizeAttributes; //!< Controls whether lists have a size attribute
|
||||
}; // XMLOutputArchive
|
||||
|
||||
// ######################################################################
|
||||
@@ -436,7 +467,7 @@ namespace cereal
|
||||
std::memcpy( data, decoded.data(), decoded.size() );
|
||||
|
||||
finishNode();
|
||||
};
|
||||
}
|
||||
|
||||
//! @}
|
||||
/*! @name Internal Functionality
|
||||
@@ -758,13 +789,41 @@ namespace cereal
|
||||
void epilogue( XMLInputArchive &, NameValuePair<T> const & )
|
||||
{ }
|
||||
|
||||
// ######################################################################
|
||||
//! Prologue for deferred data for XML archives
|
||||
/*! Do nothing for the defer wrapper */
|
||||
template <class T> inline
|
||||
void prologue( XMLOutputArchive &, DeferredData<T> const & )
|
||||
{ }
|
||||
|
||||
//! Prologue for deferred data for XML archives
|
||||
template <class T> inline
|
||||
void prologue( XMLInputArchive &, DeferredData<T> const & )
|
||||
{ }
|
||||
|
||||
// ######################################################################
|
||||
//! Epilogue for deferred for XML archives
|
||||
/*! NVPs do not start or finish nodes - they just set up the names */
|
||||
template <class T> inline
|
||||
void epilogue( XMLOutputArchive &, DeferredData<T> const & )
|
||||
{ }
|
||||
|
||||
//! Epilogue for deferred for XML archives
|
||||
/*! Do nothing for the defer wrapper */
|
||||
template <class T> inline
|
||||
void epilogue( XMLInputArchive &, DeferredData<T> const & )
|
||||
{ }
|
||||
|
||||
// ######################################################################
|
||||
//! Prologue for SizeTags for XML output archives
|
||||
/*! SizeTags do not start or finish nodes */
|
||||
template <class T> inline
|
||||
void prologue( XMLOutputArchive & ar, SizeTag<T> const & )
|
||||
{
|
||||
ar.appendAttribute( "size", "dynamic" );
|
||||
if (ar.hasSizeAttributes())
|
||||
{
|
||||
ar.appendAttribute("size", "dynamic");
|
||||
}
|
||||
}
|
||||
|
||||
template <class T> inline
|
||||
|
||||
Reference in New Issue
Block a user