yoda is hosted by Hepforge, IPPP Durham
YODA - Yet more Objects for Data Analysis 2.0.3
MetaUtils Namespace Reference

Namespaces

namespace  detail
 Traits detection. Check's whether expression is valid for type T.
 
namespace  operatorTraits
 

Classes

struct  conjunction
 Logical conjuction implementation. More...
 
struct  conjunction< B1 >
 
struct  conjunction< B1, Bn... >
 
struct  nonesuch
 

Typedefs

template<typename T , template< typename ... > class U>
using is_instance = is_instance_impl< std::decay_t< T >, U >
 Detects if type T is an instance of template U.
 
template<template< class... > class Op, class... Args>
using is_detected = typename detail::detector< nonesuch, void, Op, Args... >::value_t
 
template<template< class... > class Op, class... Args>
using detected_t = typename detail::detector< nonesuch, void, Op, Args... >::type
 
template<class Default , template< class... > class Op, class... Args>
using detected_or = detail::detector< Default, void, Op, Args... >
 
template<class Expected , template< class... > class Op, class... Args>
using is_detected_exact = std::is_same< Expected, detected_t< Op, Args... > >
 

Functions

template<class Func , std::size_t... Is>
constexpr void staticForImpl (Func &&f, std::index_sequence< Is... >)
 
template<size_t N, class Func >
constexpr void staticFor (Func &&f)
 Used to apply functor on tuple. Calls lambda with integral constant, which can be used to query tuple elements via std::get<I>(), and thus iterate over tuple.
 
template<typename T , template< class U > class Concept>
constexpr bool checkConcept ()
 checks whether if T satisfies user defined Concept
 
int check (bool pred, const char *funcName)
 
template<size_t I, typename... Ts>
auto removeTupleElement (const std::tuple< Ts... > &tup)
 

Variables

template<template< class... > class Op, class... Args>
constexpr bool is_detected_v = is_detected<Op, Args...>::value
 

Detailed Description

Todo:
Merge with Traits.h

Typedef Documentation

◆ detected_or

template<class Default , template< class... > class Op, class... Args>
using MetaUtils::detected_or = typedef detail::detector<Default, void, Op, Args...>

Definition at line 98 of file MetaUtils.h.

◆ detected_t

template<template< class... > class Op, class... Args>
using MetaUtils::detected_t = typedef typename detail::detector<nonesuch, void, Op, Args...>::type

Definition at line 95 of file MetaUtils.h.

◆ is_detected

template<template< class... > class Op, class... Args>
using MetaUtils::is_detected = typedef typename detail::detector<nonesuch, void, Op, Args...>::value_t

Definition at line 92 of file MetaUtils.h.

◆ is_detected_exact

template<class Expected , template< class... > class Op, class... Args>
using MetaUtils::is_detected_exact = typedef std::is_same<Expected, detected_t<Op, Args...> >

Definition at line 101 of file MetaUtils.h.

◆ is_instance

template<typename T , template< typename ... > class U>
using MetaUtils::is_instance = typedef is_instance_impl<std::decay_t<T>, U>

Detects if type T is an instance of template U.

Definition at line 89 of file MetaUtils.h.

Function Documentation

◆ check()

int MetaUtils::check ( bool  pred,
const char *  funcName 
)
inline

Definition at line 115 of file MetaUtils.h.

115 {
116 if (pred == false)
117 std::clog << funcName << " FAILED\n";
118 return (int)(pred ? EXIT_SUCCESS : EXIT_FAILURE);
119 }

◆ checkConcept()

template<typename T , template< class U > class Concept>
constexpr bool MetaUtils::checkConcept ( )
constexpr

checks whether if T satisfies user defined Concept

Note
Concept check should appear inside body of type's member function or outside of type, since otherwise type is considered incomplete.

Definition at line 111 of file MetaUtils.h.

111 {
112 return Concept<T>::checkResult::value;
113 }

◆ removeTupleElement()

template<size_t I, typename... Ts>
auto MetaUtils::removeTupleElement ( const std::tuple< Ts... > &  tup)

Definition at line 148 of file MetaUtils.h.

148 {
149 return _removeTupleElement<I>(tup, std::make_index_sequence<sizeof...(Ts)>{});
150 }

◆ staticFor()

template<size_t N, class Func >
constexpr void MetaUtils::staticFor ( Func &&  f)
constexpr

Used to apply functor on tuple. Calls lambda with integral constant, which can be used to query tuple elements via std::get<I>(), and thus iterate over tuple.

To use, create lambda which captures every necessary variable by referenrece (or value) and has (auto I) parameter. Then use I inside lambda to call templated functions.

Definition at line 35 of file MetaUtils.h.

35 {
36 staticForImpl(std::forward<Func>(f),
37 std::make_index_sequence<N>{});
38 }
constexpr void staticForImpl(Func &&f, std::index_sequence< Is... >)
Definition MetaUtils.h:14

References staticForImpl().

Referenced by YODA::containsNan().

◆ staticForImpl()

template<class Func , std::size_t... Is>
constexpr void MetaUtils::staticForImpl ( Func &&  f,
std::index_sequence< Is... >   
)
constexpr

Definition at line 14 of file MetaUtils.h.

15 {
16 // Use C++17 fold expressions to apply Func f
17 // to all Is... in sequence
18 //
19 // Won't work on empty tuple (Binning is not intended to work with 0 dimensions).
20 //
21 // std::integral_constant used to encode value into type, otherwise it's not
22 // possible to use Is inside functor as consant expression
23 // (std::get<Is> etc. won't work)
24
25 ((void)f(std::integral_constant<std::size_t, Is>()), ...);
26 }

Referenced by staticFor().

Variable Documentation

◆ is_detected_v

template<template< class... > class Op, class... Args>
constexpr bool MetaUtils::is_detected_v = is_detected<Op, Args...>::value
constexpr

Definition at line 104 of file MetaUtils.h.