Skip to content

Commit 9f4f6ac

Browse files
committed
[libcxx] adds concept std::uniform_random_bit_generator
Implements parts of: - P0898R3 Standard Library Concepts - P1754 Rename concepts to standard_case for C++20, while we still can Differential Revision: https://reviews.llvm.org/D96577
1 parent 71d1f78 commit 9f4f6ac

File tree

5 files changed

+163
-15
lines changed

5 files changed

+163
-15
lines changed

libcxx/include/concepts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ concept invocable = requires(_Fn&& __fn, _Args&&... __args) {
228228
template<class _Fn, class... _Args>
229229
concept regular_invocable = invocable<_Fn, _Args...>;
230230

231-
#endif //_LIBCPP_STD_VER > 17 && defined(__cpp_concepts) && __cpp_concepts >= 201811L
231+
#endif // _LIBCPP_STD_VER > 17 && defined(__cpp_concepts) && __cpp_concepts >= 201811L
232232

233233
_LIBCPP_END_NAMESPACE_STD
234234

libcxx/include/random

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
1818
namespace std
1919
{
20+
// [rand.req.urng], uniform random bit generator requirements
21+
template<class G>
22+
concept uniform_random_bit_generator = see below; // C++20
2023
2124
// Engines
2225
@@ -1678,6 +1681,7 @@ class piecewise_linear_distribution
16781681
#include <cstddef>
16791682
#include <cstdint>
16801683
#include <cmath>
1684+
#include <concepts>
16811685
#include <type_traits>
16821686
#include <initializer_list>
16831687
#include <limits>
@@ -1697,6 +1701,20 @@ _LIBCPP_PUSH_MACROS
16971701

16981702
_LIBCPP_BEGIN_NAMESPACE_STD
16991703

1704+
#if _LIBCPP_STD_VER > 17 && defined(__cpp_concepts) && __cpp_concepts >= 201811L
1705+
1706+
// [rand.req.urng]
1707+
template<class _Gen>
1708+
concept uniform_random_bit_generator =
1709+
invocable<_Gen&> && unsigned_integral<invoke_result_t<_Gen&>> &&
1710+
requires {
1711+
{ _Gen::min() } -> same_as<invoke_result_t<_Gen&>>;
1712+
{ _Gen::max() } -> same_as<invoke_result_t<_Gen&>>;
1713+
requires bool_constant<(_Gen::min() < _Gen::max())>::value;
1714+
};
1715+
1716+
#endif // _LIBCPP_STD_VER > 17 && defined(__cpp_concepts) && __cpp_concepts >= 201811L
1717+
17001718
// __is_seed_sequence
17011719

17021720
template <class _Sseq, class _Engine>

libcxx/test/std/concepts/lang/arithmetic.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
9+
// UNSUPPORTED: c++03, c++11, c++14, c++17
1010
// UNSUPPORTED: libcpp-no-concepts
1111

1212
// template<class T>

libcxx/test/std/numerics/rand/rand.req/rand.req.urng/nothing_to_do.pass.cpp

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
// UNSUPPORTED: c++03, c++11, c++14, c++17
10+
// UNSUPPORTED: libcpp-no-concepts
11+
12+
// template<class T>
13+
// concept uniform_random_bit_generator = // see below
14+
15+
#include <random>
16+
17+
static_assert(std::uniform_random_bit_generator<
18+
std::linear_congruential_engine<unsigned int, 0U, 1U, 2U> >);
19+
20+
#ifndef _LIBCPP_HAS_NO_INT128
21+
static_assert(std::uniform_random_bit_generator<
22+
std::subtract_with_carry_engine<__uint128_t, 1U, 2U, 3U> >);
23+
#endif
24+
25+
// Not invocable
26+
static_assert(!std::uniform_random_bit_generator<void>);
27+
static_assert(!std::uniform_random_bit_generator<int>);
28+
static_assert(!std::uniform_random_bit_generator<int[10]>);
29+
static_assert(!std::uniform_random_bit_generator<int*>);
30+
static_assert(!std::uniform_random_bit_generator<const int*>);
31+
static_assert(!std::uniform_random_bit_generator<volatile int*>);
32+
static_assert(!std::uniform_random_bit_generator<const volatile int*>);
33+
static_assert(!std::uniform_random_bit_generator<int&>);
34+
static_assert(!std::uniform_random_bit_generator<const int&>);
35+
static_assert(!std::uniform_random_bit_generator<volatile int&>);
36+
static_assert(!std::uniform_random_bit_generator<const volatile int&>);
37+
static_assert(!std::uniform_random_bit_generator<int&&>);
38+
static_assert(!std::uniform_random_bit_generator<const int&&>);
39+
static_assert(!std::uniform_random_bit_generator<volatile int&&>);
40+
static_assert(!std::uniform_random_bit_generator<const volatile int&&>);
41+
42+
struct Empty {};
43+
static_assert(!std::uniform_random_bit_generator<Empty>);
44+
45+
namespace WrongReturnType {
46+
using FunctionPointer = void (*)();
47+
static_assert(!std::uniform_random_bit_generator<FunctionPointer>);
48+
49+
using FunctionReference = int (&)();
50+
static_assert(!std::uniform_random_bit_generator<FunctionReference>);
51+
52+
struct FunctionObject {
53+
unsigned long* operator()();
54+
};
55+
static_assert(!std::uniform_random_bit_generator<FunctionObject>);
56+
static_assert(!std::uniform_random_bit_generator<unsigned int Empty::*>);
57+
static_assert(!std::uniform_random_bit_generator<unsigned short (Empty::*)()>);
58+
} // namespace WrongReturnType
59+
60+
namespace NoMinOrMax {
61+
using FunctionPointer = unsigned int (*)();
62+
static_assert(!std::uniform_random_bit_generator<FunctionPointer>);
63+
64+
using FunctionReference = unsigned long long (&)();
65+
static_assert(!std::uniform_random_bit_generator<FunctionReference>);
66+
67+
struct FunctionObject {
68+
unsigned char operator()();
69+
};
70+
static_assert(!std::uniform_random_bit_generator<FunctionObject>);
71+
} // namespace NoMinOrMax
72+
73+
namespace OnlyMinIsRight {
74+
struct NoMax {
75+
unsigned char operator()();
76+
77+
static unsigned char min();
78+
};
79+
static_assert(!std::uniform_random_bit_generator<NoMax>);
80+
81+
struct MaxHasWrongReturnType {
82+
unsigned char operator()();
83+
84+
static unsigned char min();
85+
static unsigned int max();
86+
};
87+
88+
static_assert(!std::uniform_random_bit_generator<MaxHasWrongReturnType>);
89+
} // namespace OnlyMinIsRight
90+
91+
namespace OnlyMaxIsRight {
92+
struct NoMin {
93+
unsigned char operator()();
94+
95+
static unsigned char max();
96+
};
97+
static_assert(!std::uniform_random_bit_generator<NoMin>);
98+
99+
struct MinHasWrongReturnType {
100+
unsigned char operator()();
101+
102+
static unsigned int min();
103+
static unsigned char max();
104+
};
105+
106+
static_assert(!std::uniform_random_bit_generator<MinHasWrongReturnType>);
107+
} // namespace OnlyMaxIsRight
108+
109+
namespace MinNotLessMax {
110+
struct NotConstexpr {
111+
unsigned char operator()();
112+
113+
static unsigned char min();
114+
static unsigned char max();
115+
};
116+
static_assert(!std::uniform_random_bit_generator<NotConstexpr>);
117+
118+
struct MinEqualsMax {
119+
unsigned char operator()();
120+
121+
static constexpr unsigned char min() { return 0; }
122+
static constexpr unsigned char max() { return 0; }
123+
};
124+
static_assert(!std::uniform_random_bit_generator<MinEqualsMax>);
125+
126+
struct MaxLessThanMin {
127+
unsigned char operator()();
128+
129+
static constexpr unsigned char min() { return 1; }
130+
static constexpr unsigned char max() { return 0; }
131+
};
132+
static_assert(!std::uniform_random_bit_generator<MaxLessThanMin>);
133+
} // namespace MinNotLessMax
134+
135+
struct Works {
136+
unsigned char operator()();
137+
138+
static constexpr unsigned char min() { return 0; }
139+
static constexpr unsigned char max() { return 1; }
140+
};
141+
static_assert(std::uniform_random_bit_generator<Works>);
142+
143+
int main(int, char**) { return 0; }

0 commit comments

Comments
 (0)