#ifndef CEREAL_BINARY_ARCHIVE_BINARY_ARCHIVE_HPP_ #define CEREAL_BINARY_ARCHIVE_BINARY_ARCHIVE_HPP_ #include namespace cereal { // ###################################################################### class BinaryOutputArchive : public OutputArchive { public: BinaryOutputArchive(std::ostream & stream) : OutputArchive(this), itsStream(stream) { } //! Writes size bytes of data to the output stream void save_binary( const void * data, size_t size ) { auto const writtenSize = itsStream.rdbuf()->sputn( reinterpret_cast( data ), size ); if(writtenSize != size) throw 1; // TODO: something terrible } private: std::ostream & itsStream; }; // ###################################################################### class BinaryInputArchive : public InputArchive { public: BinaryInputArchive(std::istream & stream) : InputArchive(this), itsStream(stream) { } //! Reads size bytes of data from the input stream void load_binary( void * const data, size_t size ) { auto const readSize = itsStream.rdbuf()->sgetn( reinterpret_cast( data ), size ); if(readSize != size) throw 1; // TODO: something terrible } private: std::istream & itsStream; }; //! Saving for POD types to binary template typename std::enable_if::value, void>::type save(BinaryOutputArchive & ar, T const & t) { ar.save_binary(std::addressof(t), sizeof(t)); //std::cout << "Saving POD size: " << sizeof(T) << " [" << t << "]" << std::endl; } //! Loading for POD types from binary template typename std::enable_if::value, void>::type load(BinaryInputArchive & ar, T & t) { ar.load_binary(std::addressof(t), sizeof(t)); //std::cout << "Loading POD size: " << sizeof(T) << " [" << t << "]" << std::endl; } //! Saving for NVP types to binary template void save(BinaryOutputArchive & ar, NameValuePair const & t) { //std::cout << "Saving NVP: " << t.name << std::endl; ar & t.value; } //! Loading for NVP types from binary template void load(BinaryInputArchive & ar, NameValuePair t) { //std::cout << "Loading NVP... " << std::endl; ar & t.value; } } #endif // CEREAL_BINARY_ARCHIVE_BINARY_ARCHIVE_HPP_