mirror of
https://github.com/USCiLab/cereal.git
synced 2025-10-18 01:45:52 +02:00
Fixed a bug relating to overload resolution for loading types. ProcessImpl was taking a universal reference and the
type traits were failing on T& as opposed to a T. loading's processimpl now only takes refs. we still let op() take r-values in case someone passes it an nvp or something
This commit is contained in:
@@ -230,7 +230,7 @@ namespace cereal
|
|||||||
//! Serialization of a virtual_base_class wrapper
|
//! Serialization of a virtual_base_class wrapper
|
||||||
/*! \sa virtual_base_class */
|
/*! \sa virtual_base_class */
|
||||||
template <class T> inline
|
template <class T> inline
|
||||||
ArchiveType & processImpl(virtual_base_class<T> b)
|
ArchiveType & processImpl(virtual_base_class<T> const & b)
|
||||||
{
|
{
|
||||||
traits::detail::base_class_id id(b.base_ptr);
|
traits::detail::base_class_id id(b.base_ptr);
|
||||||
if(itsBaseClassSet.count(id) == 0)
|
if(itsBaseClassSet.count(id) == 0)
|
||||||
@@ -244,7 +244,7 @@ namespace cereal
|
|||||||
//! Serialization of a base_class wrapper
|
//! Serialization of a base_class wrapper
|
||||||
/*! \sa base_class */
|
/*! \sa base_class */
|
||||||
template <class T> inline
|
template <class T> inline
|
||||||
ArchiveType & processImpl(base_class<T> b)
|
ArchiveType & processImpl(base_class<T> const & b)
|
||||||
{
|
{
|
||||||
self->processImpl( *b.base_ptr );
|
self->processImpl( *b.base_ptr );
|
||||||
return *self;
|
return *self;
|
||||||
@@ -450,7 +450,7 @@ namespace cereal
|
|||||||
//! Serialization of a virtual_base_class wrapper
|
//! Serialization of a virtual_base_class wrapper
|
||||||
/*! \sa virtual_base_class */
|
/*! \sa virtual_base_class */
|
||||||
template <class T> inline
|
template <class T> inline
|
||||||
ArchiveType & processImpl(virtual_base_class<T> b)
|
ArchiveType & processImpl(virtual_base_class<T> & b)
|
||||||
{
|
{
|
||||||
traits::detail::base_class_id id(b.base_ptr);
|
traits::detail::base_class_id id(b.base_ptr);
|
||||||
if(itsBaseClassSet.count(id) == 0)
|
if(itsBaseClassSet.count(id) == 0)
|
||||||
@@ -464,7 +464,7 @@ namespace cereal
|
|||||||
//! Serialization of a base_class wrapper
|
//! Serialization of a base_class wrapper
|
||||||
/*! \sa base_class */
|
/*! \sa base_class */
|
||||||
template <class T> inline
|
template <class T> inline
|
||||||
ArchiveType & processImpl(base_class<T> b)
|
ArchiveType & processImpl(base_class<T> & b)
|
||||||
{
|
{
|
||||||
self->processImpl( *b.base_ptr );
|
self->processImpl( *b.base_ptr );
|
||||||
return *self;
|
return *self;
|
||||||
@@ -476,7 +476,7 @@ namespace cereal
|
|||||||
typename std::enable_if<traits::is_specialized_member_serialize<T, ArchiveType>() ||
|
typename std::enable_if<traits::is_specialized_member_serialize<T, ArchiveType>() ||
|
||||||
(traits::is_input_serializable<T, ArchiveType>() && traits::has_member_serialize<T, ArchiveType>()),
|
(traits::is_input_serializable<T, ArchiveType>() && traits::has_member_serialize<T, ArchiveType>()),
|
||||||
ArchiveType &>::type
|
ArchiveType &>::type
|
||||||
processImpl(T && t)
|
processImpl(T & t)
|
||||||
{
|
{
|
||||||
access::member_serialize(*self, t);
|
access::member_serialize(*self, t);
|
||||||
return *self;
|
return *self;
|
||||||
@@ -487,9 +487,9 @@ namespace cereal
|
|||||||
typename std::enable_if<traits::is_specialized_non_member_serialize<T, ArchiveType>() ||
|
typename std::enable_if<traits::is_specialized_non_member_serialize<T, ArchiveType>() ||
|
||||||
(traits::is_input_serializable<T, ArchiveType>() && traits::has_non_member_serialize<T, ArchiveType>()),
|
(traits::is_input_serializable<T, ArchiveType>() && traits::has_non_member_serialize<T, ArchiveType>()),
|
||||||
ArchiveType &>::type
|
ArchiveType &>::type
|
||||||
processImpl(T && t)
|
processImpl(T & t)
|
||||||
{
|
{
|
||||||
serialize(*self, std::forward<T>(t));
|
serialize(*self, t);
|
||||||
return *self;
|
return *self;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -498,7 +498,7 @@ namespace cereal
|
|||||||
typename std::enable_if<traits::is_specialized_member_load_save<T, ArchiveType>() ||
|
typename std::enable_if<traits::is_specialized_member_load_save<T, ArchiveType>() ||
|
||||||
(traits::is_input_serializable<T, ArchiveType>() && traits::has_member_load<T, ArchiveType>()),
|
(traits::is_input_serializable<T, ArchiveType>() && traits::has_member_load<T, ArchiveType>()),
|
||||||
ArchiveType &>::type
|
ArchiveType &>::type
|
||||||
processImpl(T && t)
|
processImpl(T & t)
|
||||||
{
|
{
|
||||||
access::member_load(*self, t);
|
access::member_load(*self, t);
|
||||||
return *self;
|
return *self;
|
||||||
@@ -509,9 +509,9 @@ namespace cereal
|
|||||||
typename std::enable_if<traits::is_specialized_non_member_load_save<T, ArchiveType>() ||
|
typename std::enable_if<traits::is_specialized_non_member_load_save<T, ArchiveType>() ||
|
||||||
(traits::is_input_serializable<T, ArchiveType>() && traits::has_non_member_load<T, ArchiveType>()),
|
(traits::is_input_serializable<T, ArchiveType>() && traits::has_non_member_load<T, ArchiveType>()),
|
||||||
ArchiveType &>::type
|
ArchiveType &>::type
|
||||||
processImpl(T && t)
|
processImpl(T & t)
|
||||||
{
|
{
|
||||||
load(*self, std::forward<T>(t));
|
load(*self, t);
|
||||||
return *self;
|
return *self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -153,12 +153,23 @@ struct DerivedVirtual : public virtual BaseVirtual
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct TestType
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
template <class Archive>
|
||||||
|
void serialize( Archive & ar )
|
||||||
|
{
|
||||||
|
ar( x );
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
namespace cereal
|
namespace cereal
|
||||||
{
|
{
|
||||||
template <class Archive> struct specialize<Archive, DerivedVirtual, cereal::specialization::member_load_save> {};
|
template <class Archive> struct specialize<Archive, DerivedVirtual, cereal::specialization::member_load_save> {};
|
||||||
|
template <class Archive> struct specialize<Archive, TestType, cereal::specialization::member_serialize> {};
|
||||||
}
|
}
|
||||||
|
|
||||||
//CEREAL_REGISTER_TYPE(DerivedVirtual);
|
CEREAL_REGISTER_TYPE(DerivedVirtual);
|
||||||
|
|
||||||
template <class T> void nop(T&&) {}
|
template <class T> void nop(T&&) {}
|
||||||
|
|
||||||
@@ -166,19 +177,20 @@ int main()
|
|||||||
{
|
{
|
||||||
std::cout << std::boolalpha;
|
std::cout << std::boolalpha;
|
||||||
|
|
||||||
std::cout << cereal::traits::is_specialized_member_load_save<DerivedVirtual, cereal::BinaryOutputArchive>() << std::endl;
|
std::cout << cereal::traits::is_specialized_member_load_save<DerivedVirtual, cereal::BinaryInputArchive>() << std::endl;
|
||||||
//std::cout << cereal::traits::is_specialized_non_member_serialize<DerivedVirtual, cereal::BinaryOutputArchive>() << std::endl;
|
std::cout << cereal::traits::is_specialized_member_load_save<DerivedVirtual&, cereal::BinaryInputArchive>() << std::endl;
|
||||||
std::cout << cereal::traits::is_output_serializable<DerivedVirtual, cereal::BinaryOutputArchive>() << std::endl;
|
//std::cout << cereal::traits::is_specialized_non_member_serialize<DerivedVirtual, cereal::BinaryInputArchive>() << std::endl;
|
||||||
//std::cout << cereal::traits::has_non_member_serialize<DerivedVirtual, cereal::BinaryOutputArchive>() << std::endl;
|
//std::cout << cereal::traits::is_input_serializable<DerivedVirtual, cereal::BinaryInputArchive>() << std::endl;
|
||||||
//std::cout << cereal::traits::is_specialized_member_serialize<DerivedVirtual, cereal::BinaryOutputArchive>() << std::endl;
|
//std::cout << cereal::traits::has_non_member_serialize<DerivedVirtual, cereal::BinaryInputArchive>() << std::endl;
|
||||||
std::cout << cereal::traits::has_member_serialize<DerivedVirtual, cereal::BinaryOutputArchive>() << std::endl;
|
//std::cout << cereal::traits::is_specialized_member_serialize<DerivedVirtual, cereal::BinaryInputArchive>() << std::endl;
|
||||||
|
std::cout << cereal::traits::has_member_serialize<DerivedVirtual, cereal::BinaryInputArchive>() << std::endl;
|
||||||
|
|
||||||
std::cout << "sssssssssssss" <<std::endl;
|
std::cout << "sssssssssssss" <<std::endl;
|
||||||
std::cout << cereal::traits::has_member_save<DerivedVirtual, cereal::BinaryOutputArchive>() << std::endl;
|
|
||||||
std::cout << cereal::traits::is_non_const_member_save<DerivedVirtual, cereal::BinaryOutputArchive>() << std::endl;
|
std::cout << cereal::traits::has_member_load<DerivedVirtual, cereal::BinaryInputArchive>() << std::endl;
|
||||||
std::cout << cereal::traits::detail::has_member_save_any<DerivedVirtual, cereal::BinaryOutputArchive>() << std::endl;
|
//std::cout << cereal::traits::has_non_member_load<DerivedVirtual, cereal::BinaryInputArchive>() << std::endl;
|
||||||
std::cout << cereal::traits::has_non_member_save<DerivedVirtual, cereal::BinaryOutputArchive>() << std::endl;
|
std::cout << cereal::traits::has_member_serialize<DerivedVirtual, cereal::BinaryInputArchive>() << std::endl;
|
||||||
std::cout << cereal::traits::has_member_serialize<DerivedVirtual, cereal::BinaryOutputArchive>() << std::endl;
|
//std::cout << cereal::traits::has_non_member_serialize<DerivedVirtual, cereal::BinaryInputArchive>() << std::endl;
|
||||||
std::cout << cereal::traits::has_non_member_serialize<DerivedVirtual, cereal::BinaryOutputArchive>() << std::endl;
|
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user