Skip to content

Commit 35f5211

Browse files
refactor: Introduce concepts for primitive types in traits implementation
1 parent c9f99aa commit 35f5211

1 file changed

Lines changed: 37 additions & 0 deletions

File tree

src/primitive/traits.cppm

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,43 @@ using default_policies =
5151
template <typename T>
5252
using traits = details::primitive_traits_impl<std::remove_cvref_t<T>>;
5353

54+
template <typename T>
55+
concept primitive_type = requires {
56+
typename traits<T>::value_type;
57+
typename traits<T>::policies;
58+
typename traits<T>::value_policy;
59+
typename traits<T>::type_policy;
60+
typename traits<T>::error_policy;
61+
typename traits<T>::concurrency_policy;
62+
};
63+
64+
template <typename T>
65+
concept boolean =
66+
primitive_type<T> &&
67+
(underlying::traits<typename traits<T>::value_type>::kind ==
68+
underlying::category::boolean);
69+
70+
template <typename T>
71+
concept character =
72+
primitive_type<T> &&
73+
(underlying::traits<typename traits<T>::value_type>::kind ==
74+
underlying::category::character);
75+
76+
template <typename T>
77+
concept integer =
78+
primitive_type<T> &&
79+
(underlying::traits<typename traits<T>::value_type>::kind ==
80+
underlying::category::integer);
81+
82+
template <typename T>
83+
concept floating =
84+
primitive_type<T> &&
85+
(underlying::traits<typename traits<T>::value_type>::kind ==
86+
underlying::category::floating);
87+
88+
template <typename T>
89+
concept numeric = integer<T> || floating<T>;
90+
5491
} // namespace mcpplibs::primitives::meta
5592

5693
// Backward-compatible aliases for existing downstream users.

0 commit comments

Comments
 (0)