tinyopt 700
Tinyopt, a lightweight, header only optimization library
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
13namespace tinyopt::traits {
14
15// Check whether a type 'T' or '&T' is nullptr_t.
16template <typename T>
17struct is_nullptr_t : std::is_same<std::decay_t<T>, std::nullptr_t> {};
18template <typename T>
19inline constexpr bool is_nullptr_v = is_nullptr_t<T>::value;
20
21// Check whether a type 'T' or '&T' is a bool.
22template <typename T>
23struct is_bool : std::is_same<std::decay_t<T>, bool> {};
24template <typename T>
25inline constexpr bool is_bool_v = is_bool<T>::value;
26
27// Check whether a type 'T' or '&T' is a scalar.
28template <typename T>
29struct is_scalar : std::is_scalar<std::decay_t<T>> {};
30template <typename T>
31inline constexpr bool is_scalar_v = is_scalar<T>::value;
32
33// Trait to detect std::pair.
34template <typename T>
35struct is_pair : std::false_type {};
36template <typename T, typename U>
37struct is_pair<std::pair<T, U>> : std::true_type {};
38template <typename T>
39inline constexpr bool is_pair_v = is_pair<std::remove_cvref_t<T>>::value;
40
41// Trait to detect std::tuple.
42template <typename T>
43struct is_tuple : std::false_type {};
44template <typename... Ts>
45struct is_tuple<std::tuple<Ts...>> : std::true_type {};
46template <typename T>
47inline constexpr bool is_tuple_v = is_tuple<std::remove_cvref_t<T>>::value;
48
49// Trait to detect if a type is streamable.
50template <typename T, typename = void>
51struct is_streamable : std::false_type {};
52
53template <typename T>
54struct is_streamable<T, std::void_t<decltype(std::declval<std::ostream&>() << std::declval<T>())>>
55 : std::true_type {};
56
57template <typename T>
58inline constexpr bool is_streamable_v = is_streamable<T>::value;
59
60// Trait to check if a type has a cast method.
61template <typename T, typename = void>
62struct has_cast : std::false_type {};
63
64template <typename T>
65struct has_cast<T, std::void_t<decltype(std::declval<const T>().template cast<int>())>>
66 : std::true_type {};
67
68template <typename T>
69inline constexpr bool has_cast_v = has_cast<T>::value;
70
71template <typename T, typename = void>
72struct has_static_cast : std::false_type {};
73
74template <typename T>
75struct has_static_cast<T,
76 std::void_t<decltype(T::template cast<float>(std::declval<const T&>()))>>
77 : std::true_type {};
78
79template <typename T>
80inline constexpr bool has_static_cast_v = has_static_cast<T>::value;
81
82} // namespace tinyopt::traits
Definition type_traits.h:23
Definition type_traits.h:17
Definition type_traits.h:35
Definition type_traits.h:29
Definition type_traits.h:51
Definition type_traits.h:43