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>
45 <Structure, _internal::void_t<
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>
57 <Structure, _internal::void_t<
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>
69 <Structure, _internal::void_t<
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>
81 <Structure, _internal::void_t<
82 decltype(std::declval<Structure>()[0]),
83 decltype(std::declval<Structure>().size())>
87#ifdef THEORETICA_HAS_CPP20
92 template<
typename Structure>
93 concept VectorType =
requires (Structure v) {
104 template<
typename Structure,
typename = _
internal::
void_t<>>
105 struct is_matrix : std::false_type{};
107 template<
typename Structure>
109 <Structure, _internal::void_t<
110 decltype(std::declval<Structure>()(0, 0)),
111 decltype(std::declval<Structure>().rows()),
112 decltype(std::declval<Structure>().cols())>
113 > : std::true_type{};
116#ifdef THEORETICA_HAS_CPP20
121 template<
typename Structure>
122 concept MatrixType =
requires (Structure v) {
131 namespace _internal {
134 template<
typename Structure,
typename =
void>
135 struct vector_element_or_void {
141 template<
typename Structure>
142 struct vector_element_or_void
143 <Structure, _internal::void_t<decltype(std::declval<Structure&>()[0])>> {
144 using type = std::remove_reference_t<decltype(std::declval<Structure>()[0])>;
150 template<
typename Structure>
151 using vector_element_or_void_t =
152 typename _internal::vector_element_or_void<Structure>::type;
156 template<
typename Structure>
157 using vector_element_t =
158 std::remove_reference_t<decltype(std::declval<Structure>()[0])>;
162 template<
typename Structure>
163 using matrix_element_t =
164 std::remove_reference_t<decltype(std::declval<Structure>()(0, 0))>;
169 template<
typename Structure,
typename Type>
170 struct has_type_elements
171 : std::is_same<vector_element_t<Structure>, Type> {};
176 template<
typename Structure>
177 using has_real_elements = is_real_type<vector_element_t<Structure>>;
183 template<
typename Type,
typename T =
bool>
184 using enable_real = std::enable_if_t<is_real_type<Type>::value, T>;
190 template<
typename Structure,
typename T =
bool>
191 using enable_matrix = std::enable_if_t<is_matrix<Structure>::value, T>;
197 template<
typename Structure,
typename T =
bool>
198 using enable_vector = std::enable_if_t<is_vector<Structure>::value, T>;
204 template<
typename Structure,
typename T =
bool>
205 using disable_vector = std::enable_if_t<!is_vector<Structure>::value, T>;
208 namespace _internal {
211 template<
typename Arg,
typename ...Other>
217 template<
typename Function,
typename T,
typename =
void>
218 struct return_type_or_void {
223 template<
typename Function,
typename T>
224 struct return_type_or_void
225 <Function, T, _internal::void_t<decltype(std::declval<Function>()(T(0.0)))>> {
226 using type =
decltype(std::declval<Function>()(T(0.0)));
231 template <
typename T>
struct func_helper;
233 template <
typename R,
typename... Args>
234 struct func_helper<R(Args...)> {
237 using return_type = R;
240 using args_tuple = std::tuple<Args...>;
243 using first_arg_type =
typename get_first<Args...>::type;
246 static constexpr std::size_t arity =
sizeof...(Args);
249 template <
typename R,
typename... Args>
250 struct func_helper<R(*)(Args...)> : func_helper<R(Args...)> {};
252 template <
typename C,
typename R,
typename... Args>
253 struct func_helper<R(C::*)(Args...) const> : func_helper<R(Args...)> {};
255 template <
typename T>
256 struct func_helper : func_helper<decltype(&T::operator())> {};
263 template<
typename Function>
267 typename _internal::return_type_or_void<Function, real>::type
269 std::true_type, std::false_type
275 template<
typename Function,
typename T =
bool>
276 using enable_real_func =
277 typename std::enable_if_t<is_real_func<Function>::value, T>;
282 template<
typename Function>
283 using return_type_t =
typename _internal::func_helper<Function>::return_type;
287 template<
typename Function>
288 using first_arg_t =
typename _internal::func_helper<Function>::first_arg_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