1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
// *****************************************************************************
/*!
  \file      src/Base/Has.hpp
  \copyright 2012-2015 J. Bakosi,
             2016-2018 Los Alamos National Security, LLC.,
             2019-2021 Triad National Security, LLC.,
             2022-2025 J. Bakosi
             All rights reserved. See the LICENSE file for details.
  \brief     "Has-a" utilities for detecting class internals
  \details   "Has-a" utilities for detecting class internals
*/
// *****************************************************************************
#ifndef Has_h
#define Has_h

#include <type_traits><--- Include file:  not found. Please note: Cppcheck does not need standard library headers to get proper results.

namespace tk {

//! Detect if a type defines type 'alias'
template< typename, typename = std::void_t<> >
struct HasTypedef_alias : std::false_type {};

template< typename T >
struct HasTypedef_alias< T, std::void_t< typename T::alias > >
  : std::true_type {};

template < typename T >
inline constexpr bool HasTypedef_alias_v = HasTypedef_alias< T >::value;


//! Detect if a type defines type 'code'
template< typename, typename = std::void_t<> >
struct HasTypedef_code : std::false_type {};

template< typename T >
struct HasTypedef_code< T, std::void_t< typename T::code > >
  : std::true_type {};

template < typename T >
inline constexpr bool HasTypedef_code_v = HasTypedef_code< T >::value;


//! Detect if a type defines type 'i_am_tagged_tuple'
template< typename, typename = std::void_t<> >
struct HasTypedef_i_am_tagged_tuple : std::false_type {};

template< typename T >
struct HasTypedef_i_am_tagged_tuple< T,
  std::void_t< typename T::i_am_tagged_tuple > > : std::true_type {};

template < typename T >
inline constexpr bool HasTypedef_i_am_tagged_tuple_v =
  HasTypedef_i_am_tagged_tuple< T >::value;


//! Detect if a type defines function 'expect::description()'
template< typename, typename = std::void_t<> >
struct HasFunction_expect_description : std::false_type {};

template< typename T >
struct HasFunction_expect_description< T,
  std::void_t< decltype(std::declval<typename T::expect>().description()) > >
  : std::true_type {};

template < typename T >
inline constexpr bool HasFunction_expect_description_v =
  HasFunction_expect_description< T >::value;


//! Detect if a type defines variable 'expect::lower'
template< typename, typename = std::void_t<> >
struct HasVar_expect_lower : std::false_type {};

template< typename T >
struct HasVar_expect_lower< T,
  std::void_t< decltype(std::declval<typename T::expect>().lower) > >
  : std::true_type {};

template < typename T >
inline constexpr bool HasVar_expect_lower_v = HasVar_expect_lower< T >::value;


//! Detect if a type defines variable 'expect::upper'
template< typename, typename = std::void_t<> >
struct HasVar_expect_upper : std::false_type {};

template< typename T >
struct HasVar_expect_upper< T,
  std::void_t< decltype(std::declval<typename T::expect>().upper) > >
  : std::true_type {};

template < typename T >
inline constexpr bool HasVar_expect_upper_v = HasVar_expect_upper< T >::value;


//! Detect if a type defines function 'expect::choices()'
template< typename, typename = std::void_t<> >
struct HasFunction_expect_choices : std::false_type {};

template< typename T >
struct HasFunction_expect_choices< T,
  std::void_t< decltype(std::declval<typename T::expect>().choices()) > >
  : std::true_type {};

template < typename T >
inline constexpr bool HasFunction_expect_choices_v =
  HasFunction_expect_choices< T >::value;

} // tk::

#endif // Has_h