15namespace sequoia::physics
18 struct associated_displacement_space;
34 typename T::validator_type;
49namespace sequoia::meta
51 template<
class T,
class U>
52 requires (!std::is_same_v<T, U>)
53 struct type_comparator<
maths::dual<T>, U> : std::bool_constant<type_name<T>() < type_name<U>()>
56 template<
class T,
class U>
57 requires (!std::is_same_v<T, U>) && (!physics::is_associated_displacement_space_v<T>) && (!physics::is_associated_displacement_space_v<U>)
58 struct type_comparator<T, maths::dual<U>> : std::bool_constant<type_name<T>() < type_name<U>()>
61 template<
class T,
class U>
62 struct type_comparator<maths::dual<T>, maths::dual<U>> : std::bool_constant<type_name<T>() < type_name<U>()>
65 template<class T, class U>
66 requires (!maths::is_dual_v<U>)
67 struct type_comparator<physics::associated_displacement_space<T>, U> : std::bool_constant<type_name<T>() < type_name<U>()>
70 template<class T, class U>
71 requires (!maths::is_dual_v<T>)
72 struct type_comparator<T, physics::associated_displacement_space<U>> : std::bool_constant<type_name<T>() < type_name<U>()>
75 template<class T, class U>
76 requires (!std::is_same_v<physics::associated_displacement_space<T>, U>) && (!physics::is_associated_displacement_space_v<U>)
77 struct type_comparator<physics::associated_displacement_space<T>, maths::dual<U>> : std::bool_constant<type_name<T>() < type_name<U>()>
80 template<class T, class U>
81 requires (!std::is_same_v<T, physics::associated_displacement_space<U>>)
82 struct type_comparator<maths::dual<T>, physics::associated_displacement_space<U>> : std::bool_constant<type_name<T>() < type_name<U>()>
85 template<class T, class U>
86 requires (!std::is_same_v<physics::associated_displacement_space<T>, U>)
87 struct type_comparator<maths::dual<physics::associated_displacement_space<T>>, U>
88 : std::bool_constant<type_name<T>() < type_name<U>()>
91 template<class T, class U>
92 requires (!std::is_same_v<T, physics::associated_displacement_space<U>>) && (!physics::is_associated_displacement_space_v<T>)
93 struct type_comparator<T, maths::dual<physics::associated_displacement_space<U>>>
94 : std::bool_constant<type_name<T>() < type_name<U>()>
97 template<class T, class U>
98 struct type_comparator<physics::associated_displacement_space<T>, physics::associated_displacement_space<U>>
99 : std::bool_constant<type_name<T>() < type_name<U>()>
102 template<class T, class U>
103 struct type_comparator<maths::dual<physics::associated_displacement_space<T>>, maths::dual<physics::associated_displacement_space<U>>>
104 : std::bool_constant<type_name<T>() < type_name<U>()>
109 struct type_comparator<T, maths::dual<T>> : std::true_type
113 struct type_comparator<maths::dual<T>, T> : std::false_type
117 struct type_comparator<T, physics::associated_displacement_space<T>> : std::true_type
121 struct type_comparator<physics::associated_displacement_space<T>, T> : std::false_type
125 struct type_comparator<T, maths::dual<physics::associated_displacement_space<T>>> : std::true_type
129 struct type_comparator<maths::dual<physics::associated_displacement_space<T>>, T> : std::false_type
133 struct type_comparator<physics::associated_displacement_space<T>, maths::dual<T>> : std::true_type
137 struct type_comparator<maths::dual<T>, physics::associated_displacement_space<T>> : std::false_type
141 struct type_comparator<maths::dual<T>, maths::dual<physics::associated_displacement_space<T>>> : std::true_type
145 struct type_comparator<maths::dual<physics::associated_displacement_space<T>>, maths::dual<T>> : std::false_type
149namespace sequoia::physics::impl
151 using namespace maths;
153 template<class T, int I>
154 struct type_counter {};
158 struct count_and_combine;
160 template<class... Ts>
161 using count_and_combine_t = count_and_combine<Ts...>::type;
164 struct count_and_combine<direct_product<>>
166 using type = direct_product<>;
170 struct count_and_combine<T>
172 using type = direct_product<type_counter<T, 1>>;
176 struct count_and_combine<direct_product<T>>
178 using type = direct_product<type_counter<T, 1>>;
181 template<class T, class... Ts>
182 struct count_and_combine<direct_product<T, Ts...>>
184 using type = count_and_combine_t<direct_product<Ts...>, count_and_combine_t<T>>;
187 template<class T, class... Us, int... Is>
188 struct count_and_combine<direct_product<T>, direct_product<type_counter<Us, Is>...>>
190 using type = count_and_combine_t<T, direct_product<type_counter<Us, Is>...>>;
193 template<class T, class... Ts, class... Us, int... Is>
194 requires (sizeof...(Ts) > 0)
195 struct count_and_combine<direct_product<T, Ts...>, direct_product<type_counter<Us, Is>...>>
197 using type = count_and_combine_t<direct_product<Ts...>, count_and_combine_t<T, direct_product<type_counter<Us, Is>...>>>;
200 template<class S, class T, int I, class... Ts, int... Is>
201 requires (!is_direct_product_v<S> && !is_dual_v<S> && !std::is_same_v<S, T> && !std::is_same_v<S, associated_displacement_space<T>>)
202 struct count_and_combine<S, direct_product<type_counter<T, I>, type_counter<Ts, Is>...>>
204 using type = direct_product<type_counter<S, 1>, type_counter<T, I>, type_counter<Ts, Is>...>;
207 template<class S, class T, int I, class... Ts, int... Is>
208 requires (!std::is_same_v<S, T> && !is_dual_v<T> && !is_associated_displacement_space_v<S> && !is_associated_displacement_space_v<T>)
209 struct count_and_combine<dual<S>, direct_product<type_counter<T, I>, type_counter<Ts, Is>...>>
211 using type = direct_product<type_counter<dual<S>, 1>, type_counter<T, I>, type_counter<Ts, Is>...>;
214 template<class T, int I, class... Ts, int... Is>
215 struct count_and_combine<T, direct_product<type_counter<T, I>, type_counter<Ts, Is>...>>
217 using type = direct_product<type_counter<T, I+1>, type_counter<Ts, Is>...>;
220 template<class T, int I, class... Ts, int... Is>
221 struct count_and_combine<dual<T>, direct_product<type_counter<T, I>, type_counter<Ts, Is>...>>
223 using type = direct_product<type_counter<T, I-1>, type_counter<Ts, Is>...>;
227 template<class T, int I, class... Ts, int... Is>
228 struct count_and_combine<associated_displacement_space<T>, direct_product<type_counter<T, I>, type_counter<Ts, Is>...>>
230 using type = direct_product<type_counter<associated_displacement_space<T>, I+1>, type_counter<Ts, Is>...>;
234 template<class T, int I, class... Ts, int... Is>
235 struct count_and_combine<dual<associated_displacement_space<T>>, direct_product<type_counter<T, I>, type_counter<Ts, Is>...>>
237 using type = direct_product<type_counter<associated_displacement_space<T>, I-1>, type_counter<Ts, Is>...>;
241 template<class T, int I, class... Ts, int... Is>
242 struct count_and_combine<dual<T>, direct_product<type_counter<associated_displacement_space<T>, I>, type_counter<Ts, Is>...>>
244 using type = direct_product<type_counter<associated_displacement_space<T>, I-1>, type_counter<Ts, Is>...>;
248 template<class T, int I, class... Ts, int... Is>
249 struct count_and_combine<dual<associated_displacement_space<T>>, direct_product<type_counter<dual<T>, I>, type_counter<Ts, Is>...>>
251 using type = direct_product<type_counter<dual<associated_displacement_space<T>>, I+1>, type_counter<Ts, Is>...>;
260 template<class... Ts>
261 using unpack_t = unpack<Ts...>::type;
263 template<class T, int I>
265 struct unpack<type_counter<T, I>>
267 using type = unpack_t<type_counter<T, I - 1>, direct_product<T>>;
270 template<class T, int I>
272 struct unpack<type_counter<T, I>>
274 using type = unpack_t<type_counter<T, I + 1>, direct_product<dual<T>>>;
277 template<class T, int I, class... Ts>
279 struct unpack<type_counter<T, I>, direct_product<Ts...>>
281 using type = unpack_t<type_counter<T, I - 1>, direct_product<T, Ts...>>;
284 template<class T, int I, class... Ts>
286 struct unpack<type_counter<T, I>, direct_product<Ts...>>
288 using type = unpack_t<type_counter<T, I + 1>, direct_product<dual<T>, Ts...>>;
291 template<class T, class... Ts>
292 struct unpack<type_counter<T, 0>, direct_product<Ts...>>
294 using type = direct_product<Ts...>;
301 template<class... Ts>
302 using reduce_t = reduce<Ts...>::type;
304 template<vector_space T>
305 struct reduce<direct_product<type_counter<T, 0>>>
307 using type = direct_product<euclidean_vector_space<1, commutative_ring_type_of_t<T>>>;
310 template<convex_space T>
311 requires (!affine_space<T> && !vector_space<T>)
312 struct reduce<direct_product<type_counter<T, 0>>>
314 using type = direct_product<euclidean_half_space<commutative_ring_type_of_t<free_module_type_of_t<T>>>>;
317 template<class T, class... Ts, int... Is>
318 struct reduce<direct_product<type_counter<T, 0>, type_counter<Ts, Is>...>>
320 using type = reduce_t<direct_product<type_counter<Ts, Is>...>>;
323 template<class T, int I>
325 struct reduce<direct_product<type_counter<T, I>>>
327 using type = unpack_t<type_counter<T, I>>;
330 template<class T, int I, class... Ts, int... Is>
332 struct reduce<direct_product<type_counter<T, I>, type_counter<Ts, Is>...>>
334 using type = reduce_t<direct_product<type_counter<Ts, Is>...>, unpack_t<type_counter<T, I>>>;
337 template<class T, class... Ts, int... Is, class... Us>
338 struct reduce<direct_product<type_counter<T, 0>, type_counter<Ts, Is>...>, direct_product<Us...>>
340 using type = reduce_t<direct_product<type_counter<Ts, Is>...>, direct_product<Us...>>;
343 template<class T, int I, class... Ts, int... Is, class... Us>
345 struct reduce<direct_product<type_counter<T, I>, type_counter<Ts, Is>...>, direct_product<Us...>>
347 using type = reduce_t<direct_product<type_counter<Ts, Is>...>, unpack_t<type_counter<T, I>, direct_product<Us...>>>;
350 template<class... Us>
351 struct reduce<direct_product<>, direct_product<Us...>>
353 using type = direct_product<Us...>;
356 template<physics::physical_unit T>
357 struct reduce<direct_product<type_counter<T, 0>>>
359 using type = direct_product<physics::no_unit_t>;
363 template<class, class>
366 template<class T, class U>
367 using simplify_t = simplify<T, U>::type;
369 template<class... Ts, class... Us>
370 struct simplify<direct_product<Ts...>, direct_product<Us...>>
372 using type = reduction<reduce_t<count_and_combine_t<meta::merge_t<direct_product<Ts...>, direct_product<Us...>, meta::type_comparator>>>>;
376 struct to_composite_space;
378 template<convex_space... Ts>
379 struct to_composite_space<reduction<direct_product<Ts...>>>
381 using type = composite_space<Ts...>;
384 template<physical_unit... Ts>
385 struct to_composite_space<reduction<direct_product<Ts...>>>
387 using type = composite_unit<Ts...>;
391 struct to_composite_space<reduction<direct_product<T>>>
397 using to_composite_space_t = to_composite_space<T>::type;
400namespace sequoia::maths
402 template<convex_space... Ts>
403 struct dual_of<physics::composite_space<Ts...>>
405 using type = physics::composite_space<dual_of_t<Ts>...>;
408 template<physics::physical_unit... Ts>
409 struct dual_of<physics::composite_unit<Ts...>>
411 using type = physics::composite_unit<dual_of_t<Ts>...>;
Abstractions pertaining to vector spaces, affine spaces and their generalizations.
Definition: PhysicalValuesDetails.hpp:33
Primary class template for defining duals.
Definition: Spaces.hpp:896
Definition: PhysicalValues.hpp:673
Definition: PhysicalValues.hpp:99
Definition: PhysicalValues.hpp:87
Definition: PhysicalValuesDetails.hpp:21
Definition: PhysicalValues.hpp:79
Definition: PhysicalValues.hpp:93