OGLplus  (0.59.0) a C++ wrapper for rendering APIs

custom_unit.hpp
Go to the documentation of this file.
1 
9 #ifndef EAGINE_UNITS_CUSTOM_UNIT_HPP
10 #define EAGINE_UNITS_CUSTOM_UNIT_HPP
11 
12 // clang-format off
13 #include "dimension.hpp"
14 #include "unit.hpp"
15 #include <cmath>
16 // clang-format on
17 
18 namespace eagine::units {
19 
20 template <typename Dims, typename Conv, typename System>
21 struct custom_dim_unit {
22  using dimension = Dims;
23  using conversion = Conv;
24  using system = System;
25  using type = custom_dim_unit;
26 };
27 
28 // make_custom_unit
29 template <typename Conv, typename Unit>
30 struct make_custom_unit;
31 
32 template <typename Conv, typename Unit>
33 using make_custom_unit_t = typename make_custom_unit<Conv, Unit>::type;
34 
35 template <typename Conv, typename Dimension, typename System>
36 struct make_custom_unit<Conv, unit<Dimension, System>>
37  : custom_dim_unit<Dimension, Conv, System> {};
38 
39 // is_convertible
40 template <typename D, typename C, typename S>
41 struct is_convertible<custom_dim_unit<D, C, S>, unit<D, S>> : std::true_type {};
42 
43 template <typename D, typename C, typename S>
44 struct is_convertible<unit<D, S>, custom_dim_unit<D, C, S>> : std::true_type {};
45 
46 template <typename D, typename C, typename S>
47 struct is_convertible<custom_dim_unit<D, C, S>, custom_dim_unit<D, C, S>>
48  : std::true_type {};
49 
50 template <typename D, typename C1, typename C2, typename S>
51 struct is_convertible<custom_dim_unit<D, C1, S>, custom_dim_unit<D, C2, S>>
52  : std::true_type {};
53 
54 // value_conv
55 template <typename D, typename C, typename S>
56 struct value_conv<custom_dim_unit<D, C, S>, unit<D, S>> {
57  template <typename T>
58  constexpr auto operator()(T v) const {
59  return custom_dim_unit<D, C, S>::conversion::to_base(v);
60  }
61 };
62 
63 template <typename D, typename C, typename S>
64 struct value_conv<unit<D, S>, custom_dim_unit<D, C, S>> {
65  template <typename T>
66  constexpr auto operator()(T v) const {
67  return custom_dim_unit<D, C, S>::conversion::from_base(v);
68  }
69 };
70 
71 template <typename D, typename C, typename S>
72 struct value_conv<custom_dim_unit<D, C, S>, custom_dim_unit<D, C, S>>
73  : trivial_value_conv {};
74 
75 template <typename D, typename C1, typename C2, typename S>
76 struct value_conv<custom_dim_unit<D, C1, S>, custom_dim_unit<D, C2, S>> {
77  template <typename T>
78  constexpr auto operator()(T v) const {
79  return custom_dim_unit<D, C2, S>::conversion::from_base(
80  custom_dim_unit<D, C1, S>::conversion::to_base(v));
81  }
82 };
83 
84 // lit_result
85 template <typename D, typename C, typename S>
86 struct lit_result<custom_dim_unit<D, C, S>> : custom_dim_unit<D, C, S> {};
87 
88 // add_result
89 template <typename D, typename C, typename S>
90 struct add_result<custom_dim_unit<D, C, S>, unit<D, S>> : unit<D, S> {};
91 
92 template <typename D, typename C, typename S>
93 struct add_result<unit<D, S>, custom_dim_unit<D, C, S>> : unit<D, S> {};
94 
95 template <typename D, typename C, typename S>
96 struct add_result<custom_dim_unit<D, C, S>, custom_dim_unit<D, C, S>>
97  : custom_dim_unit<D, C, S> {};
98 
99 template <typename D, typename C1, typename C2, typename S>
100 struct add_result<custom_dim_unit<D, C1, S>, custom_dim_unit<D, C2, S>>
101  : custom_dim_unit<D, C1, S> {};
102 
103 // sub_result
104 template <typename D, typename C, typename S>
105 struct sub_result<custom_dim_unit<D, C, S>, unit<D, S>> : unit<D, S> {};
106 
107 template <typename D, typename C, typename S>
108 struct sub_result<unit<D, S>, custom_dim_unit<D, C, S>> : unit<D, S> {};
109 
110 template <typename D, typename C, typename S>
111 struct sub_result<custom_dim_unit<D, C, S>, custom_dim_unit<D, C, S>>
112  : custom_dim_unit<D, C, S> {};
113 
114 template <typename D, typename C1, typename C2, typename S>
115 struct sub_result<custom_dim_unit<D, C1, S>, custom_dim_unit<D, C2, S>>
116  : custom_dim_unit<D, C1, S> {};
117 
118 // mul_l_operand
119 template <typename D1, typename D2, typename C, typename S>
120 struct mul_l_operand<custom_dim_unit<D1, C, S>, unit<D2, S>> : unit<D1, S> {};
121 
122 template <typename D1, typename D2, typename C, typename S>
123 struct mul_l_operand<unit<D1, S>, custom_dim_unit<D2, C, S>> : unit<D1, S> {};
124 
125 template <typename D1, typename D2, typename C1, typename C2, typename S>
126 struct mul_l_operand<custom_dim_unit<D1, C1, S>, custom_dim_unit<D2, C2, S>>
127  : unit<D1, S> {};
128 
129 // mul_r_operand
130 template <typename D1, typename D2, typename C, typename S>
131 struct mul_r_operand<custom_dim_unit<D1, C, S>, unit<D2, S>> : unit<D2, S> {};
132 
133 template <typename D1, typename D2, typename C, typename S>
134 struct mul_r_operand<unit<D1, S>, custom_dim_unit<D2, C, S>> : unit<D2, S> {};
135 
136 template <typename D1, typename D2, typename C1, typename C2, typename S>
137 struct mul_r_operand<custom_dim_unit<D1, C1, S>, custom_dim_unit<D2, C2, S>>
138  : unit<D1, S> {};
139 
140 // mul_result
141 template <typename D1, typename D2, typename C, typename S>
142 struct mul_result<custom_dim_unit<D1, C, S>, unit<D2, S>>
143  : unit<bits::dim_add_t<D1, D2>, S> {};
144 
145 template <typename D1, typename D2, typename C, typename S>
146 struct mul_result<unit<D1, S>, custom_dim_unit<D2, C, S>>
147  : unit<bits::dim_add_t<D1, D2>, S> {};
148 
149 template <typename D1, typename D2, typename C1, typename C2, typename S>
150 struct mul_result<custom_dim_unit<D1, C1, S>, custom_dim_unit<D2, C2, S>>
151  : unit<bits::dim_add_t<D1, D2>, S> {};
152 
153 // div_result
154 template <typename D1, typename D2, typename C, typename S>
155 struct div_result<custom_dim_unit<D1, C, S>, unit<D2, S>>
156  : unit<bits::dim_sub_t<D1, D2>, S> {};
157 
158 template <typename D1, typename D2, typename C, typename S>
159 struct div_result<unit<D1, S>, custom_dim_unit<D2, C, S>>
160  : unit<bits::dim_sub_t<D1, D2>, S> {};
161 
162 template <typename D1, typename D2, typename C1, typename C2, typename S>
163 struct div_result<custom_dim_unit<D1, C1, S>, custom_dim_unit<D2, C2, S>>
164  : unit<bits::dim_sub_t<D1, D2>, S> {};
165 
166 } // namespace eagine::units
167 
168 #endif // EAGINE_UNITS_CUSTOM_UNIT_HPP

Copyright © 2015-2021 Matúš Chochlík.
<chochlik -at -gmail.com>
Documentation generated on Tue Apr 13 2021 by Doxygen (version 1.8.17).