#define BOOST_ALL_NO_LIB #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 serialzize( 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 ) { return new Test(); } }; 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 ) { return new Test(); } }; } struct A { virtual void foo() = 0; }; struct B : A { void foo() {} template void serialize( Archive & ar ) { std::cout << "i'm in your b" << std::endl; } }; struct C { char a; }; //CEREAL_REGISTER_TYPE(B); template static auto test(int) -> decltype( cereal::access::member_serialize( std::declval(), std::declval() ), std::true_type()) { return {}; } template static auto test(...) -> std::false_type { return {}; } int main() { typedef Test T; std::cout << std::boolalpha; // 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; std::cout << test(0) << 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 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( ss ); // ar( 5 ); // ar( cereal::make_nvp("hello", 2.4f ) ); // std::string s = "hey yo"; // ar( CEREAL_NVP( s ) ); // int darp [] = { 1, 2, 3 }; // ar.saveBinaryValue( darp, sizeof(int) * 3, "darp" ); // std::unique_ptr ptr( new B() ); // ar( CEREAL_NVP( ptr ) ); //} //{ // 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" ); // int darp[3]; // ar.loadBinaryValue( darp, sizeof(int) * 3 ); // assert( darp[0] == 1 ); // assert( darp[1] == 2 ); // assert( darp[2] == 3 ); // std::unique_ptr ptr; // std::cout << "----------" << std::endl; // std::cout << std::is_default_constructible::value << std::endl; // std::cout << cereal::traits::has_load_and_allocate::value << std::endl; // ar( ptr ); //} return 0; }