9 #if !defined(SG14_COMMON_H) 10 #define SG14_COMMON_H 1 20 constexpr T max(T a, T b)
29 constexpr T min(T a, T b)
41 struct arithmetic_op {
42 static constexpr
bool is_arithmetic =
true;
45 struct comparison_op {
46 static constexpr
bool is_comparison =
true;
49 struct minus_op : arithmetic_op {
51 constexpr
auto operator()(
const Rhs& rhs)
const -> decltype(-rhs)
57 struct plus_op : arithmetic_op {
59 constexpr
auto operator()(
const Rhs& rhs)
const -> decltype(+rhs)
65 struct add_op : arithmetic_op {
66 template<
class Lhs,
class Rhs>
67 constexpr
auto operator()(
const Lhs& lhs,
const Rhs& rhs)
const -> decltype(lhs+rhs)
73 struct subtract_op : arithmetic_op {
74 template<
class Lhs,
class Rhs>
75 constexpr
auto operator()(
const Lhs& lhs,
const Rhs& rhs)
const -> decltype(lhs-rhs)
81 struct multiply_op : arithmetic_op {
82 template<
class Lhs,
class Rhs>
83 constexpr
auto operator()(
const Lhs& lhs,
const Rhs& rhs)
const -> decltype(lhs*rhs)
89 struct divide_op : arithmetic_op {
90 template<
class Lhs,
class Rhs>
91 constexpr
auto operator()(
const Lhs& lhs,
const Rhs& rhs)
const -> decltype(lhs/rhs)
97 struct bitwise_or_op : arithmetic_op {
98 template<
class Lhs,
class Rhs>
99 constexpr
auto operator()(
const Lhs& lhs,
const Rhs& rhs)
const -> decltype(lhs|rhs)
105 struct bitwise_and_op : arithmetic_op {
106 template<
class Lhs,
class Rhs>
107 constexpr
auto operator()(
const Lhs& lhs,
const Rhs& rhs)
const -> decltype(lhs&rhs)
113 struct bitwise_xor_op : arithmetic_op {
114 template<
class Lhs,
class Rhs>
115 constexpr
auto operator()(
const Lhs& lhs,
const Rhs& rhs)
const -> decltype(lhs^rhs)
121 struct equal_op : comparison_op {
122 template<
class Lhs,
class Rhs>
123 constexpr
auto operator()(
const Lhs& lhs,
const Rhs& rhs)
const -> decltype(lhs==rhs)
129 struct not_equal_op : comparison_op {
130 template<
class Lhs,
class Rhs>
131 constexpr
auto operator()(
const Lhs& lhs,
const Rhs& rhs)
const -> decltype(lhs!=rhs)
137 struct less_than_op : comparison_op {
138 template<
class Lhs,
class Rhs>
139 constexpr
auto operator()(
const Lhs& lhs,
const Rhs& rhs)
const -> decltype(lhs<rhs)
145 struct greater_than_op : comparison_op {
146 template<
class Lhs,
class Rhs>
147 constexpr
auto operator()(
const Lhs& lhs,
const Rhs& rhs)
const -> decltype(lhs>rhs)
153 struct less_than_or_equal_op : comparison_op {
154 template<
class Lhs,
class Rhs>
155 constexpr
auto operator()(
const Lhs& lhs,
const Rhs& rhs)
const -> decltype(lhs<=rhs)
161 struct greater_than_or_equal_op : comparison_op {
162 template<
class Lhs,
class Rhs>
163 constexpr
auto operator()(
const Lhs& lhs,
const Rhs& rhs)
const -> decltype(lhs>=rhs)
169 static constexpr plus_op plus_tag {};
170 static constexpr minus_op minus_tag {};
172 static constexpr add_op add_tag {};
173 static constexpr subtract_op subtract_tag {};
174 static constexpr multiply_op multiply_tag {};
175 static constexpr divide_op divide_tag {};
177 static constexpr bitwise_or_op bitwise_or_tag {};
178 static constexpr bitwise_and_op bitwise_and_tag {};
179 static constexpr bitwise_xor_op bitwise_xor_tag {};
181 static constexpr equal_op equal_tag {};
182 static constexpr not_equal_op not_equal_tag {};
183 static constexpr less_than_op less_than_tag {};
184 static constexpr greater_than_op greater_than_tag {};
185 static constexpr less_than_or_equal_op less_than_or_equal_tag {};
186 static constexpr greater_than_or_equal_op greater_than_or_equal_tag {};
191 template<
class Operator,
class Lhs,
class Rhs>
192 using op_result = decltype(Operator()(std::declval<Lhs>(), std::declval<Rhs>()));
196 #endif // SG14_COMMON_H study group 14 of the C++ working group
Definition: const_integer.h:22