Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
23.vector.allocator.cpp
Go to the documentation of this file.
1
32// disable debug iterators to prevent compilation errors
33#include <rw/_config.h>
34
35#ifndef _RWSTD_NO_DEBUG_ITER
36# define _RWSTD_NO_DEBUG_ITER
37#endif // _RWSTD_NO_DEBUG_ITER
38
39#include <memory>
40#include <vector>
41#include <cstddef> // for ptrdiff_t, size_t
42
43#include <rw_driver.h>
44
45
47// DESCRIPTION:
48// Test instantiates std::vector on a user-defined type, user-defined
49// allocator and a user-defined pointer type, making sure that everything
50// still compiles and runs with expected results
51
52// Note: 20.1.5, p2, Allocator requirements specifies that the type
53// std::allocator<T>::pointer be a "pointer to T", which might
54// make this test case not well-defined; it is expected that
55// this will be changed in a future revision of the Standard
56
57// user-defined pointer type
58template <class T>
59struct Pointer
60{
61 typedef T value_type;
62 typedef std::size_t size_type;
63 typedef std::ptrdiff_t difference_type;
65 typedef const value_type* const_pointer;
68 typedef std::random_access_iterator_tag iterator_category;
69
70 Pointer (): offset_ (0) { }
71
73 : offset_ (rhs.offset_) { }
74
76
79 }
80
81 bool operator== (const Pointer &rhs) const {
82 return offset_ == rhs.offset_;
83 }
84
85 bool operator!= (const Pointer &rhs) const {
86 return !operator== (rhs);
87 }
88
89 bool operator< (const Pointer &rhs) const {
90 return offset_ < rhs.offset_;
91 }
92
93 bool operator<= (const Pointer &rhs) const {
94 return !(*this > rhs);
95 }
96
97 bool operator> (const Pointer &rhs) const {
98 return rhs < *this;
99 }
100
101 bool operator>= (const Pointer &rhs) const {
102 return !(*this < rhs);
103 }
104
105 Pointer& operator++ () {
108 return *this;
109 }
110
111 Pointer& operator-- () {
114 return *this;
115 }
116
117 Pointer& operator+= (difference_type i) {
120 return *this;
121 }
122
123 Pointer& operator-= (difference_type i) {
124 return *this += -i;
125 }
126
128 return Pointer (*this) += i;
129 }
130
132 return Pointer (*this) -= i;
133 }
134
138 return p1 - p2;
139 }
140
142
143private:
144
145 // deliberately not defined to detect their use
146 void operator++ (int);
147 void operator-- (int);
148
149};
150
151
153// user-defined allocator
154template <class T>
155class Allocator
156{
157public:
158 typedef T value_type;
159 typedef std::size_t size_type;
160 typedef std::ptrdiff_t difference_type;
163 typedef T& reference;
164 typedef const T& const_reference;
165 typedef std::random_access_iterator_tag iterator_category;
166
169 }
170
173 1);
174 }
175
176 Allocator () throw () {}
177
178 template <class U>
179 Allocator (const Allocator<U>&) throw () {}
180
181 pointer allocate (size_type n, const void* = 0) {
182 void* const ptr = operator new (n * sizeof (T));
184 }
185
187 operator delete (_RWSTD_REINTERPRET_CAST (void*, ptr.offset_));
188 }
189
191 new (_RWSTD_REINTERPRET_CAST (void*, ptr.offset_)) value_type (val);
192 }
193
195 _RWSTD_REINTERPRET_CAST (T*, ptr.offset_)->~value_type ();
196 }
197
198 size_type max_size () const throw () {
199 return size_type (-1) / sizeof (T);
200 }
201
202 template <class U>
203 struct rebind { typedef Allocator<U> other; };
204
205 bool operator== (const Allocator&) const {
206 return 1;
207 }
208
209 bool operator!= (const Allocator &rhs) const {
210 return !operator== (rhs);
211 }
212};
213
214
216// user-defined type
217struct MyClass
218{
219 int i_;
220 int j_;
221};
222
223
225#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION
226
227// explicitly instantiate to better exercise the template
228template class std::vector<MyClass, Allocator<MyClass> >;
229
230#endif // _RWSTD_NO_EXPLICIT_INSTANTIATION
231
232
233static int
234run_test (int, char**)
235{
236 rw_warn (0, 0, __LINE__, "debugging iterators disabled");
237
238 typedef std::vector<MyClass, Allocator<MyClass> > Vector;
239
240 const Vector::size_type nelems = 256;
241
242 const MyClass value = { 0, 0 };
243
244 Vector v (nelems, value);
245
246 rw_assert (nelems == v.size (), 0, __LINE__,
247 "vector(%zu, value_type).size() == %1$zu, got %zu",
248 nelems, v.size ());
249
250 Vector ().swap (v);
251
252 rw_assert (0 == v.size (), 0, __LINE__,
253 "vector().swap(vector&).size() == 0, got %zu",
254 v.size ());
255
256 Vector::size_type i;
257
258 for (i = 0; i != nelems; ++i)
259 v.push_back (value);
260
261 rw_assert (nelems == v.size (), 0, __LINE__,
262 "vector::size() == %1$zu, got %zu",
263 nelems, v.size ());
264
265 return 0;
266}
267
268
270int main (int argc, char** argv)
271{
272 return rw_test (argc, argv, __FILE__,
273 "lib.vector",
274 "with a user-defined allocator and pointer types",
275 run_test,
276 "",
277 (void*)0);
278}
#define i
Definition 17.names.cpp:126
#define T
Definition 17.names.cpp:163
#define rhs
Definition 17.names.cpp:536
#define v
Definition 17.names.cpp:138
#define r
Definition 17.names.cpp:134
#define ptr
Definition 17.names.cpp:525
#define p2
Definition 17.names.cpp:265
#define off
Definition 17.names.cpp:507
#define n
Definition 17.names.cpp:130
#define p1
Definition 17.names.cpp:239
#define val
Definition 17.names.cpp:570
#define Pointer
Definition 17.names.cpp:517
std::vector< UserClass, std::allocator< UserClass > > Vector
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
const minus< T > & operator-(const minus< T > &lhs, const minus< T > &rhs)
const plus_asgn< T > & operator*(const plus_asgn< T > &lhs, const plus_asgn< T > &rhs)
T value(const T &val)
#define main
void operator+(typename A< T >::I, const A< T > &)
#define _RWSTD_REINTERPRET_CAST(T, x)
Definition _defs.h:535
bool operator>(const DistancePair &lhs, const DistancePair &rhs)
Definition graph.cpp:47
bool operator==(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
Definition json.h:14737
bool operator!=(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
Definition json.h:14762
bool operator<(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
Definition json.h:14787
_TEST_EXPORT int rw_test(int argc, char *argv[], const char *filename, const char *clause, const char *comment, int(*testfun)(int, char **), const char *optspec,...)
_TEST_EXPORT int rw_assert(int, const char *, int, const char *,...)
Definition driver.cpp:1630
_TEST_EXPORT int rw_warn(int, const char *, int, const char *,...)
Definition driver.cpp:1647
const T & const_reference
void destroy(pointer ptr)
const Pointer< T > const_pointer
Pointer< T > pointer
pointer address(reference r) const
Allocator(const Allocator< U > &)
std::size_t size_type
pointer allocate(size_type n, const void *=0)
std::random_access_iterator_tag iterator_category
const_pointer address(const_reference r) const
void deallocate(pointer ptr, size_type)
size_type max_size() const
void construct(pointer ptr, const_reference val)
std::ptrdiff_t difference_type
int i_
Definition EXPORT.cpp:52
std::random_access_iterator_tag iterator_category
value_type & reference
std::size_t size_type
const value_type * const_pointer
value_type * pointer
Pointer(difference_type off, int)
std::ptrdiff_t difference_type
const value_type & const_reference
Pointer(const Pointer &rhs)
difference_type offset_