147 lines
4.5 KiB
Markdown
147 lines
4.5 KiB
Markdown
[allocator.adaptor.members]
|
||
|
||
# 20 Memory management library [[mem]](./#mem)
|
||
|
||
## 20.6 Class template scoped_allocator_adaptor [[allocator.adaptor]](allocator.adaptor#members)
|
||
|
||
### 20.6.4 Members [allocator.adaptor.members]
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L8873)
|
||
|
||
In the construct member functions,*OUTERMOST*(x) is*OUTERMOST*(x.outer_allocator()) if
|
||
the expression x.outer_allocator() is
|
||
valid ([[temp.deduct]](temp.deduct "13.10.3 Template argument deduction")) andx otherwise;*OUTERMOST_ALLOC_TRAITS*(x) isallocator_traits<remove_reference_t<decltype(*OUTERMOST*(x))>>[.](#1.sentence-1)
|
||
|
||
[*Note [1](#note-1)*:
|
||
|
||
*OUTERMOST*(x) and*OUTERMOST_ALLOC_TRAITS*(x) are recursive operations[.](#1.sentence-2)
|
||
|
||
It
|
||
is incumbent upon the definition of outer_allocator() to ensure that the
|
||
recursion terminates[.](#1.sentence-3)
|
||
|
||
It will terminate for all instantiations ofscoped_allocator_adaptor[.](#1.sentence-4)
|
||
|
||
â *end note*]
|
||
|
||
[ð](#lib:inner_allocator,scoped_allocator_adaptor)
|
||
|
||
`inner_allocator_type& inner_allocator() noexcept;
|
||
const inner_allocator_type& inner_allocator() const noexcept;
|
||
`
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L8897)
|
||
|
||
*Returns*: *this if sizeof...(InnerAllocs) is zero; otherwise,inner[.](#2.sentence-1)
|
||
|
||
[ð](#lib:outer_allocator,scoped_allocator_adaptor)
|
||
|
||
`outer_allocator_type& outer_allocator() noexcept;
|
||
`
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L8909)
|
||
|
||
*Returns*: static_cast<OuterAlloc&>(*this)[.](#3.sentence-1)
|
||
|
||
[ð](#lib:outer_allocator,scoped_allocator_adaptor_)
|
||
|
||
`const outer_allocator_type& outer_allocator() const noexcept;
|
||
`
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L8920)
|
||
|
||
*Returns*: static_cast<const OuterAlloc&>(*this)[.](#4.sentence-1)
|
||
|
||
[ð](#lib:allocate,scoped_allocator_adaptor)
|
||
|
||
`pointer allocate(size_type n);
|
||
`
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L8931)
|
||
|
||
*Returns*: allocator_traits<OuterAlloc>::allocate(outer_allocator(), n)[.](#5.sentence-1)
|
||
|
||
[ð](#lib:allocate,scoped_allocator_adaptor_)
|
||
|
||
`pointer allocate(size_type n, const_void_pointer hint);
|
||
`
|
||
|
||
[6](#6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L8942)
|
||
|
||
*Returns*: allocator_traits<OuterAlloc>::allocate(outer_allocator(), n, hint)[.](#6.sentence-1)
|
||
|
||
[ð](#lib:deallocate,scoped_allocator_adaptor)
|
||
|
||
`void deallocate(pointer p, size_type n) noexcept;
|
||
`
|
||
|
||
[7](#7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L8953)
|
||
|
||
*Effects*: As if by:allocator_traits<OuterAlloc>::deallocate(outer_allocator(), p, n);
|
||
|
||
[ð](#lib:max_size,scoped_allocator_adaptor)
|
||
|
||
`size_type max_size() const;
|
||
`
|
||
|
||
[8](#8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L8965)
|
||
|
||
*Returns*: allocator_traits<OuterAlloc>::max_size(outer_allocator())[.](#8.sentence-1)
|
||
|
||
[ð](#lib:construct,scoped_allocator_adaptor)
|
||
|
||
`template<class T, class... Args>
|
||
void construct(T* p, Args&&... args);
|
||
`
|
||
|
||
[9](#9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L8977)
|
||
|
||
*Effects*: Equivalent to:apply([p, this](auto&&... newargs) {*OUTERMOST_ALLOC_TRAITS*(*this)::construct(*OUTERMOST*(*this), p,
|
||
std::forward<decltype(newargs)>(newargs)...); },
|
||
uses_allocator_construction_args<T>(inner_allocator(),
|
||
std::forward<Args>(args)...));
|
||
|
||
[ð](#lib:destroy,scoped_allocator_adaptor)
|
||
|
||
`template<class T>
|
||
void destroy(T* p);
|
||
`
|
||
|
||
[10](#10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L8998)
|
||
|
||
*Effects*: Calls *OUTERMOST_ALLOC_TRAITS*(*this)::destroy(*OUTERMOST*(*this), p)[.](#10.sentence-1)
|
||
|
||
[ð](#lib:select_on_container_copy_construction,scoped_allocator_adaptor)
|
||
|
||
`scoped_allocator_adaptor select_on_container_copy_construction() const;
|
||
`
|
||
|
||
[11](#11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L9009)
|
||
|
||
*Returns*: A new scoped_allocator_adaptor object
|
||
where each allocator a1 within the adaptor
|
||
is initialized withallocator_traits<A1>::select_on_container_copy_construction(a2),
|
||
where A1 is the type of a1 anda2 is the corresponding allocator in *this[.](#11.sentence-1)
|