tinyopt
700
Tinyopt, a lightweight, header only optimization library
Toggle main menu visibility
Loading...
Searching...
No Matches
type_traits.h
1
// Copyright 2026 Julien Michot.
2
// SPDX-License-Identifier: Apache-2.0
3
4
#pragma once
5
6
#include <type_traits>
7
#include <utility>
8
#include <ostream>
9
#include <tuple>
10
#include <array>
11
#include <vector>
12
13
namespace
tinyopt::traits {
14
15
// Check whether a type 'T' or '&T' is nullptr_t.
16
template
<
typename
T>
17
struct
is_nullptr_t
: std::is_same<std::decay_t<T>, std::nullptr_t> {};
18
template
<
typename
T>
19
inline
constexpr
bool
is_nullptr_v =
is_nullptr_t<T>::value
;
20
21
// Check whether a type 'T' or '&T' is a bool.
22
template
<
typename
T>
23
struct
is_bool
: std::is_same<std::decay_t<T>, bool> {};
24
template
<
typename
T>
25
inline
constexpr
bool
is_bool_v =
is_bool<T>::value
;
26
27
// Check whether a type 'T' or '&T' is a scalar.
28
template
<
typename
T>
29
struct
is_scalar
: std::is_scalar<std::decay_t<T>> {};
30
template
<
typename
T>
31
inline
constexpr
bool
is_scalar_v =
is_scalar<T>::value
;
32
33
// Trait to detect std::pair.
34
template
<
typename
T>
35
struct
is_pair
: std::false_type {};
36
template
<
typename
T,
typename
U>
37
struct
is_pair
<std::pair<T, U>> : std::true_type {};
38
template
<
typename
T>
39
inline
constexpr
bool
is_pair_v =
is_pair<std::remove_cvref_t<T>
>::value;
40
41
// Trait to detect std::tuple.
42
template
<
typename
T>
43
struct
is_tuple
: std::false_type {};
44
template
<
typename
... Ts>
45
struct
is_tuple
<std::tuple<Ts...>> : std::true_type {};
46
template
<
typename
T>
47
inline
constexpr
bool
is_tuple_v =
is_tuple<std::remove_cvref_t<T>
>::value;
48
49
// Trait to detect if a type is streamable.
50
template
<
typename
T,
typename
=
void
>
51
struct
is_streamable
: std::false_type {};
52
53
template
<
typename
T>
54
struct
is_streamable
<T, std::void_t<decltype(std::declval<std::ostream&>() << std::declval<T>())>>
55
: std::true_type {};
56
57
template <typename T>
58
inline constexpr bool is_streamable_v = is_streamable<T>::value;
59
60
// Trait to check if a type has a cast method.
61
template <typename T, typename = void>
62
struct has_cast : std::false_type {};
63
64
template <typename T>
65
struct has_cast<T, std::void_t<decltype(std::declval<const T>().template cast<int>())>>
66
: std::true_type {};
67
68
template <typename T>
69
inline constexpr bool has_cast_v = has_cast<T>::value;
70
71
template <typename T, typename = void>
72
struct has_static_cast : std::false_type {};
73
74
template <typename T>
75
struct has_static_cast<T,
76
std::void_t<decltype(T::template cast<float>(std::declval<const T&>()))>>
77
: std::true_type {};
78
79
template <typename T>
80
inline constexpr bool has_static_cast_v = has_static_cast<T>::value;
81
82
}
// namespace tinyopt::traits
tinyopt::traits::is_bool
Definition
type_traits.h:23
tinyopt::traits::is_nullptr_t
Definition
type_traits.h:17
tinyopt::traits::is_pair
Definition
type_traits.h:35
tinyopt::traits::is_scalar
Definition
type_traits.h:29
tinyopt::traits::is_streamable
Definition
type_traits.h:51
tinyopt::traits::is_tuple
Definition
type_traits.h:43
include
tinyopt
traits
type_traits.h
Generated by
1.18.0