6#ifndef THEORETICA_CORE_TRAITS_H
7#define THEORETICA_CORE_TRAITS_H
20 template<
typename ...Args>
21 struct make_void {
typedef void type; };
23 template<
typename ...Args>
24 using void_t =
typename make_void<
Args...>::type;
28 template<
typename Type>
29 struct is_real_type : std::is_floating_point<Type> {};
34 struct is_real_type<
real> : std::true_type {};
39 template<
typename Structure,
typename = _
internal::
void_t<>>
40 struct is_orderable : std::false_type{};
43 template<
typename Structure>
46 decltype(std::declval<Structure>() < std::declval<Structure>())>
52 template<
typename Structure,
typename = _
internal::
void_t<>>
53 struct is_indexable : std::false_type{};
55 template<
typename Structure>
58 decltype(std::declval<Structure>()[0])>
64 template<
typename Structure,
typename = _
internal::
void_t<>>
65 struct is_iterable : std::false_type{};
67 template<
typename Structure>
70 decltype(std::declval<Structure>().begin())>
76 template<
typename Structure,
typename = _
internal::
void_t<>>
77 struct is_vector : std::false_type{};
79 template<
typename Structure>
82 decltype(std::declval<Structure>()[0]),
83 decltype(std::declval<Structure>().size())>
90 template<
typename Structure,
typename = _
internal::
void_t<>>
91 struct is_matrix : std::false_type{};
93 template<
typename Structure>
96 decltype(std::declval<Structure>()(0, 0)),
97 decltype(std::declval<Structure>().rows()),
98 decltype(std::declval<Structure>().cols())>
102 namespace _internal {
105 template<
typename Structure,
typename =
void>
106 struct vector_element_or_void {
112 template<
typename Structure>
113 struct vector_element_or_void
114 <
Structure, _internal::void_t<decltype(std::declval<Structure&>()[0])>> {
115 using type = std::remove_reference_t<decltype(std::declval<Structure>()[0])>;
121 template<
typename Structure>
122 using vector_element_or_void_t =
123 typename _internal::vector_element_or_void<Structure>::type;
127 template<
typename Structure>
128 using vector_element_t =
129 std::remove_reference_t<decltype(std::declval<Structure>()[0])>;
133 template<
typename Structure>
134 using matrix_element_t =
135 std::remove_reference_t<decltype(std::declval<Structure>()(0, 0))>;
140 template<
typename Structure,
typename Type>
141 struct has_type_elements
142 : std::is_same<vector_element_t<Structure>, Type> {};
147 template<
typename Structure>
154 template<
typename Type,
typename T =
bool>
155 using enable_real = std::enable_if_t<is_real_type<Type>::value,
T>;
161 template<
typename Structure,
typename T =
bool>
162 using enable_matrix = std::enable_if_t<is_matrix<Structure>::value,
T>;
168 template<
typename Structure,
typename T =
bool>
169 using enable_vector = std::enable_if_t<is_vector<Structure>::value,
T>;
175 template<
typename Structure,
typename T =
bool>
176 using disable_vector = std::enable_if_t<!is_vector<Structure>::value,
T>;
179 namespace _internal {
182 template<
typename Arg,
typename ...Other>
188 template<
typename Function,
typename T,
typename =
void>
189 struct return_type_or_void {
194 template<
typename Function,
typename T>
195 struct return_type_or_void
196 <
Function,
T, _internal::void_t<decltype(std::declval<Function>()(T(0.0)))>> {
197 using type =
decltype(std::declval<Function>()(
T(0.0)));
202 template <
typename T>
struct func_helper;
204 template <
typename R,
typename...
Args>
205 struct func_helper<
R(
Args...)> {
208 using return_type =
R;
211 using args_tuple = std::tuple<
Args...>;
214 using first_arg_type =
typename get_first<
Args...>::type;
217 static constexpr std::size_t arity =
sizeof...(Args);
220 template <
typename R,
typename...
Args>
221 struct func_helper<
R(*)(
Args...)> : func_helper<
R(
Args...)> {};
223 template <
typename C,
typename R,
typename...
Args>
224 struct func_helper<
R(
C::*)(Args...)
const> : func_helper<R(Args...)> {};
226 template <
typename T>
227 struct func_helper : func_helper<decltype(&T::operator())> {};
234 template<
typename Function>
238 typename _internal::return_type_or_void<Function, real>::type
240 std::true_type, std::false_type
246 template<
typename Function,
typename T =
bool>
247 using enable_real_func =
248 typename std::enable_if_t<is_real_func<Function>::value,
T>;
253 template<
typename Function>
254 using return_type_t =
typename _internal::func_helper<Function>::return_type;
Mathematical constants and default algorithm parameters.
Main namespace of the library which contains all functions and objects.
Definition algebra.h:27
double real
A real number, defined as a floating point type.
Definition constants.h:207
Vector make_error()
Create a vector representing an error state, with all NaN values.
Definition algebra.h:103