Skip to content

Commit ccf9bd7

Browse files
committed
Refactor arithmetic traits for clarity and efficiency.
Replaced redundant type aliases with `constexpr` variables to simplify code and improve readability.
1 parent 8d799eb commit ccf9bd7

File tree

2 files changed

+20
-33
lines changed

2 files changed

+20
-33
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
cmake_minimum_required( VERSION 3.14 )
1010

1111
project( "daw-header-libraries"
12-
VERSION "2.123.0"
12+
VERSION "2.123.1"
1313
DESCRIPTION "Various headers"
1414
HOMEPAGE_URL "https://github.com/beached/header_libraries"
1515
LANGUAGES C CXX

include/daw/daw_arith_traits.h

Lines changed: 19 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -24,78 +24,65 @@
2424

2525
namespace daw {
2626
template<typename T>
27-
using is_integral = std::bool_constant<daw::numeric_limits<T>::is_integer>;
27+
inline constexpr bool is_integral_v = daw::numeric_limits<T>::is_integer;
2828

2929
template<typename T>
30-
inline constexpr bool is_integral_v = is_integral<T>::value;
30+
using is_integral = std::bool_constant<is_integral_v<T>>;
3131

3232
static_assert( is_integral_v<int> );
3333
static_assert( not is_integral_v<float> );
3434

35-
namespace arith_traits_details {
36-
template<typename T>
37-
using limits_is_signed =
38-
std::bool_constant<daw::numeric_limits<T>::is_signed>;
39-
40-
template<typename T>
41-
using limits_is_exact =
42-
std::bool_constant<daw::numeric_limits<T>::is_exact>;
43-
44-
} // namespace arith_traits_details
45-
4635
template<typename T>
47-
using is_floating_point =
48-
std::conjunction<std::negation<is_integral<T>>,
49-
arith_traits_details::limits_is_signed<T>,
50-
std::negation<arith_traits_details::limits_is_exact<T>>>;
36+
inline constexpr bool is_floating_point_v =
37+
not is_integral_v<T> and daw::numeric_limits<T>::is_signed and
38+
not daw::numeric_limits<T>::is_exact;
5139

5240
template<typename T>
53-
inline constexpr bool is_floating_point_v = is_floating_point<T>::value;
41+
using is_floating_point = std::bool_constant<is_floating_point_v<T>>;
5442

5543
static_assert( is_floating_point_v<float> );
5644
static_assert( not is_floating_point_v<int> );
5745

5846
template<typename T>
59-
using is_number = std::disjunction<is_integral<T>, is_floating_point<T>>;
47+
inline constexpr bool is_number_v =
48+
is_integral_v<T> or is_floating_point_v<T>;
6049

6150
template<typename T>
62-
inline constexpr bool is_number_v = is_number<T>::value;
51+
using is_number = std::bool_constant<is_number_v<T>>;
6352

6453
static_assert( is_number_v<float> );
6554
static_assert( is_number_v<int> );
6655
static_assert( not is_number_v<is_integral<int>> );
6756

6857
template<typename T>
69-
using is_signed =
70-
std::conjunction<is_number<T>, arith_traits_details::limits_is_signed<T>>;
58+
inline constexpr bool is_signed_v =
59+
is_number_v<T> and daw::numeric_limits<T>::is_signed;
7160

7261
template<typename T>
73-
inline constexpr bool is_signed_v = is_signed<T>::value;
62+
using is_signed = std::bool_constant<is_signed_v<T>>;
7463

7564
static_assert( is_signed_v<int> );
7665
static_assert( is_signed_v<float> );
7766
static_assert( not is_signed_v<unsigned> );
7867

7968
template<typename T>
80-
using is_unsigned =
81-
std::conjunction<is_integral<T>,
82-
std::negation<arith_traits_details::limits_is_signed<T>>>;
69+
inline constexpr bool is_unsigned_v =
70+
is_integral_v<T> and not daw::numeric_limits<T>::is_signed;
8371

8472
template<typename T>
85-
inline constexpr bool is_unsigned_v = is_unsigned<T>::value;
73+
using is_unsigned = std::bool_constant<is_unsigned_v<T>>;
8674

8775
static_assert( not is_unsigned_v<int> );
8876
static_assert( not is_unsigned_v<float> );
8977
static_assert( is_unsigned_v<unsigned> );
9078

9179
template<typename T>
92-
using is_arithmetic =
93-
std::disjunction<is_number<T>, std::is_enum<T>,
94-
conditional_t<daw::numeric_limits<T>::is_specialized,
95-
std::true_type, std::false_type>>;
80+
inline constexpr bool is_arithmetic_v =
81+
is_number_v<T> or std::is_enum_v<T> or
82+
daw::numeric_limits<T>::is_specialized;
9683

9784
template<typename T>
98-
inline constexpr bool is_arithmetic_v = is_arithmetic<T>::value;
85+
using is_arithmetic = std::bool_constant<is_arithmetic_v<T>>;
9986

10087
template<typename T>
10188
struct make_unsigned : std::make_unsigned<T> {};

0 commit comments

Comments
 (0)