|
14 | 14 | #include <vector> |
15 | 15 | #include <memory> |
16 | 16 |
|
| 17 | +#include <boost/archive/binary_iarchive.hpp> |
| 18 | +#include <boost/archive/binary_oarchive.hpp> |
| 19 | + |
17 | 20 | namespace o2 |
18 | 21 | { |
19 | 22 | namespace framework |
@@ -151,6 +154,48 @@ static std::enable_if_t<sizeof(std::declval<HOLDER>().get_deleter()) != 0, HOLDE |
151 | 154 | return std::make_unique<T>(std::forward<ARGS>(args)...); |
152 | 155 | } |
153 | 156 |
|
| 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 | +}; |
154 | 199 | } // namespace framework |
155 | 200 | } // namespace o2 |
156 | 201 | #endif // FRAMEWORK_TYPETRAITS_H |
0 commit comments