File indexing completed on 2025-04-19 09:13:37
0001
0002
0003
0004
0005
0006 #ifndef YODA_TRAITS_H
0007 #define YODA_TRAITS_H
0008
0009 #include "YODA/AnalysisObject.h"
0010 #include <type_traits>
0011
0012 namespace YODA {
0013
0014
0015 template <typename T, typename=void>
0016 struct Derefable : std::false_type {};
0017
0018 template <typename T>
0019 struct Derefable<T, std::void_t< decltype(*std::declval<T>())> > : std::true_type {};
0020
0021
0022
0023 template <typename T, typename=AnalysisObject>
0024 struct DerefableToAO : std::false_type {};
0025
0026 template <typename T>
0027 struct DerefableToAO<T, typename std::conditional<std::is_base_of<AnalysisObject,
0028 typename std::decay< decltype(*std::declval<T>()) >::type>::value,
0029 AnalysisObject, void>::type> : std::true_type {};
0030
0031
0032
0033
0034
0035
0036 template<typename T, typename = void>
0037 struct Iterable : std::false_type { };
0038
0039 template<typename T>
0040 struct Iterable<T, std::void_t<std::decay_t<decltype(std::begin(std::declval<const T&>()))>,
0041 std::decay_t<decltype(std::end(std::declval<const T&>()))>>> : std::true_type { };
0042
0043 template<typename... T>
0044 inline constexpr bool isIterable = std::conjunction<Iterable<T>...>::value;
0045
0046
0047 template<typename T, typename = void>
0048 struct CIterable : std::false_type { };
0049
0050 template<typename T>
0051 struct CIterable<T, std::void_t<decltype(std::declval<typename T::const_iterator>())>> : std::true_type { };
0052
0053 template<typename... T>
0054 inline constexpr bool isCIterable = std::conjunction<CIterable<T>...>::value;
0055
0056
0057 template<typename T, typename VAL, typename = void>
0058 struct Pushable : std::false_type { };
0059
0060 template<typename T, typename VAL>
0061 struct Pushable<T, VAL, std::void_t<decltype(std::declval<T>().push_back( std::declval<VAL>() ))>>
0062 : std::true_type { };
0063
0064
0065 template<typename T, typename = void>
0066 struct hasFillDim : std::false_type { };
0067
0068 template<typename T>
0069 struct hasFillDim<T, std::void_t<decltype(typename T::FillDim{})>> : std::true_type { };
0070
0071 }
0072
0073 #endif