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
10
11#include <scoped_allocator>
12#include <memory>
13#include <cassert>
14
15// #include <memory>
16
17#include "test_macros.h"
18//
19// template <class Alloc>
20// struct allocator_traits
21// {
22// typedef Alloc allocator_type;
23// typedef typename allocator_type::value_type
24// value_type;
25//
26// typedef Alloc::pointer | value_type* pointer;
27// typedef Alloc::const_pointer
28// | pointer_traits<pointer>::rebind<const value_type>
29// const_pointer;
30// typedef Alloc::void_pointer
31// | pointer_traits<pointer>::rebind<void>
32// void_pointer;
33// typedef Alloc::const_void_pointer
34// | pointer_traits<pointer>::rebind<const void>
35// const_void_pointer;
36
37template <typename Alloc>
38void test_pointer() {
39 typename std::allocator_traits<Alloc>::pointer vp;
40 typename std::allocator_traits<Alloc>::const_pointer cvp;
41
42 ((void)vp); // Prevent unused warning
43 ((void)cvp); // Prevent unused warning
44
45 static_assert(std::is_same<bool, decltype(vp == vp)>::value, "");
46 static_assert(std::is_same<bool, decltype(vp != vp)>::value, "");
47 static_assert(std::is_same<bool, decltype(vp > vp)>::value, "");
48 static_assert(std::is_same<bool, decltype(vp >= vp)>::value, "");
49 static_assert(std::is_same<bool, decltype(vp < vp)>::value, "");
50 static_assert(std::is_same<bool, decltype(vp <= vp)>::value, "");
51
52 static_assert(std::is_same<bool, decltype(vp == cvp)>::value, "");
53 static_assert(std::is_same<bool, decltype(cvp == vp)>::value, "");
54 static_assert(std::is_same<bool, decltype(vp != cvp)>::value, "");
55 static_assert(std::is_same<bool, decltype(cvp != vp)>::value, "");
56 static_assert(std::is_same<bool, decltype(vp > cvp)>::value, "");
57 static_assert(std::is_same<bool, decltype(cvp > vp)>::value, "");
58 static_assert(std::is_same<bool, decltype(vp >= cvp)>::value, "");
59 static_assert(std::is_same<bool, decltype(cvp >= vp)>::value, "");
60 static_assert(std::is_same<bool, decltype(vp < cvp)>::value, "");
61 static_assert(std::is_same<bool, decltype(cvp < vp)>::value, "");
62 static_assert(std::is_same<bool, decltype(vp <= cvp)>::value, "");
63 static_assert(std::is_same<bool, decltype(cvp <= vp)>::value, "");
64
65 static_assert(std::is_same<bool, decltype(cvp == cvp)>::value, "");
66 static_assert(std::is_same<bool, decltype(cvp != cvp)>::value, "");
67 static_assert(std::is_same<bool, decltype(cvp > cvp)>::value, "");
68 static_assert(std::is_same<bool, decltype(cvp >= cvp)>::value, "");
69 static_assert(std::is_same<bool, decltype(cvp < cvp)>::value, "");
70 static_assert(std::is_same<bool, decltype(cvp <= cvp)>::value, "");
71}
72
73template <typename Alloc>
74void test_void_pointer() {
75 typename std::allocator_traits<Alloc>::void_pointer vp;
76 typename std::allocator_traits<Alloc>::const_void_pointer cvp;
77
78 ((void)vp); // Prevent unused warning
79 ((void)cvp); // Prevent unused warning
80
81 static_assert(std::is_same<bool, decltype(vp == vp)>::value, "");
82 static_assert(std::is_same<bool, decltype(vp != vp)>::value, "");
83 static_assert(std::is_same<bool, decltype(vp > vp)>::value, "");
84 static_assert(std::is_same<bool, decltype(vp >= vp)>::value, "");
85 static_assert(std::is_same<bool, decltype(vp < vp)>::value, "");
86 static_assert(std::is_same<bool, decltype(vp <= vp)>::value, "");
87
88 static_assert(std::is_same<bool, decltype(vp == cvp)>::value, "");
89 static_assert(std::is_same<bool, decltype(cvp == vp)>::value, "");
90 static_assert(std::is_same<bool, decltype(vp != cvp)>::value, "");
91 static_assert(std::is_same<bool, decltype(cvp != vp)>::value, "");
92 static_assert(std::is_same<bool, decltype(vp > cvp)>::value, "");
93 static_assert(std::is_same<bool, decltype(cvp > vp)>::value, "");
94 static_assert(std::is_same<bool, decltype(vp >= cvp)>::value, "");
95 static_assert(std::is_same<bool, decltype(cvp >= vp)>::value, "");
96 static_assert(std::is_same<bool, decltype(vp < cvp)>::value, "");
97 static_assert(std::is_same<bool, decltype(cvp < vp)>::value, "");
98 static_assert(std::is_same<bool, decltype(vp <= cvp)>::value, "");
99 static_assert(std::is_same<bool, decltype(cvp <= vp)>::value, "");
100
101 static_assert(std::is_same<bool, decltype(cvp == cvp)>::value, "");
102 static_assert(std::is_same<bool, decltype(cvp != cvp)>::value, "");
103 static_assert(std::is_same<bool, decltype(cvp > cvp)>::value, "");
104 static_assert(std::is_same<bool, decltype(cvp >= cvp)>::value, "");
105 static_assert(std::is_same<bool, decltype(cvp < cvp)>::value, "");
106 static_assert(std::is_same<bool, decltype(cvp <= cvp)>::value, "");
107}
108
109struct Foo {
110 int x;
111};
112
113int main(int, char**) {
114 test_pointer<std::scoped_allocator_adaptor<std::allocator<char>>>();
115 test_pointer<std::scoped_allocator_adaptor<std::allocator<int>>>();
116 test_pointer<std::scoped_allocator_adaptor<std::allocator<Foo>>>();
117
118 test_void_pointer<std::scoped_allocator_adaptor<std::allocator<char>>>();
119 test_void_pointer<std::scoped_allocator_adaptor<std::allocator<int>>>();
120 test_void_pointer<std::scoped_allocator_adaptor<std::allocator<Foo>>>();
121
122 return 0;
123}
124

source code of libcxx/test/std/utilities/allocator.adaptor/allocator.adaptor.types/allocator_pointers.pass.cpp