@@ -25,98 +25,39 @@ namespace brcpp
2525 template <typename Enum>
2626 using fitting_integral = typename integral_by_size<sizeof (Enum)>::type;
2727
28- struct binary_codec {};
29-
30- template <bool cond, typename R>
31- using cond_if_t = std::enable_if_t <cond, R>;
32-
33- template <typename T>
34- using check_unsigned_integral = std::bool_constant<std::is_unsigned_v<T> && std::is_integral_v<T>>;
35-
36- template <typename T>
37- using check_signed_integral = std::bool_constant<std::is_signed_v<T> && std::is_integral_v<T>>;
38-
39- template <typename T>
40- using check_integral = std::bool_constant<std::is_integral_v<T>>;
41-
42- template <typename T>
43- using check_floating_point = std::bool_constant<std::is_floating_point_v<T>>;
44-
45- template <typename T>
46- using check_bit_readable = std::bool_constant<std::is_floating_point_v<T> || std::is_integral_v<T>>;
47-
48- template <typename T>
49- using check_binary_codec = std::bool_constant<std::is_base_of_v<binary_codec, T>>;
50-
51- template <typename T>
52- using check_enum = std::bool_constant<std::is_enum_v<T>>;
53-
54-
55- template <typename T>
56- using if_unsigned_integral = std::enable_if_t <check_unsigned_integral<T>::value, T>;
57-
58- template <typename T>
59- using if_signed_integral = std::enable_if_t <check_signed_integral<T>::value, T>;
60-
61- template <typename T>
62- using if_integral = std::enable_if_t <check_integral<T>::value, T>;
28+ struct binary_codec_base {};
6329
6430 template <typename T>
65- using if_floating_point = std::enable_if_t <check_floating_point<T>::value, T>;
31+ concept binary_codec =
32+ std::derived_from<T, binary_codec_base> &&
33+ requires { typename T::value_type; };
6634
6735 template <typename T>
68- using if_bit_readable = std::enable_if_t <check_bit_readable<T>::value, T>;
36+ concept enumeration = std::is_enum_v< T>;
6937
70- template <typename T>
71- using if_binary_codec = std::enable_if_t <check_binary_codec<T>::value, typename T::value_type>;
72-
73- template <typename T>
74- using if_enum = std::enable_if_t <check_enum<T>::value, T>;
75-
76-
77- template <typename T>
78- using if_unsigned_integral_void = std::enable_if_t <check_unsigned_integral<T>::value, void >;
79-
80- template <typename T>
81- using if_signed_integral_void = std::enable_if_t <check_signed_integral<T>::value, void >;
82-
83- template <typename T>
84- using if_integral_void = std::enable_if_t <check_integral<T>::value, void >;
85-
86- template <typename T>
87- using if_floating_point_void = std::enable_if_t <check_floating_point<T>::value, void >;
88-
89- template <typename T>
90- using if_bit_readable_void = std::enable_if_t <check_bit_readable<T>::value, void >;
38+ using std::integral;
39+ using std::unsigned_integral;
40+ using std::signed_integral;
41+ using std::floating_point;
9142
9243 template <typename T>
93- using if_binary_codec_void = std::enable_if_t <check_binary_codec<T>::value, void >;
94-
95- template <typename T>
96- using if_enum_void = std::enable_if_t <check_enum<T>::value, void >;
44+ struct bit_read_helper {};
9745
9846 // --------------------------------------------------------------------------
99- template <typename T>
100- struct bit_read_helper
47+ template <integral T>
48+ struct bit_read_helper <T>
10149 {
10250 static constexpr const size_t max_bits = 8 * sizeof (T);
10351 static constexpr const size_t min_bits = 0 ;
10452 static constexpr const bool is_signed = std::is_signed_v<T>;
10553 };
10654
10755 // --------------------------------------------------------------------------
108- template <typename T>
109- struct floating_point_bit_read_helper
56+ template <floating_point T>
57+ struct bit_read_helper <T>
11058 {
11159 static constexpr const size_t max_bits = 8 * sizeof (T);
11260 static constexpr const size_t min_bits = 8 * sizeof (T);
11361 static constexpr const bool is_signed = std::is_signed_v<T>;
11462 };
115-
116- // --------------------------------------------------------------------------
117- template <> struct bit_read_helper <float >: floating_point_bit_read_helper<float > {};
118- template <> struct bit_read_helper <double >: floating_point_bit_read_helper<double > {};
119- template <> struct bit_read_helper <long double >: floating_point_bit_read_helper<long double > {};
120-
121-
12263}
0 commit comments