Skip to content

Commit c6b9b03

Browse files
authored
Merge pull request #208 from elbeno/same-concepts
✨ Add `same_any` and `same_none` concepts
2 parents 6b92eaa + 4a52487 commit c6b9b03

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

include/stdx/concepts.hpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ constexpr auto derived_from =
4141
template <typename T, typename U>
4242
constexpr auto same_as = std::is_same_v<T, U> and std::is_same_v<U, T>;
4343

44+
template <typename T, typename... Us>
45+
constexpr auto same_any = (... or same_as<T, Us>);
46+
47+
template <typename T, typename... Us>
48+
constexpr auto same_none = not same_any<T, Us...>;
49+
4450
template <typename T, typename U>
4551
constexpr auto same_as_unqualified =
4652
is_same_unqualified_v<T, U> and is_same_unqualified_v<U, T>;
@@ -130,6 +136,12 @@ concept derived_from =
130136
template <typename T, typename U>
131137
concept same_as = std::is_same_v<T, U> and std::is_same_v<U, T>;
132138

139+
template <typename T, typename... Us>
140+
constexpr auto same_any = (... or same_as<T, Us>);
141+
142+
template <typename T, typename... Us>
143+
constexpr auto same_none = not same_any<T, Us...>;
144+
133145
template <typename T, typename U>
134146
concept same_as_unqualified =
135147
is_same_unqualified_v<T, U> and is_same_unqualified_v<U, T>;
@@ -222,6 +234,11 @@ concept same_as_unqualified =
222234
template <typename T>
223235
concept structural = is_structural_v<T>;
224236

237+
template <typename T, typename... Us>
238+
constexpr auto same_any = (... or same_as<T, Us>);
239+
240+
template <typename T, typename... Us>
241+
constexpr auto same_none = not same_any<T, Us...>;
225242
} // namespace v1
226243
} // namespace stdx
227244

test/concepts.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@ TEST_CASE("same_as", "[concepts]") {
3030
static_assert(not stdx::same_as<float, int>);
3131
}
3232

33+
TEST_CASE("same_any", "[concepts]") {
34+
static_assert(stdx::same_any<int, float, bool, int>);
35+
static_assert(not stdx::same_any<float, char, bool, int>);
36+
}
37+
38+
TEST_CASE("same_none", "[concepts]") {
39+
static_assert(stdx::same_none<int, float, bool, char>);
40+
static_assert(not stdx::same_none<float, bool, char, float>);
41+
}
42+
3343
TEST_CASE("same_as_unqualified", "[concepts]") {
3444
static_assert(stdx::same_as_unqualified<int, int>);
3545
static_assert(not stdx::same_as_unqualified<int, void>);

0 commit comments

Comments
 (0)