Skip to content

Commit cf98494

Browse files
Gabriele Gaetano Fronzématthiasrichter
authored andcommitted
Placing boost serializable type trait in TypeTraits header file
1 parent efe32af commit cf98494

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

Framework/Core/include/Framework/TypeTraits.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
#include <vector>
1515
#include <memory>
1616

17+
#include <boost/archive/binary_iarchive.hpp>
18+
#include <boost/archive/binary_oarchive.hpp>
19+
1720
namespace o2
1821
{
1922
namespace framework
@@ -151,6 +154,48 @@ static std::enable_if_t<sizeof(std::declval<HOLDER>().get_deleter()) != 0, HOLDE
151154
return std::make_unique<T>(std::forward<ARGS>(args)...);
152155
}
153156

157+
// Helper classes to check availability of boost serialization for RawBufferContext for a given type.
158+
// Provides recurrence to correclty unwrap containers of containers ... of container of base type.
159+
//Defining useful void_t template alias
160+
template <typename...>
161+
using void_t = void;
162+
163+
//Base case called by all overloads when needed. Derives from false_type.
164+
template <typename Type, typename Archive = boost::archive::binary_oarchive, typename = void_t<>>
165+
struct is_boost_serializable_base : std::false_type {
166+
};
167+
168+
//Check if provided type implements a boost serialize method directly
169+
template <class Type, typename Archive>
170+
struct is_boost_serializable_base<Type, Archive,
171+
void_t<decltype(std::declval<Type&>().serialize(std::declval<Archive&>(), 0))>>
172+
: std::true_type {
173+
};
174+
175+
// //Check if provided type is trivial (aka doesn't need a boost deserializer)
176+
// template <class Type, typename Archive>
177+
// struct is_boost_serializable_base<Type, Archive,
178+
// typename std::enable_if<boost::serialization::is_bitwise_serializable<typename Type::value_type>::value>::type>
179+
// : std::true_type {
180+
// };
181+
182+
//Base implementation to provided recurrence. Wraps around base templates
183+
template <class Type, typename Archive = boost::archive::binary_oarchive, typename = void_t<>>
184+
struct is_boost_serializable
185+
: is_boost_serializable_base<Type, Archive> {
186+
};
187+
188+
//Call base implementation in contained class/type if possible
189+
template <class Type, typename Archive>
190+
struct is_boost_serializable<Type, Archive, void_t<typename Type::value_type>>
191+
: is_boost_serializable<typename Type::value_type, Archive> {
192+
};
193+
194+
//Call base implementation in contained class/type if possible. Added default archive type for convenience
195+
template <class Type>
196+
struct is_boost_serializable<Type, boost::archive::binary_oarchive, void_t<typename Type::value_type>>
197+
: is_boost_serializable<typename Type::value_type, boost::archive::binary_oarchive> {
198+
};
154199
} // namespace framework
155200
} // namespace o2
156201
#endif // FRAMEWORK_TYPETRAITS_H

0 commit comments

Comments
 (0)