VCCC  2024.05
VisualCamp Common C++ library
lossless_type.hpp
Go to the documentation of this file.
1 # /*
2 # * Created by YongGyu Lee on 2020/12/08.
3 # */
4 #
5 # ifndef VCCC_TYPE_TRAITS_LOSSLESS_TYPE_HPP
6 # define VCCC_TYPE_TRAITS_LOSSLESS_TYPE_HPP
7 #
11 
12 namespace vccc {
13 
14 
17 
18 // TODO: change double to biggest among input floating_point type
19 template<typename ...Types>
20 using decay_if_float_t = typename std::conditional_t<conjunction<std::is_same<Types, float>...>::value, float, double>;
21 
22 
27 template<typename...>struct lossless_type_add;
28 
29 template<typename ...Ts>
30 using lossless_type_add_t = typename lossless_type_add<Ts...>::type;
31 
33 
34 template<typename T>
35 struct lossless_type_add<T> {
36  static_assert(std::is_arithmetic<T>::value, "Invalid type in lossless_type_add<>");
37  using type = T;
38 };
39 
40 template<typename T1, typename T2>
41 struct lossless_type_add<T1, T2> {
42  using type = decltype(static_cast<lossless_type_add_t<T1>>(0) +
43  static_cast<lossless_type_add_t<T2>>(0));
44 };
45 
46 template<typename T1, typename T2, typename ...Ts>
47 struct lossless_type_add<T1, T2, Ts...> {
48  using type = decltype(static_cast<lossless_type_add_t<T1, T2>>(0) +
49  static_cast<lossless_type_add_t<Ts...>>(0));
50 };
51 
53 
54 
59 template<typename...>struct lossless_type_mul;
60 
61 template<typename ...Ts>
62 using lossless_type_mul_t = typename lossless_type_mul<Ts...>::type;
63 
65 template<typename T>
66 struct lossless_type_mul<T> {
67  static_assert(std::is_arithmetic<T>::value, "Invalid type in lossless_type_mul<>");
68  using type = T;
69 };
70 
71 template<typename T1, typename T2>
72 struct lossless_type_mul<T1, T2> {
73  using type =
74  decltype(static_cast<lossless_type_mul_t<T1>>(0) *
75  static_cast<lossless_type_mul_t<T2>>(0));
76 };
77 
78 template<typename T1, typename T2, typename ...Ts>
79 struct lossless_type_mul<T1, T2, Ts...> {
80  using type =
81  decltype(static_cast<lossless_type_mul_t<T1, T2>>(0) *
82  static_cast<lossless_type_mul_t<Ts...>>(0));
83 };
84 
86 
87 
93 template<typename...> struct lossless_type_div;
94 
95 template<typename ...Ts>
96 using lossless_type_div_t = typename lossless_type_div<Ts...>::type;
97 
98 
100 template<typename T>
101 struct lossless_type_div<T> {
102  static_assert(std::is_arithmetic<T>::value, "Invalid type in lossless_type_div<>");
103  using type = T;
104 };
105 
106 template<typename T1, typename T2>
107 struct lossless_type_div<T1, T2> {
108  using type =
110  internal::lossless_type_int_division_t<T1, T2>,
111  decltype(static_cast<lossless_type_div_t<T1>>(0) /
112  static_cast<lossless_type_div_t<T2>>(0))>;
113 };
114 
115 template<typename T1, typename T2, typename ...Ts>
116 struct lossless_type_div<T1, T2, Ts...> {
117  using type =
118  decltype(static_cast<lossless_type_div_t<T1, T2>>(0) /
119  static_cast<lossless_type_div_t<Ts...>>(0));
120 };
121 
123 
125 
126 } // namespace vccc
127 
128 # endif // VCCC_TYPE_TRAITS_LOSSLESS_TYPE_HPP
typename lossless_type_div< Ts... >::type lossless_type_div_t
Definition: lossless_type.hpp:96
typename std::conditional_t< conjunction< std::is_same< Types, float >... >::value, float, double > decay_if_float_t
Definition: lossless_type.hpp:20
typename lossless_type_mul< Ts... >::type lossless_type_mul_t
Definition: lossless_type.hpp:62
typename lossless_type_add< Ts... >::type lossless_type_add_t
Definition: lossless_type.hpp:30
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
Definition: lossless_type.hpp:27
Definition: lossless_type.hpp:93
Definition: lossless_type.hpp:59