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...>>
183 : count_and_combine<direct_product<Ts...>, count_and_combine_t<T>>
186 template<class T, class... Us, int... Is>
187 struct count_and_combine<direct_product<T>, direct_product<type_counter<Us, Is>...>>
188 : count_and_combine<T, direct_product<type_counter<Us, Is>...>>
191 template<class T, class... Ts, class... Us, int... Is>
192 requires (sizeof...(Ts) > 0)
193 struct count_and_combine<direct_product<T, Ts...>, direct_product<type_counter<Us, Is>...>>
194 : count_and_combine<direct_product<Ts...>, count_and_combine_t<T, direct_product<type_counter<Us, Is>...>>>
197 template<class S, class T, int I, class... Ts, int... Is>
198 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>>)
199 struct count_and_combine<S, direct_product<type_counter<T, I>, type_counter<Ts, Is>...>>
201 using type = direct_product<type_counter<S, 1>, type_counter<T, I>, type_counter<Ts, Is>...>;
204 template<class S, class T, int I, class... Ts, int... Is>
205 requires (!std::is_same_v<S, T> && !is_dual_v<T> && !is_associated_displacement_space_v<S> && !is_associated_displacement_space_v<T>)
206 struct count_and_combine<dual<S>, direct_product<type_counter<T, I>, type_counter<Ts, Is>...>>
208 using type = direct_product<type_counter<dual<S>, 1>, type_counter<T, I>, type_counter<Ts, Is>...>;
211 template<class T, int I, class... Ts, int... Is>
212 struct count_and_combine<T, direct_product<type_counter<T, I>, type_counter<Ts, Is>...>>
214 using type = direct_product<type_counter<T, I+1>, type_counter<Ts, Is>...>;
217 template<class T, int I, class... Ts, int... Is>
218 struct count_and_combine<dual<T>, direct_product<type_counter<T, I>, type_counter<Ts, Is>...>>
220 using type = direct_product<type_counter<T, I-1>, type_counter<Ts, Is>...>;
224 template<class T, int I, class... Ts, int... Is>
225 struct count_and_combine<associated_displacement_space<T>, direct_product<type_counter<T, I>, type_counter<Ts, Is>...>>
227 using type = direct_product<type_counter<associated_displacement_space<T>, I+1>, type_counter<Ts, Is>...>;
231 template<class T, int I, class... Ts, int... Is>
232 struct count_and_combine<dual<associated_displacement_space<T>>, direct_product<type_counter<T, I>, type_counter<Ts, Is>...>>
234 using type = direct_product<type_counter<associated_displacement_space<T>, I-1>, type_counter<Ts, Is>...>;
238 template<class T, int I, class... Ts, int... Is>
239 struct count_and_combine<dual<T>, direct_product<type_counter<associated_displacement_space<T>, I>, type_counter<Ts, Is>...>>
241 using type = direct_product<type_counter<associated_displacement_space<T>, I-1>, type_counter<Ts, Is>...>;
245 template<class T, int I, class... Ts, int... Is>
246 struct count_and_combine<dual<associated_displacement_space<T>>, direct_product<type_counter<dual<T>, I>, type_counter<Ts, Is>...>>
248 using type = direct_product<type_counter<dual<associated_displacement_space<T>>, I+1>, type_counter<Ts, Is>...>;
257 template<class... Ts>
258 using unpack_t = unpack<Ts...>::type;
260 template<class T, int I>
262 struct unpack<type_counter<T, I>> : unpack<type_counter<T, I - 1>, direct_product<T>>
265 template<class T, int I>
267 struct unpack<type_counter<T, I>> : unpack<type_counter<T, I + 1>, direct_product<dual<T>>>
270 template<class T, int I, class... Ts>
272 struct unpack<type_counter<T, I>, direct_product<Ts...>> : unpack<type_counter<T, I - 1>, direct_product<T, Ts...>>
275 template<class T, int I, class... Ts>
277 struct unpack<type_counter<T, I>, direct_product<Ts...>> : unpack<type_counter<T, I + 1>, direct_product<dual<T>, Ts...>>
280 template<class T, class... Ts>
281 struct unpack<type_counter<T, 0>, direct_product<Ts...>>
283 using type = direct_product<Ts...>;
290 template<class... Ts>
291 using reduce_t = reduce<Ts...>::type;
293 template<vector_space T>
294 struct reduce<direct_product<type_counter<T, 0>>>
296 using arena_type = T::arena_type;
297 using type = direct_product<euclidean_vector_space<commutative_ring_type_of_t<T>, 1, arena_type>>;
300 template<convex_space T>
301 requires (!affine_space<T> && !vector_space<T>)
302 struct reduce<direct_product<type_counter<T, 0>>>
304 using arena_type = T::arena_type;
305 using type = direct_product<euclidean_half_space<commutative_ring_type_of_t<free_module_type_of_t<T>>, arena_type>>;
308 template<class T, class... Ts, int... Is>
309 struct reduce<direct_product<type_counter<T, 0>, type_counter<Ts, Is>...>>
310 : reduce<direct_product<type_counter<Ts, Is>...>>
313 template<class T, int I>
315 struct reduce<direct_product<type_counter<T, I>>>
317 using type = unpack_t<type_counter<T, I>>;
320 template<class T, int I, class... Ts, int... Is>
322 struct reduce<direct_product<type_counter<T, I>, type_counter<Ts, Is>...>>
323 : reduce<direct_product<type_counter<Ts, Is>...>, unpack_t<type_counter<T, I>>>
326 template<class T, class... Ts, int... Is, class... Us>
327 struct reduce<direct_product<type_counter<T, 0>, type_counter<Ts, Is>...>, direct_product<Us...>>
328 : reduce<direct_product<type_counter<Ts, Is>...>, direct_product<Us...>>
331 template<class T, int I, class... Ts, int... Is, class... Us>
333 struct reduce<direct_product<type_counter<T, I>, type_counter<Ts, Is>...>, direct_product<Us...>>
334 : reduce<direct_product<type_counter<Ts, Is>...>, unpack_t<type_counter<T, I>, direct_product<Us...>>>
337 template<class... Us>
338 struct reduce<direct_product<>, direct_product<Us...>>
340 using type = direct_product<Us...>;
343 template<physics::physical_unit T>
344 struct reduce<direct_product<type_counter<T, 0>>>
346 using type = direct_product<physics::no_unit_t>;
350 template<class, class>
353 template<class T, class U>
354 using simplify_t = simplify<T, U>::type;
356 template<class... Ts, class... Us>
357 struct simplify<direct_product<Ts...>, direct_product<Us...>>
359 using type = reduction<reduce_t<count_and_combine_t<meta::merge_t<direct_product<Ts...>, direct_product<Us...>, meta::type_comparator>>>>;
363 struct to_composite_space;
365 template<convex_space... Ts>
366 struct to_composite_space<reduction<direct_product<Ts...>>>
368 using type = composite_space<Ts...>;
371 template<physical_unit... Ts>
372 struct to_composite_space<reduction<direct_product<Ts...>>>
374 using type = composite_unit<Ts...>;
378 struct to_composite_space<reduction<direct_product<T>>>
384 using to_composite_space_t = to_composite_space<T>::type;
387namespace sequoia::maths
389 template<convex_space... Ts>
390 struct dual_of<physics::composite_space<Ts...>>
392 using type = physics::composite_space<dual_of_t<Ts>...>;
395 template<physics::physical_unit... Ts>
396 struct dual_of<physics::composite_unit<Ts...>>
398 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:690
Definition: PhysicalValues.hpp:131
Definition: PhysicalValues.hpp:87
Definition: PhysicalValuesDetails.hpp:21
Definition: PhysicalValues.hpp:79
Definition: PhysicalValues.hpp:125