root / lab4 / .minix-src / include / c++ / experimental / dynarray
History | View | Annotate | Download (11.1 KB)
1 | 13 | up20180614 | // -*- C++ -*- |
---|---|---|---|
2 | //===-------------------------- dynarray ----------------------------------===// |
||
3 | // |
||
4 | // The LLVM Compiler Infrastructure |
||
5 | // |
||
6 | // This file is dual licensed under the MIT and the University of Illinois Open |
||
7 | // Source Licenses. See LICENSE.TXT for details. |
||
8 | // |
||
9 | //===----------------------------------------------------------------------===// |
||
10 | |||
11 | #ifndef _LIBCPP_DYNARRAY |
||
12 | #define _LIBCPP_DYNARRAY |
||
13 | |||
14 | #include <__config> |
||
15 | #if _LIBCPP_STD_VER > 11 |
||
16 | |||
17 | /* |
||
18 | dynarray synopsis |
||
19 | |||
20 | namespace std { namespace experimental { |
||
21 | |||
22 | template< typename T > |
||
23 | class dynarray |
||
24 | { |
||
25 | // types: |
||
26 | typedef T value_type; |
||
27 | typedef T& reference; |
||
28 | typedef const T& const_reference; |
||
29 | typedef T* pointer; |
||
30 | typedef const T* const_pointer; |
||
31 | typedef implementation-defined iterator; |
||
32 | typedef implementation-defined const_iterator; |
||
33 | typedef reverse_iterator<iterator> reverse_iterator; |
||
34 | typedef reverse_iterator<const_iterator> const_reverse_iterator; |
||
35 | typedef size_t size_type; |
||
36 | typedef ptrdiff_t difference_type; |
||
37 | |||
38 | public: |
||
39 | // construct/copy/destroy: |
||
40 | explicit dynarray(size_type c); |
||
41 | dynarray(size_type c, const T& v); |
||
42 | dynarray(const dynarray& d); |
||
43 | dynarray(initializer_list<T>); |
||
44 | |||
45 | template <class Alloc> |
||
46 | dynarray(allocator_arg_t, const Alloc& a, size_type c, const Alloc& alloc); |
||
47 | template <class Alloc> |
||
48 | dynarray(allocator_arg_t, const Alloc& a, size_type c, const T& v, const Alloc& alloc); |
||
49 | template <class Alloc> |
||
50 | dynarray(allocator_arg_t, const Alloc& a, const dynarray& d, const Alloc& alloc); |
||
51 | template <class Alloc> |
||
52 | dynarray(allocator_arg_t, const Alloc& a, initializer_list<T>, const Alloc& alloc); |
||
53 | dynarray& operator=(const dynarray&) = delete; |
||
54 | ~dynarray(); |
||
55 | |||
56 | // iterators: |
||
57 | iterator begin() noexcept; |
||
58 | const_iterator begin() const noexcept; |
||
59 | const_iterator cbegin() const noexcept; |
||
60 | iterator end() noexcept; |
||
61 | const_iterator end() const noexcept; |
||
62 | const_iterator cend() const noexcept; |
||
63 | |||
64 | reverse_iterator rbegin() noexcept; |
||
65 | const_reverse_iterator rbegin() const noexcept; |
||
66 | const_reverse_iterator crbegin() const noexcept; |
||
67 | reverse_iterator rend() noexcept; |
||
68 | const_reverse_iterator rend() const noexcept; |
||
69 | const_reverse_iterator crend() const noexcept; |
||
70 | |||
71 | // capacity: |
||
72 | size_type size() const noexcept; |
||
73 | size_type max_size() const noexcept; |
||
74 | bool empty() const noexcept; |
||
75 | |||
76 | // element access: |
||
77 | reference operator[](size_type n); |
||
78 | const_reference operator[](size_type n) const; |
||
79 | |||
80 | reference front(); |
||
81 | const_reference front() const; |
||
82 | reference back(); |
||
83 | const_reference back() const; |
||
84 | |||
85 | const_reference at(size_type n) const; |
||
86 | reference at(size_type n); |
||
87 | |||
88 | // data access: |
||
89 | T* data() noexcept; |
||
90 | const T* data() const noexcept; |
||
91 | |||
92 | // mutating member functions: |
||
93 | void fill(const T& v); |
||
94 | }; |
||
95 | |||
96 | }} // std::experimental |
||
97 | |||
98 | */ |
||
99 | |||
100 | #include <__functional_base> |
||
101 | #include <iterator> |
||
102 | #include <stdexcept> |
||
103 | #include <initializer_list> |
||
104 | #include <new> |
||
105 | #include <algorithm> |
||
106 | |||
107 | #include <__undef___deallocate> |
||
108 | |||
109 | #if defined(_LIBCPP_NO_EXCEPTIONS) |
||
110 | #include <cassert> |
||
111 | #endif |
||
112 | |||
113 | #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
||
114 | #pragma GCC system_header |
||
115 | #endif |
||
116 | |||
117 | namespace std { namespace experimental { inline namespace __array_extensions_v1 { |
||
118 | |||
119 | template <class _Tp> |
||
120 | struct _LIBCPP_TYPE_VIS_ONLY dynarray |
||
121 | { |
||
122 | public: |
||
123 | // types: |
||
124 | typedef dynarray __self; |
||
125 | typedef _Tp value_type; |
||
126 | typedef value_type& reference; |
||
127 | typedef const value_type& const_reference; |
||
128 | typedef value_type* iterator; |
||
129 | typedef const value_type* const_iterator; |
||
130 | typedef value_type* pointer; |
||
131 | typedef const value_type* const_pointer; |
||
132 | typedef size_t size_type; |
||
133 | typedef ptrdiff_t difference_type; |
||
134 | typedef std::reverse_iterator<iterator> reverse_iterator; |
||
135 | typedef std::reverse_iterator<const_iterator> const_reverse_iterator; |
||
136 | |||
137 | private: |
||
138 | size_t __size_; |
||
139 | value_type * __base_; |
||
140 | _LIBCPP_ALWAYS_INLINE dynarray () noexcept : __base_(nullptr), __size_(0) {} |
||
141 | |||
142 | static inline _LIBCPP_INLINE_VISIBILITY value_type* __allocate ( size_t count ) |
||
143 | { |
||
144 | if ( numeric_limits<size_t>::max() / sizeof (value_type) <= count ) |
||
145 | { |
||
146 | #ifndef _LIBCPP_NO_EXCEPTIONS |
||
147 | throw bad_array_length(); |
||
148 | #else |
||
149 | assert(!"dynarray::allocation"); |
||
150 | #endif |
||
151 | } |
||
152 | return static_cast<value_type *> (_VSTD::__allocate (sizeof(value_type) * count)); |
||
153 | } |
||
154 | |||
155 | static inline _LIBCPP_INLINE_VISIBILITY void __deallocate ( value_type* __ptr ) noexcept |
||
156 | { |
||
157 | _VSTD::__deallocate (static_cast<void *> (__ptr)); |
||
158 | } |
||
159 | |||
160 | public: |
||
161 | |||
162 | explicit dynarray(size_type __c); |
||
163 | dynarray(size_type __c, const value_type& __v); |
||
164 | dynarray(const dynarray& __d); |
||
165 | dynarray(initializer_list<value_type>); |
||
166 | |||
167 | // We're not implementing these right now. |
||
168 | // Updated with the resolution of LWG issue #2255 |
||
169 | // template <typename _Alloc> |
||
170 | // dynarray(allocator_arg_t, const _Alloc& __alloc, size_type __c); |
||
171 | // template <typename _Alloc> |
||
172 | // dynarray(allocator_arg_t, const _Alloc& __alloc, size_type __c, const value_type& __v); |
||
173 | // template <typename _Alloc> |
||
174 | // dynarray(allocator_arg_t, const _Alloc& __alloc, const dynarray& __d); |
||
175 | // template <typename _Alloc> |
||
176 | // dynarray(allocator_arg_t, const _Alloc& __alloc, initializer_list<value_type>); |
||
177 | |||
178 | dynarray& operator=(const dynarray&) = delete; |
||
179 | ~dynarray(); |
||
180 | |||
181 | // iterators: |
||
182 | inline _LIBCPP_INLINE_VISIBILITY iterator begin() noexcept { return iterator(data()); } |
||
183 | inline _LIBCPP_INLINE_VISIBILITY const_iterator begin() const noexcept { return const_iterator(data()); } |
||
184 | inline _LIBCPP_INLINE_VISIBILITY const_iterator cbegin() const noexcept { return const_iterator(data()); } |
||
185 | inline _LIBCPP_INLINE_VISIBILITY iterator end() noexcept { return iterator(data() + __size_); } |
||
186 | inline _LIBCPP_INLINE_VISIBILITY const_iterator end() const noexcept { return const_iterator(data() + __size_); } |
||
187 | inline _LIBCPP_INLINE_VISIBILITY const_iterator cend() const noexcept { return const_iterator(data() + __size_); } |
||
188 | |||
189 | inline _LIBCPP_INLINE_VISIBILITY reverse_iterator rbegin() noexcept { return reverse_iterator(end()); } |
||
190 | inline _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); } |
||
191 | inline _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); } |
||
192 | inline _LIBCPP_INLINE_VISIBILITY reverse_iterator rend() noexcept { return reverse_iterator(begin()); } |
||
193 | inline _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); } |
||
194 | inline _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); } |
||
195 | |||
196 | // capacity: |
||
197 | inline _LIBCPP_INLINE_VISIBILITY size_type size() const noexcept { return __size_; } |
||
198 | inline _LIBCPP_INLINE_VISIBILITY size_type max_size() const noexcept { return __size_; } |
||
199 | inline _LIBCPP_INLINE_VISIBILITY bool empty() const noexcept { return __size_ == 0; } |
||
200 | |||
201 | // element access: |
||
202 | inline _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) { return data()[__n]; } |
||
203 | inline _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const { return data()[__n]; } |
||
204 | |||
205 | inline _LIBCPP_INLINE_VISIBILITY reference front() { return data()[0]; } |
||
206 | inline _LIBCPP_INLINE_VISIBILITY const_reference front() const { return data()[0]; } |
||
207 | inline _LIBCPP_INLINE_VISIBILITY reference back() { return data()[__size_-1]; } |
||
208 | inline _LIBCPP_INLINE_VISIBILITY const_reference back() const { return data()[__size_-1]; } |
||
209 | |||
210 | inline _LIBCPP_INLINE_VISIBILITY const_reference at(size_type __n) const; |
||
211 | inline _LIBCPP_INLINE_VISIBILITY reference at(size_type __n); |
||
212 | |||
213 | // data access: |
||
214 | inline _LIBCPP_INLINE_VISIBILITY _Tp* data() noexcept { return __base_; } |
||
215 | inline _LIBCPP_INLINE_VISIBILITY const _Tp* data() const noexcept { return __base_; } |
||
216 | |||
217 | // mutating member functions: |
||
218 | inline _LIBCPP_INLINE_VISIBILITY void fill(const value_type& __v) { fill_n(begin(), __size_, __v); } |
||
219 | }; |
||
220 | |||
221 | template <class _Tp> |
||
222 | inline _LIBCPP_INLINE_VISIBILITY |
||
223 | dynarray<_Tp>::dynarray(size_type __c) : dynarray () |
||
224 | { |
||
225 | __base_ = __allocate (__c); |
||
226 | value_type *__data = data (); |
||
227 | for ( __size_ = 0; __size_ < __c; ++__size_, ++__data ) |
||
228 | ::new (__data) value_type; |
||
229 | } |
||
230 | |||
231 | template <class _Tp> |
||
232 | inline _LIBCPP_INLINE_VISIBILITY |
||
233 | dynarray<_Tp>::dynarray(size_type __c, const value_type& __v) : dynarray () |
||
234 | { |
||
235 | __base_ = __allocate (__c); |
||
236 | value_type *__data = data (); |
||
237 | for ( __size_ = 0; __size_ < __c; ++__size_, ++__data ) |
||
238 | ::new (__data) value_type (__v); |
||
239 | } |
||
240 | |||
241 | template <class _Tp> |
||
242 | inline _LIBCPP_INLINE_VISIBILITY |
||
243 | dynarray<_Tp>::dynarray(initializer_list<value_type> __il) : dynarray () |
||
244 | { |
||
245 | size_t sz = __il.size(); |
||
246 | __base_ = __allocate (sz); |
||
247 | value_type *__data = data (); |
||
248 | auto src = __il.begin(); |
||
249 | for ( __size_ = 0; __size_ < sz; ++__size_, ++__data, ++src ) |
||
250 | ::new (__data) value_type (*src); |
||
251 | } |
||
252 | |||
253 | template <class _Tp> |
||
254 | inline _LIBCPP_INLINE_VISIBILITY |
||
255 | dynarray<_Tp>::dynarray(const dynarray& __d) : dynarray () |
||
256 | { |
||
257 | size_t sz = __d.size(); |
||
258 | __base_ = __allocate (sz); |
||
259 | value_type *__data = data (); |
||
260 | auto src = __d.begin(); |
||
261 | for ( __size_ = 0; __size_ < sz; ++__size_, ++__data, ++src ) |
||
262 | ::new (__data) value_type (*src); |
||
263 | } |
||
264 | |||
265 | template <class _Tp> |
||
266 | inline _LIBCPP_INLINE_VISIBILITY |
||
267 | dynarray<_Tp>::~dynarray() |
||
268 | { |
||
269 | value_type *__data = data () + __size_; |
||
270 | for ( size_t i = 0; i < __size_; ++i ) |
||
271 | (--__data)->value_type::~value_type(); |
||
272 | __deallocate ( __base_ ); |
||
273 | } |
||
274 | |||
275 | template <class _Tp> |
||
276 | inline _LIBCPP_INLINE_VISIBILITY |
||
277 | typename dynarray<_Tp>::reference |
||
278 | dynarray<_Tp>::at(size_type __n) |
||
279 | { |
||
280 | if (__n >= __size_) |
||
281 | { |
||
282 | #ifndef _LIBCPP_NO_EXCEPTIONS |
||
283 | throw out_of_range("dynarray::at"); |
||
284 | #else |
||
285 | assert(!"dynarray::at out_of_range"); |
||
286 | #endif |
||
287 | } |
||
288 | return data()[__n]; |
||
289 | } |
||
290 | |||
291 | template <class _Tp> |
||
292 | inline _LIBCPP_INLINE_VISIBILITY |
||
293 | typename dynarray<_Tp>::const_reference |
||
294 | dynarray<_Tp>::at(size_type __n) const |
||
295 | { |
||
296 | if (__n >= __size_) |
||
297 | { |
||
298 | #ifndef _LIBCPP_NO_EXCEPTIONS |
||
299 | throw out_of_range("dynarray::at"); |
||
300 | #else |
||
301 | assert(!"dynarray::at out_of_range"); |
||
302 | #endif |
||
303 | } |
||
304 | return data()[__n]; |
||
305 | } |
||
306 | |||
307 | }}} |
||
308 | |||
309 | |||
310 | _LIBCPP_BEGIN_NAMESPACE_STD |
||
311 | template <class _Tp, class _Alloc> |
||
312 | struct _LIBCPP_TYPE_VIS_ONLY uses_allocator<std::experimental::dynarray<_Tp>, _Alloc> : true_type {}; |
||
313 | _LIBCPP_END_NAMESPACE_STD |
||
314 | |||
315 | #endif // if _LIBCPP_STD_VER > 11 |
||
316 | #endif // _LIBCPP_DYNARRAY |