std::scoped_allocator_adaptor (3) - Linux Manuals

std::scoped_allocator_adaptor: std::scoped_allocator_adaptor


std::scoped_allocator_adaptor - std::scoped_allocator_adaptor


Defined in header <scoped_allocator>
template< class OuterAlloc, class... InnerAlloc > (since C++11)
class scoped_allocator_adaptor : public OuterAlloc;

The std::scoped_allocator_adaptor class template is an allocator which can be used with multilevel containers (vector of sets of lists of tuples of maps, etc). It is instantiated with one outer allocator type OuterAlloc and zero or more inner allocator types InnerAlloc.... A container constructed directly with a scoped_allocator_adaptor uses OuterAlloc to allocate its elements, but if an element is itself a container, it uses the first inner allocator. The elements of that container, if they are themselves containers, use the second inner allocator, etc. If there are more levels to the container than there are inner allocators, the last inner allocator is reused for all further nested containers.
The purpose of this adaptor is to correctly initialize stateful allocators in nested containers, such as when all levels of a nested container must be placed in the same shared memory segment. The adaptor's constructor takes the arguments for all allocators in the list, and each nested container obtains its allocator's state from the adaptor as needed.
For the purpose of scoped_allocator_adaptor, if the next inner allocator is A, any class T for which std::uses_allocator<T,A>::value == true participates in the recursion as if it was a container. Additionally, std::pair is treated as such a container by specific overloads of scoped_allocator_adaptor::construct.
Typical implementation holds an instance of a std::scoped_allocator_adaptor<InnerAllocs...> as a member object.

Member types

Type Definition
outer_allocator_type OuterAlloc
inner_allocator_type scoped_allocator_adaptor<InnerAllocs...> or, if sizeof...(InnerAllocs) == 0, scoped_allocator_adaptor<OuterAlloc>
value_type std::allocator_traits<OuterAlloc>::value_type
size_type std::allocator_traits<OuterAlloc>::size_type
difference_type std::allocator_traits<OuterAlloc>::difference_type
pointer std::allocator_traits<OuterAlloc>::pointer
const_pointer std::allocator_traits<OuterAlloc>::const_pointer
void_pointer std::allocator_traits<OuterAlloc>::void_pointer
const_void_pointer std::allocator_traits<OuterAlloc>::const_void_pointer

            std::true_type if std::allocator_traits<A>::propagate_on_container_copy_assignment::value is true for at least one allocator A among OuterAlloc and InnerAlloc...


            std::true_type if std::allocator_traits<A>::propagate_on_container_move_assignment::value is true for at least one allocator A among OuterAlloc and InnerAlloc...


            std::true_type if std::allocator_traits<A>::propagate_on_container_swap::value is true for at least one allocator A among OuterAlloc and InnerAlloc...


            std::true_type if std::allocator_traits<A>::is_always_equal::value is true for every allocator A among OuterAlloc and InnerAlloc...


  template< class T >
  struct rebind {
      typedef scoped_allocator_adaptor<
          std::allocator_traits<OuterAlloc>::template rebind_alloc<T>,
      > other;

Member functions

                                      creates a new scoped_allocator_adaptor instance
constructor (public member function)
                                      destructs a scoped_allocator_adaptor instance
destructor (public member function)
                                      assigns a scoped_allocator_adaptor
operator= (public member function)
                                      obtains an inner_allocator reference
inner_allocator (public member function)
                                      obtains an outer_allocator reference
outer_allocator (public member function)
                                      allocates uninitialized storage using the outer allocator
allocate (public member function)
                                      deallocates storage using the outer allocator
deallocate (public member function)
                                      returns the largest allocation size supported by the outer allocator
max_size (public member function)
                                      constructs an object in allocated storage, passing the inner allocator to its constructor if appropriate
construct (public member function)
                                      destructs an object in allocated storage
destroy (public member function)
                                      copies the state of scoped_allocator_adaptor and all its allocators
select_on_container_copy_construction (public member function)

Non-member functions

           compares two scoped_allocator_adaptor instances
operator== (public member function)

Deduction_guides(since C++17)


// Run this code

  #include <vector>
  #include <scoped_allocator>
  #include <boost/interprocess/managed_shared_memory.hpp>
  #include <boost/interprocess/allocators/adaptive_pool.hpp>
  namespace bi = boost::interprocess;
  template<class T> using alloc = bi::adaptive_pool<T,
  using ipc_row = std::vector<int, alloc<int>>;
  using ipc_matrix = std::vector<ipc_row, std::scoped_allocator_adaptor<alloc<ipc_row>>>;
  int main ()
     bi::managed_shared_memory s(bi::create_only, "Demo", 65536);

     // create vector of vectors in shared memory
     ipc_matrix v(s.get_segment_manager());

     // for all these additions, the inner vectors obtain their allocator arguments
     // from the outer vector's scoped_allocator_adaptor
     v.resize(1); v[0].push_back(1);
     std::vector<int> local_row = {1,2,3};
     v.emplace_back(local_row.begin(), local_row.end());


See also

allocator_traits provides information about allocator types
                 (class template)

uses_allocator checks if the specified type supports uses-allocator construction
                 (class template)
                 the default allocator
allocator (class template)