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 ) { }
 
  109          inline std::uint8_t is_little_endian()
 const 
  110          { 
return itsOutputEndianness == Endianness::little; }
 
  112          friend class PortableBinaryOutputArchive;
 
  125        this->
operator()( options.is_little_endian() );
 
  131      template <std::streamsize DataSize> inline
 
  134        std::streamsize writtenSize = 0;
 
  136        if( itsConvertEndianness )
 
  138          for( std::streamsize i = 0; i < size; i += DataSize )
 
  139            for( std::streamsize j = 0; j < DataSize; ++j )
 
  140              writtenSize += itsStream.rdbuf()->sputn( 
reinterpret_cast<const char*
>( data ) + DataSize - j - 1 + i, 1 );
 
  143          writtenSize = 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 ) { }
 
  211          inline std::uint8_t is_little_endian()
 const 
  212          { 
return itsInputEndianness == Endianness::little; }
 
  214          friend class PortableBinaryInputArchive;
 
  225        itsConvertEndianness( false )
 
  227        uint8_t streamLittleEndian;
 
  229        itsConvertEndianness = options.is_little_endian() ^ streamLittleEndian;
 
  238      template <std::streamsize DataSize> inline
 
  242        auto const readSize = 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::streamsize 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::streamsize
>( 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::streamsize
>( bd.size ) );
 
Main cereal functionality.
 
The base output archive class.
Definition: cereal.hpp:319
 
PortableBinaryOutputArchive & operator()(Types &&... args)
Serializes all passed in data.
Definition: cereal.hpp:331
 
A class containing various advanced options for the PortableBinaryOutput archive.
Definition: portable_binary.hpp:83
 
static Options BigEndian()
Save as big endian.
Definition: portable_binary.hpp:96
 
Options(Endianness outputEndian=getEndianness())
Specify specific options for the PortableBinaryOutputArchive.
Definition: portable_binary.hpp:100
 
static Options LittleEndian()
Save as little endian.
Definition: portable_binary.hpp:93
 
static Options Default()
Default options, preserve system endianness.
Definition: portable_binary.hpp:90
 
Endianness
Represents desired endianness.
Definition: portable_binary.hpp:87
 
An output archive designed to save data in a compact binary representation portable over different ar...
Definition: portable_binary.hpp:79
 
void saveBinary(const void *data, std::streamsize size)
Writes size bytes of data to the output stream.
Definition: portable_binary.hpp:132
 
PortableBinaryOutputArchive(std::ostream &stream, Options const &options=Options::Default())
Construct, outputting to the provided stream.
Definition: portable_binary.hpp:120
 
#define CEREAL_REGISTER_ARCHIVE(Archive)
Registers a specific Archive type with cereal.
Definition: cereal.hpp:195
 
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
 
#define CEREAL_LOAD_FUNCTION_NAME
The deserialization (load) function name to search for.
Definition: macros.hpp:85
 
#define CEREAL_SAVE_FUNCTION_NAME
The serialization (save) function name to search for.
Definition: macros.hpp:92
 
#define CEREAL_SERIALIZE_FUNCTION_NAME
The serialization/deserialization function name to search for.
Definition: macros.hpp:78
 
An exception class thrown when things go wrong at runtime.
Definition: helpers.hpp:49
 
#define CEREAL_SETUP_ARCHIVE_TRAITS(InputArchive, OutputArchive)
Sets up traits that relate an input archive to an output archive.
Definition: traits.hpp:169
 
#define CEREAL_ARCHIVE_RESTRICT(INTYPE, OUTTYPE)
A macro to use to restrict which types of archives your function will work for.
Definition: traits.hpp:1315