Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-04-19 09:13:37

0001 // -*- C++ -*-
0002 //
0003 // This file is part of YODA -- Yet more Objects for Data Analysis
0004 // Copyright (C) 2008-2024 The YODA collaboration (see AUTHORS for details)
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   /// SFINAE definition of dereferenceability trait, cf. Boost has_dereference
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   /// SFINAE struct to check for dereferencing to an AnalysisObject (reference) at compile time
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   // The following would not be enough since it doesn't work with e.g. Histo1D*:
0031   // struct DerefableToAO<T, typename std::decay< decltype(*std::declval<T>()) >::type > : std::true_type {};
0032 
0033 
0034   // SFINAE struct to check for iterator concept at compile time
0035   // Also works for C-style arrays.
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   // SFINAE struct to check for const_iterator concept at compile time
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   // SFINAE struct to check for pushing concept at compile time
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   // SFINAE struct to check for concept of fill dimension at compile time
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