@@ -129,368 +129,42 @@ class bad_alloc : public exception {
129129 virtual const char *what () const noexcept ;
130130};
131131
132- template <typename T1>
133- struct allocator {
134- using value_type = T1;
135- using size_type = std::size_t ;
136- using difference_type = std::ptrdiff_t ;
137- using propagate_on_container_move_assignment = std::true_type;
138- using is_always_equal = std::true_type;
132+ template <typename T1> struct allocator {
133+ using value_type = T1;
134+ using size_type = std::size_t ;
135+ using difference_type = std::ptrdiff_t ;
139136
140- using pointer = T1*; // deprecated since C++17
141- using const_pointer = const T1*; // deprecated since C++17
142- using reference = T1&; // deprecated since C++17
143- using const_reference = const T1&; // deprecated since C++17
137+ constexpr allocator () noexcept = default;
138+ constexpr allocator (const allocator &) noexcept = default;
144139
145- // deprecated since C++17
146- template <typename T2>
147- struct rebind {
148- using other = allocator<T2>;
149- };
140+ template <typename T2> constexpr allocator (const allocator<T2> &) noexcept ;
150141
151- constexpr allocator () noexcept = default;
152- constexpr allocator (const allocator&) noexcept = default;
142+ ~allocator () = default ;
153143
154- template <typename T2>
155- constexpr allocator (const allocator<T2>&) noexcept ;
156-
157- ~allocator () = default ;
158-
159- allocator& operator =(const allocator&) = default ;
160-
161- T1* allocate (std::size_t );
162- void deallocate (T1*, std::size_t );
163-
164- T1* address (T1&) const noexcept ; // deprecated since C++17
165- const T1* address (const T1&) const noexcept ; // deprecated since C++17
166- std::size_t max_size () const noexcept ; // deprecated since C++17
167-
168- // deprecated since C++17
169- template <typename T2, typename ... T3>
170- void construct (T2*, T3&&...);
171-
172- // deprecated since C++17
173- template <typename T2>
174- void destroy (T2*);
175- };
176-
177- // deprecated since C++17
178- template <>
179- struct allocator <void > {
180- using value_type = void ;
181- using size_type = std::size_t ;
182- using difference_type = std::ptrdiff_t ;
183- using propagate_on_container_move_assignment = std::true_type;
184- using is_always_equal = std::true_type;
185-
186- // deprecated since C++17
187- template <typename T1>
188- struct rebind {
189- using other = allocator<T1>;
190- };
191- };
192-
193- template <typename T1, typename T2>
194- constexpr bool operator ==(const allocator<T1>&, const allocator<T2>&) noexcept ;
195-
196- template <typename T1, typename T2>
197- constexpr bool operator !=(const allocator<T1>&, const allocator<T2>&) noexcept ;
198-
199- namespace detail {
200-
201- template <typename T1, typename = void >
202- struct has_pointer : std::false_type {};
203-
204- template <typename T1>
205- struct has_pointer <T1, std::void_t <typename T1::pointer>> : std::true_type {};
206-
207- template <typename T1, typename = void >
208- struct has_const_pointer : std::false_type {};
209-
210- template <typename T1>
211- struct has_const_pointer <T1, std::void_t <typename T1::const_pointer>> : std::true_type {};
212-
213- template <typename T1, typename = void >
214- struct has_void_pointer : std::false_type {};
215-
216- template <typename T1>
217- struct has_void_pointer <T1, std::void_t <typename T1::void_pointer>> : std::true_type {};
218-
219- template <typename T1, typename = void >
220- struct has_const_void_pointer : std::false_type {};
221-
222- template <typename T1>
223- struct has_const_void_pointer <T1, std::void_t <typename T1::const_void_pointer>> : std::true_type {};
224-
225- template <typename T1, typename = void >
226- struct has_difference_type : std::false_type {};
227-
228- template <typename T1>
229- struct has_difference_type <T1, std::void_t <typename T1::difference_type>> : std::true_type {};
230-
231- template <typename T1, typename = void >
232- struct has_size_type : std::false_type {};
233-
234- template <typename T1>
235- struct has_size_type <T1, std::void_t <typename T1::size_type>> : std::true_type {};
236-
237- template <typename T1, typename = void >
238- struct has_propagate_on_container_copy_assignment : std::false_type {};
239-
240- template <typename T1>
241- struct has_propagate_on_container_copy_assignment <T1,
242- std::void_t <typename T1::propagate_on_container_copy_assignment>> : std::true_type {};
243-
244- template <typename T1, typename = void >
245- struct has_propagate_on_container_move_assignment : std::false_type {};
246-
247- template <typename T1>
248- struct has_propagate_on_container_move_assignment <T1,
249- std::void_t <typename T1::propagate_on_container_move_assignment>> : std::true_type {};
250-
251- template <typename T1, typename = void >
252- struct has_propagate_on_container_swap : std::false_type {};
253-
254- template <typename T1>
255- struct has_propagate_on_container_swap <T1,
256- std::void_t <typename T1::propagate_on_container_swap>> : std::true_type {};
257-
258- template <typename T1, typename = void >
259- struct has_is_always_equal : std::false_type {};
260-
261- template <typename T1>
262- struct has_is_always_equal <T1, std::void_t <typename T1::is_always_equal>> : std::true_type {};
263-
264- template <typename T1, typename T2, typename = void >
265- struct has_rebind_alloc : std::false_type {};
266-
267- template <typename T1, typename T2>
268- struct has_rebind_alloc <T1, T2,
269- std::void_t <typename T1::template rebind<T2>::other>> : std::true_type {};
270-
271- template <typename T1, typename T2, bool = has_rebind_alloc<T1, T2>::value>
272- struct rebind_alloc_helper ;
273-
274- template <typename T1, typename T2>
275- struct rebind_alloc_helper <T1, T2, true > {
276- using type = typename T1::template rebind<T2>::other;
277- };
278-
279- template <template <typename , typename ...> class T1 , typename T2, typename T3, typename ... T4>
280- struct rebind_alloc_helper <T1<T2, T4...>, T3, false > {
281- using type = T1<T3, T4...>;
282- };
283-
284- }
285-
286- template <typename T1>
287- struct allocator_traits {
288- using allocator_type = T1;
289- using value_type = typename T1::value_type;
290-
291- using pointer = typename std::conditional<
292- detail::has_pointer<T1>::value,
293- typename T1::pointer,
294- value_type*
295- >::type;
296-
297- using const_pointer = typename std::conditional<
298- detail::has_const_pointer<T1>::value,
299- typename T1::const_pointer,
300- typename std::pointer_traits<pointer>::template rebind<const value_type>
301- >::type;
302-
303- using void_pointer = typename std::conditional<
304- detail::has_void_pointer<T1>::value,
305- typename T1::void_pointer,
306- typename std::pointer_traits<pointer>::template rebind<void >
307- >::type;
308-
309- using const_void_pointer = typename std::conditional<
310- detail::has_const_void_pointer<T1>::value,
311- typename T1::const_void_pointer,
312- typename std::pointer_traits<pointer>::template rebind<const void >
313- >::type;
314-
315- using difference_type = typename std::conditional<
316- detail::has_difference_type<T1>::value,
317- typename T1::difference_type,
318- typename std::pointer_traits<pointer>::difference_type
319- >::type;
320-
321- using size_type = typename std::conditional<
322- detail::has_size_type<T1>::value,
323- typename T1::size_type,
324- typename std::make_unsigned<difference_type>::type
325- >::type;
326-
327- using propagate_on_container_copy_assignment = typename std::conditional<
328- detail::has_propagate_on_container_copy_assignment<T1>::value,
329- typename T1::propagate_on_container_copy_assignment,
330- std::false_type
331- >::type;
332-
333- using propagate_on_container_move_assignment = typename std::conditional<
334- detail::has_propagate_on_container_move_assignment<T1>::value,
335- typename T1::propagate_on_container_move_assignment,
336- std::false_type
337- >::type;
338-
339- using propagate_on_container_swap = typename std::conditional<
340- detail::has_propagate_on_container_swap<T1>::value,
341- typename T1::propagate_on_container_swap,
342- std::false_type
343- >::type;
344-
345- using is_always_equal = typename std::conditional<
346- detail::has_is_always_equal<T1>::value,
347- typename T1::is_always_equal,
348- typename std::is_empty<T1>::type
349- >::type;
350-
351- template <typename T2>
352- using rebind_alloc = typename detail::rebind_alloc_helper<T1, T2>::type;
353-
354- template <typename T2>
355- using rebind_traits = allocator_traits<rebind_alloc<T2>>;
356-
357- static pointer allocate (T1&, size_type);
358- static pointer allocate (T1&, size_type, const_void_pointer);
359- static void deallocate (T1&, pointer, size_type);
360-
361- template <typename T2, typename ... T3>
362- static void construct (T1&, T2*, T3&&...);
363-
364- template <typename T2>
365- static void destroy (T1&, T2*);
366-
367- static size_type max_size (const T1&) noexcept ;
368- static T1 select_on_container_copy_construction (const T1&);
369- };
370-
371- template <typename T1, typename ... T2>
372- class scoped_allocator_adaptor : public T1 {
373- public:
374- using outer_allocator_type = T1;
375- using inner_allocator_type = typename std::conditional<
376- sizeof ...(T2) == 0 ,
377- scoped_allocator_adaptor<T1>,
378- scoped_allocator_adaptor<T2...>
379- >::type;
380-
381- using value_type = typename allocator_traits<T1>::value_type;
382- using size_type = typename allocator_traits<T1>::size_type;
383- using difference_type = typename allocator_traits<T1>::difference_type;
384- using pointer = typename allocator_traits<T1>::pointer;
385- using const_pointer = typename allocator_traits<T1>::const_pointer;
386- using void_pointer = typename allocator_traits<T1>::void_pointer;
387- using const_void_pointer = typename allocator_traits<T1>::const_void_pointer;
388-
389- using propagate_on_container_copy_assignment = typename std::conditional<
390- allocator_traits<T1>::propagate_on_container_copy_assignment::value ||
391- (allocator_traits<T2>::propagate_on_container_copy_assignment::value || ...),
392- std::true_type,
393- std::false_type
394- >::type;
395-
396- using propagate_on_container_move_assignment = typename std::conditional<
397- allocator_traits<T1>::propagate_on_container_move_assignment::value ||
398- (allocator_traits<T2>::propagate_on_container_move_assignment::value || ...),
399- std::true_type,
400- std::false_type
401- >::type;
402-
403- using propagate_on_container_swap = typename std::conditional<
404- allocator_traits<T1>::propagate_on_container_swap::value ||
405- (allocator_traits<T2>::propagate_on_container_swap::value || ...),
406- std::true_type,
407- std::false_type
408- >::type;
409-
410- using is_always_equal = typename std::conditional<
411- allocator_traits<T1>::is_always_equal::value &&
412- (allocator_traits<T2>::is_always_equal::value && ...),
413- std::true_type,
414- std::false_type
415- >::type;
416-
417- template <typename T3>
418- struct rebind {
419- using other = scoped_allocator_adaptor<
420- typename allocator_traits<T1>::template rebind_alloc<T3>,
421- T2...
422- >;
423- };
424-
425- scoped_allocator_adaptor ();
426-
427- template <typename T3>
428- scoped_allocator_adaptor (T3&&, const T2&...) noexcept ;
429-
430- scoped_allocator_adaptor (const scoped_allocator_adaptor&) noexcept ;
431- scoped_allocator_adaptor (scoped_allocator_adaptor&&) noexcept ;
432-
433- template <typename T3, typename ... T4>
434- scoped_allocator_adaptor (const scoped_allocator_adaptor<T3, T4...>&) noexcept ;
435-
436- template <typename T3, typename ... T4>
437- scoped_allocator_adaptor (scoped_allocator_adaptor<T3, T4...>&&) noexcept ;
438-
439- scoped_allocator_adaptor& operator =(const scoped_allocator_adaptor&) = default ;
440- scoped_allocator_adaptor& operator =(scoped_allocator_adaptor&&) = default ;
441-
442- ~scoped_allocator_adaptor () = default ;
443-
444- inner_allocator_type& inner_allocator () noexcept ;
445- const inner_allocator_type& inner_allocator () const noexcept ;
446-
447- outer_allocator_type& outer_allocator () noexcept ;
448- const outer_allocator_type& outer_allocator () const noexcept ;
449-
450- pointer allocate (size_type);
451- pointer allocate (size_type, const_void_pointer);
452- void deallocate (pointer, size_type);
453-
454- size_type max_size () const ;
455-
456- template <typename T3, typename ... T4>
457- void construct (T3*, T4&&...);
458-
459- template <typename T3, typename T4, typename ... T5, typename ... T6>
460- void construct (std::pair<T3, T4>*,
461- std::piecewise_construct_t ,
462- std::tuple<T5...>,
463- std::tuple<T6...>);
464-
465- template <typename T3, typename T4>
466- void construct (std::pair<T3, T4>*);
467-
468- template <typename T3, typename T4, typename T5, typename T6>
469- void construct (std::pair<T3, T4>*, T5&&, T6&&);
470-
471- template <typename T3, typename T4, typename T5, typename T6>
472- void construct (std::pair<T3, T4>*, const std::pair<T5, T6>&);
473-
474- template <typename T3, typename T4, typename T5, typename T6>
475- void construct (std::pair<T3, T4>*, std::pair<T5, T6>&&);
476-
477- template <typename T3>
478- void destroy (T3*);
479-
480- scoped_allocator_adaptor select_on_container_copy_construction () const ;
481-
482- private:
483- inner_allocator_type inner_;
484- };
485-
486- template <typename T1, typename ... T2, typename T3, typename ... T4>
487- bool operator ==(const scoped_allocator_adaptor<T1, T2...>&,
488- const scoped_allocator_adaptor<T3, T4...>&) noexcept ;
144+ T1 *allocate (std::size_t );
145+ void deallocate (T1 *, std::size_t );
146+ };
489147
490- template <typename T1, typename ... T2, typename T3, typename ... T4>
491- bool operator !=( const scoped_allocator_adaptor<T1, T2...>&,
492- const scoped_allocator_adaptor<T3, T4...>&) noexcept ;
148+ template <> struct allocator < void > {
149+ using value_type = void ;
150+ } ;
493151
152+ template <typename T1> struct allocator_traits {
153+ using allocator_type = T1;
154+ using value_type = typename T1::value_type;
155+ using pointer = value_type *;
156+ using const_pointer = const value_type *;
157+ using void_pointer = void *;
158+ using const_void_pointer = const void *;
159+ using size_type = typename T1::size_type;
160+ using difference_type = typename T1::difference_type;
161+
162+ template <typename T2> using rebind_alloc = allocator<T2>;
163+
164+ static pointer allocate (T1 &, size_type);
165+ static pointer allocate (T1 &, size_type, const_void_pointer);
166+ static void deallocate (T1 &, pointer, size_type);
167+ };
494168} // namespace std
495169
496170#endif // _GHLIBCPP_MEMORY
0 commit comments