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())>
90 template<
typename Structure,
typename = _
internal::
void_t<>>
91 struct is_matrix : std::false_type{};
93 template<
typename Structure>
95 <Structure, _internal::void_t<
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>
148 using has_real_elements = is_real_type<vector_element_t<Structure>>;
154 template<
typename Structure,
typename T =
bool>
155 using enable_matrix = std::enable_if_t<is_matrix<Structure>::value, T>;
161 template<
typename Structure,
typename T =
bool>
162 using enable_vector = std::enable_if_t<is_vector<Structure>::value, T>;
166 template<
typename Function>
167 struct extract_func_args;
169 template<
typename Function,
typename... Args>
170 struct extract_func_args<Function(Args...)> {
171 using type = std::tuple<Args...>;
175 namespace _internal {
178 template<
typename Arg,
typename ...Other>
185 template<
typename Function,
typename T,
typename =
void>
186 struct return_type_or_void {
191 template<
typename Function,
typename T>
192 struct return_type_or_void
193 <Function, T, _internal::void_t<decltype(std::declval<Function>()(T(0.0)))>> {
194 using type =
decltype(std::declval<Function>()(T(0.0)));
200 struct func_helper :
public func_helper<decltype(&T::operator())> {};
203 template<
typename ReturnType,
typename ...Args>
204 struct func_helper<ReturnType(Args...)> {
206 using return_type = ReturnType;
207 using args_type = std::tuple<Args...>;
208 using first_arg_type =
typename get_first<Args...>::type;
211 template<
typename ReturnType,
typename ...Args>
212 struct func_helper<ReturnType(*)(Args...)> {
214 using return_type = ReturnType;
215 using args_type = std::tuple<Args...>;
216 using first_arg_type =
typename get_first<Args...>::type;
219 template<
typename Class,
typename ReturnType,
typename ...Args>
220 struct func_helper<ReturnType(Class::*)(Args...) const> {
222 using return_type = ReturnType;
223 using args_type = std::tuple<Args...>;
224 using first_arg_type =
typename get_first<Args...>::type;
231 template<
typename Function>
235 typename _internal::return_type_or_void<Function, real>::type
237 std::true_type, std::false_type
243 template<
typename Function,
typename T =
bool>
244 using enable_real_func =
245 typename std::enable_if_t<is_real_func<Function>::value, T>;
250 template<
typename Function>
251 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:198