29 #ifndef CEREAL_ARCHIVES_PORTABLE_BINARY_HPP_ 30 #define CEREAL_ARCHIVES_PORTABLE_BINARY_HPP_ 38 namespace portable_binary_detail
44 static std::int32_t test = 1;
45 return *
reinterpret_cast<std::int8_t*
>( &test ) == 1;
52 template <std::
size_t DataSize>
55 for( std::size_t i = 0, end = DataSize / 2; i < end; ++i )
56 std::swap( data[i], data[DataSize - i - 1] );
101 itsOutputEndianness( outputEndian ) { }
110 {
return itsOutputEndianness == Endianness::little; }
125 this->operator()( options.is_little_endian() );
131 template <std::
size_t DataSize>
inline 134 std::size_t writtenSize = 0;
136 if( itsConvertEndianness )
138 for( std::size_t i = 0; i < size; i += DataSize )
139 for( std::size_t j = 0; j < DataSize; ++j )
140 writtenSize += static_cast<std::size_t>( itsStream.rdbuf()->sputn( reinterpret_cast<const char*>( data ) + DataSize - j - 1 + i, 1 ) );
143 writtenSize =
static_cast<std::size_t
>( itsStream.rdbuf()->sputn( reinterpret_cast<const char*>( data ), size ) );
145 if(writtenSize != size)
146 throw Exception(
"Failed to write " + std::to_string(size) +
" bytes to output stream! Wrote " + std::to_string(writtenSize));
150 std::ostream & itsStream;
151 const uint8_t itsConvertEndianness;
203 itsInputEndianness( inputEndian ) { }
212 {
return itsInputEndianness == Endianness::little; }
225 itsConvertEndianness( false )
227 uint8_t streamLittleEndian;
228 this->operator()( streamLittleEndian );
229 itsConvertEndianness = options.is_little_endian() ^ streamLittleEndian;
238 template <std::
size_t DataSize>
inline 242 auto const readSize =
static_cast<std::size_t
>( itsStream.rdbuf()->sgetn( reinterpret_cast<char*>( data ), size ) );
245 throw Exception(
"Failed to read " + std::to_string(size) +
" bytes from input stream! Read " + std::to_string(readSize));
248 if( itsConvertEndianness )
250 std::uint8_t * ptr =
reinterpret_cast<std::uint8_t*
>( data );
251 for( std::size_t i = 0; i < size; i += DataSize )
252 portable_binary_detail::swap_bytes<DataSize>( ptr + i );
257 std::istream & itsStream;
258 uint8_t itsConvertEndianness;
265 template<
class T>
inline 266 typename std::enable_if<std::is_arithmetic<T>::value,
void>::type
269 static_assert( !std::is_floating_point<T>::value ||
270 (std::is_floating_point<T>::value && std::numeric_limits<T>::is_iec559),
271 "Portable binary only supports IEEE 754 standardized floating point" );
272 ar.template saveBinary<sizeof(T)>(std::addressof(t),
sizeof(t));
276 template<
class T>
inline 277 typename std::enable_if<std::is_arithmetic<T>::value,
void>::type
280 static_assert( !std::is_floating_point<T>::value ||
281 (std::is_floating_point<T>::value && std::numeric_limits<T>::is_iec559),
282 "Portable binary only supports IEEE 754 standardized floating point" );
283 ar.template loadBinary<sizeof(T)>(std::addressof(t),
sizeof(t));
287 template <
class Archive,
class T>
inline 295 template <
class Archive,
class T>
inline 303 template <
class T>
inline 306 typedef typename std::remove_pointer<T>::type TT;
307 static_assert( !std::is_floating_point<TT>::value ||
308 (std::is_floating_point<TT>::value && std::numeric_limits<TT>::is_iec559),
309 "Portable binary only supports IEEE 754 standardized floating point" );
311 ar.template saveBinary<sizeof(TT)>( bd.
data,
static_cast<std::size_t
>( bd.
size ) );
315 template <
class T>
inline 318 typedef typename std::remove_pointer<T>::type TT;
319 static_assert( !std::is_floating_point<TT>::value ||
320 (std::is_floating_point<TT>::value && std::numeric_limits<TT>::is_iec559),
321 "Portable binary only supports IEEE 754 standardized floating point" );
323 ar.template loadBinary<sizeof(TT)>( bd.
data,
static_cast<std::size_t
>( bd.
size ) );
334 #endif // CEREAL_ARCHIVES_PORTABLE_BINARY_HPP_ #define CEREAL_SETUP_ARCHIVE_TRAITS(InputArchive, OutputArchive)
Sets up traits that relate an input archive to an output archive.
Definition: traits.hpp:169
PT data
pointer to beginning of data
Definition: helpers.hpp:219
A wrapper around size metadata.
Definition: helpers.hpp:273
A class containing various advanced options for the PortableBinaryOutput archive. ...
Definition: portable_binary.hpp:82
static Options LittleEndian()
Save as little endian.
Definition: portable_binary.hpp:93
#define CEREAL_SERIALIZE_FUNCTION_NAME
The serialization/deserialization function name to search for.
Definition: macros.hpp:78
PortableBinaryOutputArchive(std::ostream &stream, Options const &options=Options::Default())
Construct, outputting to the provided stream.
Definition: portable_binary.hpp:120
Definition: access.hpp:40
#define CEREAL_REGISTER_ARCHIVE(Archive)
Registers a specific Archive type with cereal.
Definition: cereal.hpp:141
#define CEREAL_ARCHIVE_RESTRICT(INTYPE, OUTTYPE)
A macro to use to restrict which types of archives your function will work for.
Definition: traits.hpp:1293
Main cereal functionality.
For holding name value pairs.
Definition: helpers.hpp:137
#define CEREAL_LOAD_FUNCTION_NAME
The deserialization (load) function name to search for.
Definition: macros.hpp:85
Options(Endianness outputEndian=getEndianness())
Specify specific options for the PortableBinaryOutputArchive.
Definition: portable_binary.hpp:100
Endianness
Represents desired endianness.
Definition: portable_binary.hpp:86
void swap_bytes(std::uint8_t *data)
Swaps the order of bytes for some chunk of memory.
Definition: portable_binary.hpp:53
std::uint8_t is_little_endian()
Returns true if the current machine is little endian.
Definition: portable_binary.hpp:42
#define CEREAL_NOEXCEPT
Defines the CEREAL_NOEXCEPT macro to use instead of noexcept.
Definition: macros.hpp:130
A wrapper around data that can be serialized in a binary fashion.
Definition: helpers.hpp:209
The base output archive class.
Definition: cereal.hpp:234
void saveBinary(const void *data, std::size_t size)
Writes size bytes of data to the output stream.
Definition: portable_binary.hpp:132
#define CEREAL_SAVE_FUNCTION_NAME
The serialization (save) function name to search for.
Definition: macros.hpp:92
static Options Default()
Default options, preserve system endianness.
Definition: portable_binary.hpp:90
uint64_t size
size in bytes
Definition: helpers.hpp:220
static Options BigEndian()
Save as big endian.
Definition: portable_binary.hpp:96
An exception class thrown when things go wrong at runtime.
Definition: helpers.hpp:48
An output archive designed to save data in a compact binary representation portable over different ar...
Definition: portable_binary.hpp:78