#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct Archive {}; struct Test { template void serialize( Archive & ar ) { std::cout << "hey there" << std::endl; } template void save( Archive & ar ) const { std::cout << "saved by the bell" << std::endl; } template void load( Archive & ar ) { std::cout << "locked and loaded" << std::endl; } template static Test * load_and_allocate( Archive & ar ) { } }; template void serialize( Archive & ar, Test & t ) { } template void load( Archive & ar, Test & t ) { } template void save( Archive & ar, Test const & t ) { } namespace cereal { template <> struct LoadAndAllocate { template static Test * load_and_allocate( Archive & ar ) { } }; } struct A { virtual void foo() = 0; }; struct B : A { void foo() {} }; struct C { char a; }; CEREAL_REGISTER_TYPE(B); int main() { typedef Test T; // Test Load and Allocate internal/external std::cout << "\tload_and_allocate" << std::endl; std::cout << cereal::traits::has_member_load_and_allocate::value << std::endl; std::cout << cereal::traits::has_non_member_load_and_allocate::value << std::endl; // serialize std::cout << "\tserialize" << std::endl; std::cout << cereal::traits::has_member_serialize::value << std::endl; std::cout << cereal::traits::has_non_member_serialize::value << std::endl; // load std::cout << "\tload" << std::endl; std::cout << cereal::traits::has_member_load::value << std::endl; std::cout << cereal::traits::has_non_member_load::value << std::endl; // save std::cout << "\tsave" << std::endl; std::cout << cereal::traits::has_member_save::value << std::endl; std::cout << cereal::traits::has_non_member_save::value << std::endl; // splittable std::cout << "\t splittable" << std::endl; std::cout << cereal::traits::has_member_split::value << std::endl; std::cout << cereal::traits::has_non_member_split::value << std::endl; // serialiable std::cout << "\toutput serializable" << std::endl; std::cout << cereal::traits::is_output_serializable::value << std::endl; std::cout << cereal::traits::is_input_serializable::value << std::endl; // specialized std::cout << "\tspecialized" << std::endl; std::cout << cereal::traits::detail::is_specialized_member_serialize::value << std::endl; std::cout << cereal::traits::detail::is_specialized_member_load_save::value << std::endl; std::cout << cereal::traits::detail::is_specialized_non_member_serialize::value << std::endl; std::cout << cereal::traits::detail::is_specialized_non_member_load_save::value << std::endl; std::cout << cereal::traits::detail::is_specialized_error::value << std::endl; std::cout << cereal::traits::is_specialized::value << std::endl; // array size typedef int arr[5][3][2]; std::cout << "\tarray size" << std::endl; std::cout << cereal::traits::sizeof_array::value << std::endl; std::cout << typeid(A).name() << std::endl; std::cout << typeid(cereal::traits::has_load_and_allocate).name() << std::endl; Archive a; T t; cereal::access::member_save( a, t ); cereal::access::member_load( a, t ); cereal::access::member_serialize( a, t ); //std::stringstream ss; { cereal::JSONOutputArchive ar( std::cout ); ar( 5 ); ar( cereal::make_nvp("hello", 2.4f ) ); std::string s = "hey yo"; ar( CEREAL_NVP( s ) ); } //{ // cereal::JSONInputArchive ar( ss ); // int x; // ar( x ); // assert( x == 5 ); // float f; // ar( f ); // assert( f == 2.4f ); // std::string s; // ar( s ); // assert( s == "hey yo" ); //} return 0; }