Skip to content

Commit bddd8f4

Browse files
H-G-HristovZingam
andauthored
[libc++][concepts] Implements concept helper __libcpp_integer (#78086)
...and tests. --------- Co-authored-by: Zingam <[email protected]>
1 parent 21edd38 commit bddd8f4

File tree

4 files changed

+193
-0
lines changed

4 files changed

+193
-0
lines changed

libcxx/include/__concepts/arithmetic.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,13 @@ concept floating_point = is_floating_point_v<_Tp>;
4242

4343
template <class _Tp>
4444
concept __libcpp_unsigned_integer = __libcpp_is_unsigned_integer<_Tp>::value;
45+
4546
template <class _Tp>
4647
concept __libcpp_signed_integer = __libcpp_is_signed_integer<_Tp>::value;
4748

49+
template <class _Tp>
50+
concept __libcpp_integer = __libcpp_unsigned_integer<_Tp> || __libcpp_signed_integer<_Tp>;
51+
4852
#endif // _LIBCPP_STD_VER >= 20
4953

5054
_LIBCPP_END_NAMESPACE_STD
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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+
11+
// Concept helpers for the internal type traits for the fundamental types.
12+
13+
// template <class _Tp>
14+
// concept __libcpp_integer;
15+
16+
#include <concepts>
17+
18+
#include "test_macros.h"
19+
20+
struct SomeObject {};
21+
22+
enum SomeEnum {};
23+
24+
enum class SomeScopedEnum {};
25+
26+
// Unsigned
27+
static_assert(std::__libcpp_integer<unsigned char>);
28+
static_assert(std::__libcpp_integer<unsigned short int>);
29+
static_assert(std::__libcpp_integer<unsigned int>);
30+
static_assert(std::__libcpp_integer<unsigned long int>);
31+
static_assert(std::__libcpp_integer<unsigned long long int>);
32+
static_assert(std::__libcpp_integer<unsigned short int>);
33+
#ifndef _LIBCPP_HAS_NO_INT128
34+
static_assert(std::__libcpp_integer<__uint128_t>);
35+
#endif
36+
// Signed
37+
static_assert(std::__libcpp_integer<signed char>);
38+
static_assert(std::__libcpp_integer<short int>);
39+
static_assert(std::__libcpp_integer<int>);
40+
static_assert(std::__libcpp_integer<long int>);
41+
static_assert(std::__libcpp_integer<long long int>);
42+
static_assert(std::__libcpp_integer<short int>);
43+
#ifndef _LIBCPP_HAS_NO_INT128
44+
static_assert(std::__libcpp_integer<__int128_t>);
45+
#endif
46+
// Non-integer
47+
static_assert(!std::__libcpp_integer<bool>);
48+
static_assert(!std::__libcpp_integer<char>);
49+
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
50+
static_assert(!std::__libcpp_integer<wchar_t>);
51+
#endif
52+
static_assert(!std::__libcpp_integer<char8_t>);
53+
static_assert(!std::__libcpp_integer<char16_t>);
54+
static_assert(!std::__libcpp_integer<char32_t>);
55+
static_assert(!std::__libcpp_integer<float>);
56+
static_assert(!std::__libcpp_integer<double>);
57+
static_assert(!std::__libcpp_integer<long double>);
58+
static_assert(!std::__libcpp_integer<void>);
59+
static_assert(!std::__libcpp_integer<int*>);
60+
static_assert(!std::__libcpp_integer<unsigned int*>);
61+
static_assert(!std::__libcpp_integer<SomeObject>);
62+
static_assert(!std::__libcpp_integer<SomeEnum>);
63+
static_assert(!std::__libcpp_integer<SomeScopedEnum>);
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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+
11+
// Concept helpers for the internal type traits for the fundamental types.
12+
13+
// template <class _Tp>
14+
// concept __libcpp_signed_integer;
15+
16+
#include <concepts>
17+
18+
#include "test_macros.h"
19+
20+
struct SomeObject {};
21+
22+
enum SomeEnum {};
23+
24+
enum class SomeScopedEnum {};
25+
26+
// Unsigned
27+
static_assert(!std::__libcpp_signed_integer<unsigned char>);
28+
static_assert(!std::__libcpp_signed_integer<unsigned short int>);
29+
static_assert(!std::__libcpp_signed_integer<unsigned int>);
30+
static_assert(!std::__libcpp_signed_integer<unsigned long int>);
31+
static_assert(!std::__libcpp_signed_integer<unsigned long long int>);
32+
static_assert(!std::__libcpp_signed_integer<unsigned short int>);
33+
#ifndef _LIBCPP_HAS_NO_INT128
34+
static_assert(!std::__libcpp_signed_integer<__uint128_t>);
35+
#endif
36+
// Signed
37+
static_assert(std::__libcpp_signed_integer<signed char>);
38+
static_assert(std::__libcpp_signed_integer<short int>);
39+
static_assert(std::__libcpp_signed_integer<int>);
40+
static_assert(std::__libcpp_signed_integer<long int>);
41+
static_assert(std::__libcpp_signed_integer<long long int>);
42+
static_assert(std::__libcpp_signed_integer<short int>);
43+
#ifndef _LIBCPP_HAS_NO_INT128
44+
static_assert(std::__libcpp_signed_integer<__int128_t>);
45+
#endif
46+
// Non-integer
47+
static_assert(!std::__libcpp_signed_integer<bool>);
48+
static_assert(!std::__libcpp_signed_integer<char>);
49+
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
50+
static_assert(!std::__libcpp_signed_integer<wchar_t>);
51+
#endif
52+
static_assert(!std::__libcpp_signed_integer<char8_t>);
53+
static_assert(!std::__libcpp_signed_integer<char16_t>);
54+
static_assert(!std::__libcpp_signed_integer<char32_t>);
55+
static_assert(!std::__libcpp_signed_integer<float>);
56+
static_assert(!std::__libcpp_signed_integer<double>);
57+
static_assert(!std::__libcpp_signed_integer<long double>);
58+
static_assert(!std::__libcpp_signed_integer<void>);
59+
static_assert(!std::__libcpp_signed_integer<int*>);
60+
static_assert(!std::__libcpp_signed_integer<unsigned int*>);
61+
static_assert(!std::__libcpp_signed_integer<SomeObject>);
62+
static_assert(!std::__libcpp_signed_integer<SomeEnum>);
63+
static_assert(!std::__libcpp_signed_integer<SomeScopedEnum>);
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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+
11+
// Concept helpers for the internal type traits for the fundamental types.
12+
13+
// template <class _Tp>
14+
// concept __libcpp_unsigned_integer;
15+
16+
#include <concepts>
17+
18+
#include "test_macros.h"
19+
20+
struct SomeObject {};
21+
22+
enum SomeEnum {};
23+
24+
enum class SomeScopedEnum {};
25+
26+
// Unsigned
27+
static_assert(std::__libcpp_unsigned_integer<unsigned char>);
28+
static_assert(std::__libcpp_unsigned_integer<unsigned short int>);
29+
static_assert(std::__libcpp_unsigned_integer<unsigned int>);
30+
static_assert(std::__libcpp_unsigned_integer<unsigned long int>);
31+
static_assert(std::__libcpp_unsigned_integer<unsigned long long int>);
32+
static_assert(std::__libcpp_unsigned_integer<unsigned short int>);
33+
#ifndef _LIBCPP_HAS_NO_INT128
34+
static_assert(std::__libcpp_unsigned_integer<__uint128_t>);
35+
#endif
36+
// Signed
37+
static_assert(!std::__libcpp_unsigned_integer<signed char>);
38+
static_assert(!std::__libcpp_unsigned_integer<short int>);
39+
static_assert(!std::__libcpp_unsigned_integer<int>);
40+
static_assert(!std::__libcpp_unsigned_integer<long int>);
41+
static_assert(!std::__libcpp_unsigned_integer<long long int>);
42+
static_assert(!std::__libcpp_unsigned_integer<short int>);
43+
#ifndef _LIBCPP_HAS_NO_INT128
44+
static_assert(!std::__libcpp_unsigned_integer<__int128_t>);
45+
#endif
46+
// Non-integer
47+
static_assert(!std::__libcpp_unsigned_integer<bool>);
48+
static_assert(!std::__libcpp_unsigned_integer<char>);
49+
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
50+
static_assert(!std::__libcpp_unsigned_integer<wchar_t>);
51+
#endif
52+
static_assert(!std::__libcpp_unsigned_integer<char8_t>);
53+
static_assert(!std::__libcpp_unsigned_integer<char16_t>);
54+
static_assert(!std::__libcpp_unsigned_integer<char32_t>);
55+
static_assert(!std::__libcpp_unsigned_integer<float>);
56+
static_assert(!std::__libcpp_unsigned_integer<double>);
57+
static_assert(!std::__libcpp_unsigned_integer<long double>);
58+
static_assert(!std::__libcpp_unsigned_integer<void>);
59+
static_assert(!std::__libcpp_unsigned_integer<int*>);
60+
static_assert(!std::__libcpp_unsigned_integer<unsigned int*>);
61+
static_assert(!std::__libcpp_unsigned_integer<SomeObject>);
62+
static_assert(!std::__libcpp_unsigned_integer<SomeEnum>);
63+
static_assert(!std::__libcpp_unsigned_integer<SomeScopedEnum>);

0 commit comments

Comments
 (0)