#ifndef CEREAL_DETAILS_TRAITS_HPP_ #define CEREAL_DETAILS_TRAITS_HPP_ #include #include namespace cereal { namespace traits { template struct Void { typedef void type; }; // ###################################################################### // Member Serialize template struct has_member_serialize: std::false_type {}; template struct has_member_serialize< T, A, typename Void< decltype( std::declval().serialize( std::declval() ) ) >::type >: std::true_type {}; // ###################################################################### // Non Member Serialize template char & serialize(A&, T&); template bool constexpr has_non_member_serialize() { return std::is_void(), std::declval()))>::value; }; // ###################################################################### // Member Load template struct has_member_load: std::false_type {}; template struct has_member_load< T, A, typename Void< decltype( std::declval().load( std::declval() ) ) >::type >: std::true_type {}; // ###################################################################### // Non Member Load template char & load(A&, T&); template bool constexpr has_non_member_load() { return std::is_void(), std::declval()))>::value; }; // ###################################################################### // Member Save template struct has_member_save: std::false_type {}; template struct has_member_save< T, A, typename Void< decltype( std::declval().save( std::declval() ) ) >::type >: std::true_type {}; // ###################################################################### // Non Member Save template char & save(A&, T const &); template bool constexpr has_non_member_save() { return std::is_void(), std::declval()))>::value; }; // ###################################################################### template constexpr bool has_member_split() { return has_member_load() && has_member_save(); } // ###################################################################### template constexpr bool has_non_member_split() { return has_non_member_load() && has_non_member_save(); } // ###################################################################### template constexpr bool is_output_serializable() { return has_member_save() ^ has_non_member_save() ^ has_member_serialize() ^ has_non_member_serialize(); } // ###################################################################### template constexpr bool is_input_serializable() { return has_member_load() ^ has_non_member_load() ^ has_member_serialize() ^ has_non_member_serialize(); } // ###################################################################### template constexpr size_t sizeofArray( size_t rank = std::rank::value ) { return rank == 0 ? 1 : std::extent::value * sizeofArray::type>( rank - 1 ); } // ###################################################################### //! A macro to use to restrict which types of archives your serialize function will work for. /*! This requires you to have a template class parameter named Archive and replaces the void return type for your serialize function. INTYPE refers to the input archive type you wish to restrict on. OUTTYPE refers to the output archive type you wish to restrict on. For example, if we want to limit a serialize to only work with binary serialization: @code{.cpp} template CEREAL_ARCHIVE_RESTRICT_SERIALIZE(BinaryInputArchive, BinaryOutputArchive) serialize( Archive & ar, MyCoolType & m ) { ar & m; } @endcode */ #define CEREAL_ARCHIVE_RESTRICT_SERIALIZE(INTYPE, OUTTYPE) \ typename std::enable_if::value || std::is_same::value, void>::type } } #endif // CEREAL_DETAILS_TRAITS_HPP_