Skip to content

Commit d60372f

Browse files
feat: Add common_rep_traits and has_common_rep concept for common representation types
1 parent 298978f commit d60372f

1 file changed

Lines changed: 32 additions & 0 deletions

File tree

src/underlying/traits.cppm

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,21 @@ template <typename T> struct traits {
5858
}
5959
};
6060

61+
template <typename LhsRep, typename RhsRep, typename = void>
62+
struct common_rep_traits {
63+
static constexpr bool enabled = false;
64+
};
65+
66+
template <typename LhsRep, typename RhsRep>
67+
struct common_rep_traits<
68+
LhsRep, RhsRep,
69+
std::void_t<std::common_type_t<std::remove_cv_t<LhsRep>,
70+
std::remove_cv_t<RhsRep>>>> {
71+
using type =
72+
std::common_type_t<std::remove_cv_t<LhsRep>, std::remove_cv_t<RhsRep>>;
73+
static constexpr bool enabled = true;
74+
};
75+
6176
} // namespace underlying
6277
} // namespace mcpplibs::primitives
6378

@@ -134,6 +149,15 @@ concept has_consistent_category =
134149
(traits<std::remove_cv_t<T>>::kind == category::integer ||
135150
traits<std::remove_cv_t<T>>::kind == category::floating)));
136151

152+
template <typename LhsRep, typename RhsRep>
153+
concept has_common_rep =
154+
common_rep_traits<std::remove_cv_t<LhsRep>,
155+
std::remove_cv_t<RhsRep>>::enabled &&
156+
requires {
157+
typename common_rep_traits<std::remove_cv_t<LhsRep>,
158+
std::remove_cv_t<RhsRep>>::type;
159+
};
160+
137161
} // namespace mcpplibs::primitives::underlying::details
138162

139163
export namespace mcpplibs::primitives {
@@ -168,4 +192,12 @@ concept floating_underlying_type =
168192
template <typename T>
169193
concept numeric_underlying_type =
170194
integer_underlying_type<T> || floating_underlying_type<T>;
195+
196+
template <typename LhsRep, typename RhsRep>
197+
concept has_common_rep = underlying::details::has_common_rep<LhsRep, RhsRep>;
198+
199+
template <typename LhsRep, typename RhsRep>
200+
using common_rep_t =
201+
underlying::common_rep_traits<std::remove_cv_t<LhsRep>,
202+
std::remove_cv_t<RhsRep>>::type;
171203
} // namespace mcpplibs::primitives

0 commit comments

Comments
 (0)