#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(); } constexpr std::false_type is_smart_ptr(...) { return {}; } template constexpr std::true_type is_smart_ptr( std::unique_ptr const & p ) { return {}; } template constexpr std::true_type is_smart_ptr( std::shared_ptr const & p ) { return {}; } //! Returns true if the type T is a pointer or smart pointer (in std library) template constexpr bool is_any_pointer() { return std::is_pointer() || std::is_same() ))>::value; } } } #endif // CEREAL_DETAILS_TRAITS_HPP_