diff --git a/binary_archive/vector.hpp b/binary_archive/vector.hpp index 7786cfe7..b4c2b589 100644 --- a/binary_archive/vector.hpp +++ b/binary_archive/vector.hpp @@ -11,13 +11,11 @@ namespace cereal typename std::enable_if::value && !std::is_same::value, void>::type save( BinaryOutputArchive & ar, std::vector const & vector ) { - std::cout << "Saving vector (arithmetic)" << std::endl; - - const size_t dataSize = std::addressof(vector.back()) - std::addressof(vector.front()); + const size_t dataSize = std::addressof(vector.back()) - std::addressof(vector.front()) + 1; ar & vector.size(); // number of elements ar & dataSize; // size of data (may be larger due to allocator strategy) - ar.save_binary( array.data(), size ); // actual data + ar.save_binary( vector.data(), dataSize * sizeof(T) ); // actual data } //! Serialization for std::vectors of arithmetic (but not bool) types to binary @@ -25,32 +23,40 @@ namespace cereal typename std::enable_if::value && !std::is_same::value, void>::type load( BinaryInputArchive & ar, std::vector & vector ) { - std::cout << "Loading vector (arithmetic)" << std::endl; - - size_t dataSize; size_t vectorSize; + size_t dataSize; ar & vectorSize; ar & dataSize; vector.resize( vectorSize ); - ar.load_binary( vector.data(), dataSize ); + ar.load_binary( vector.data(), dataSize * sizeof(T)); } - //! Serialization for all other vector types + //! Serialization for non-arithmetic (and bool) vector types to binary template - void save( BinaryOutputArchive & ar, std::vector const & vector ) + typename std::enable_if::value || std::is_same::value, void>::type + save( BinaryOutputArchive & ar, std::vector const & vector ) { - std::cout << "Saving vector" << std::endl; - ar & vector.size(); // number of elements for( auto it = vector.begin(), end = vector.end(); it != end; ++it ) ar & (*it); } - //! Serialization for std::vector to binary + //! Serialization for non-arithmetic (and bool) vector types to binary (non-const version) template - void load( BinaryInputArchive & ar, std::vector & vector ) + typename std::enable_if::value || std::is_same::value, void>::type + save( BinaryOutputArchive & ar, std::vector & vector ) + { + ar & vector.size(); // number of elements + for( auto it = vector.begin(), end = vector.end(); it != end; ++it ) + ar & (*it); + } + + //! Serialization for non-arithmetic (and bool) vector types from binary + template + typename std::enable_if::value || std::is_same::value, void>::type + load( BinaryInputArchive & ar, std::vector & vector ) { size_t size; ar & size; diff --git a/unittests.cpp b/unittests.cpp index e162157e..c989a109 100644 --- a/unittests.cpp +++ b/unittests.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -13,7 +14,16 @@ struct StructBase int x, y; bool operator==(StructBase const & other) { return x == other.x && y == other.y; } + bool operator!=(StructBase const & other) + { return x != other.x || y != other.y; } }; + +std::ostream& operator<<(std::ostream& os, StructBase const & s) +{ + os << "[x: " << s.x << " y: " << s.y << "]"; + return os; +} + struct StructInternalSerialize : StructBase { @@ -277,10 +287,76 @@ BOOST_AUTO_TEST_CASE( binary_array ) iar & i_eserarray; iar & i_esplarray; - for(size_t i=0; i o_podvector(100); + for(auto & elem : o_podvector) + elem = random_value(gen); + + std::vector o_iservector(100); + for(auto & elem : o_iservector) + elem = { random_value(gen), random_value(gen) }; + + std::vector o_isplvector(100); + for(auto & elem : o_isplvector) + elem = { random_value(gen), random_value(gen) }; + + std::vector o_eservector(100); + for(auto & elem : o_eservector) + elem = { random_value(gen), random_value(gen) }; + + std::vector o_esplvector(100); + for(auto & elem : o_esplvector) + elem = { random_value(gen), random_value(gen) }; + + oar & o_podvector; + oar & o_iservector; + oar & o_isplvector; + oar & o_eservector; + oar & o_esplvector; + + std::istringstream is(os.str()); + cereal::BinaryInputArchive iar(is); + + std::vector i_podvector; + std::vector i_iservector; + std::vector i_isplvector; + std::vector i_eservector; + std::vector i_esplvector; + + iar & i_podvector; + iar & i_iservector; + iar & i_isplvector; + iar & i_eservector; + iar & i_esplvector; + + BOOST_CHECK_EQUAL(i_podvector.size(), o_podvector.size()); + BOOST_CHECK_EQUAL(i_iservector.size(), o_iservector.size()); + BOOST_CHECK_EQUAL(i_isplvector.size(), o_isplvector.size()); + BOOST_CHECK_EQUAL(i_eservector.size(), o_eservector.size()); + BOOST_CHECK_EQUAL(i_esplvector.size(), o_esplvector.size()); + + BOOST_CHECK_EQUAL_COLLECTIONS(i_podvector.begin(), i_podvector.end(), o_podvector.begin(), o_podvector.end()); + BOOST_CHECK_EQUAL_COLLECTIONS(i_iservector.begin(), i_iservector.end(), o_iservector.begin(), o_iservector.end()); + BOOST_CHECK_EQUAL_COLLECTIONS(i_isplvector.begin(), i_isplvector.end(), o_isplvector.begin(), o_isplvector.end()); + BOOST_CHECK_EQUAL_COLLECTIONS(i_eservector.begin(), i_eservector.end(), o_eservector.begin(), o_eservector.end()); + BOOST_CHECK_EQUAL_COLLECTIONS(i_esplvector.begin(), i_esplvector.end(), o_esplvector.begin(), o_esplvector.end()); } }