Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::scoped...ator_adaptor(3) C++ Standard Libarystd::scoped...ator_adaptor(3)

NAME
       std::scoped_allocator_adaptor - std::scoped_allocator_adaptor

Synopsis
	  Defined in header <scoped_allocator>
	  template< class OuterAlloc, class... InnerAllocs >

	  class	scoped_allocator_adaptor		      (since C++11)

	      :	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 ele-
       ments 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 allo-
       cators, the last
	  inner	allocator is reused for	all further nested containers.

	  The  purpose of this adaptor is to correctly initialize stateful al-
       locators	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 allo-
       cator's state from
	  the adaptor as needed.

	  For the purpose of scoped_allocator_adaptor, if the next inner allo-
       cator is	A, any
	  class	T for which std::uses_allocator<T,A>::value ==	true  partici-
       pates 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::con-
       struct.

	  Typical implementation holds an instance of a
	  std::scoped_allocator_adaptor<InnerAllocs...>	as a member object.

	  Note	that std::pmr::polymorphic allocators propagate	to nested con-
       tainers following
	  uses-allocator construction and do not need (and do not work with)
	  std::scoped_allocator_adaptor.

Member types
	  Type			     Definition
	  outer_allocator_type	     OuterAlloc
				     scoped_allocator_adaptor<InnerAllocs...>
       or, if
	  inner_allocator_type	     sizeof...(InnerAllocs) == 0,
				     scoped_allocator_adaptor<OuterAlloc>
	  value_type				std::allocator_traits<OuterAl-
       loc>::value_type
	  size_type				std::allocator_traits<OuterAl-
       loc>::size_type
	  difference_type	       std::allocator_traits<OuterAlloc>::dif-
       ference_type
	  pointer				std::allocator_traits<OuterAl-
       loc>::pointer
	  const_pointer				std::allocator_traits<OuterAl-
       loc>::const_pointer
	  void_pointer				std::allocator_traits<OuterAl-
       loc>::void_pointer
	  const_void_pointer			std::allocator_traits<OuterAl-
       loc>::const_void_pointer
	  propagate_on_container_copy_assignment

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

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

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

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

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

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

Non-member functions
	  operator==	     compares two scoped_allocator_adaptor instances
	  operator!=	     (function template)
	  (removed in C++20)

	  Deduction guides(since C++17)

Example
       // Run this code

	#include <boost/interprocess/allocators/adaptive_pool.hpp>
	#include <boost/interprocess/managed_shared_memory.hpp>
	#include <scoped_allocator>
	#include <vector>

	namespace bi = boost::interprocess;

	template<class T> using	alloc =	bi::adaptive_pool<T,
					    bi::managed_shared_memory::seg-
       ment_manager>;
	using ipc_row =	std::vector<int, alloc<int>>;
	using ipc_matrix  =  std::vector<ipc_row,  std::scoped_allocator_adap-
       tor<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 alloca-
       tor arguments
	    // from the	outer vector's scoped_allocator_adaptor
	    v.resize(1);
	    v[0].push_back(1);
	    v.emplace_back(2);
	    std::vector<int> local_row = {1, 2,	3};
	    v.emplace_back(local_row.begin(), local_row.end());

	    bi::shared_memory_object::remove("Demo");
	}

	  Defect reports

	  The following	behavior-changing defect reports were applied retroac-
       tively to
	  previously published C++ standards.

	     DR	      Applied	 to		   Behavior    as    published
       Correct behavior
	  LWG	2108   C++11	    there   was	  no   way    to    show    if
       is_always_equal
			      scoped_allocator_adaptor	     is	     stateless
       provided

See also
	  allocator_traits provides information	about allocator	types
	  (C++11)	   (class template)
	  uses_allocator   checks if the specified type	supports  uses-alloca-
       tor construction
	  (C++11)	   (class template)
	  allocator	   the default allocator
			   (class template)

http://cppreference.com		  2024.06.10	 std::scoped...ator_adaptor(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::scoped_allocator_adaptor&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help