__GNU_CXX::__ALLOC_TRAITS(3cxx)

πŸ’– __gnu_cxx::__alloc_traits< _Alloc, typename > πŸ’–

okay bestie, this is the 3cxx manual page for __gnu_cxx::__alloc_traits< _Alloc, typename >, and it is literally serving Uniform interface to C++98 and C++11 allocators. That’s the whole vibe. 🫢


🌸 NAME 🌸

__gnu_cxx::__alloc_traits< _Alloc, typename > β€” Uniform interface to C++98 and C++11 allocators.


✨ SYNOPSIS ✨

#include <alloc_traits.h>

Inherits std::allocator_traits< _Alloc >.

πŸŽ€ Public Types πŸŽ€

  • typedef std::allocator_traits< _Alloc > _Base_type β€” the base-type bestie.
  • typedef _Alloc allocator_type β€” the allocator type itself.
  • typedef _Base_type::const_pointer const_pointer β€” const pointer type from the base.
  • typedef const value_type & const_reference β€” const reference to a value.
  • using const_void_pointer = typename _Ptr< __cv_pointer, const void >::type β€” the allocator's const void pointer type. 🫢
  • typedef _Base_type::difference_type difference_type β€” difference type from the base.
  • using is_always_equal = typename __detected_or_t< is_empty< _Alloc >, __equal, _Alloc >::type β€” whether all instances of the allocator type compare equal.
  • typedef _Base_type::pointer pointer β€” pointer type from the base.
  • using propagate_on_container_copy_assignment = __detected_or_t< false_type, __pocca, _Alloc > β€” how the allocator is propagated on copy assignment.
  • using propagate_on_container_move_assignment = __detected_or_t< false_type, __pocma, _Alloc > β€” how the allocator is propagated on move assignment.
  • using propagate_on_container_swap = __detected_or_t< false_type, __pocs, _Alloc > β€” how the allocator is propagated on swap.
  • template<typename _Tp > using rebind_alloc = __alloc_rebind< _Alloc, _Tp > β€” rebind the allocator for another _Tp.
  • template<typename _Tp > using rebind_traits = allocator_traits< rebind_alloc< _Tp > > β€” rebind traits for another _Tp.
  • typedef value_type & reference β€” reference to a value.
  • typedef _Base_type::size_type size_type β€” size type from the base.
  • typedef _Base_type::value_type value_type β€” value type from the base.
  • using void_pointer = typename _Ptr< __v_pointer, void >::type β€” the allocator's void pointer type. 🌈

🧚 Static Public Member Functions 🧚

  • static constexpr bool _S_always_equal ()
  • static constexpr bool _S_nothrow_move ()
  • static constexpr void _S_on_swap (_Alloc &__a, _Alloc &__b)
  • static constexpr bool _S_propagate_on_copy_assign ()
  • static constexpr bool _S_propagate_on_move_assign ()
  • static constexpr bool _S_propagate_on_swap ()
  • static constexpr _Alloc _S_select_on_copy (const _Alloc &__a)
  • static constexpr pointer allocate (_Alloc &__a, size_type __n) β€” Allocate memory.
  • static constexpr pointer allocate (_Alloc &__a, size_type __n) β€” Allocate memory. yes, it’s listed again, bestie. πŸ’…
  • static constexpr pointer allocate (_Alloc &__a, size_type __n, const_void_pointer __hint) β€” Allocate memory.
  • static constexpr pointer allocate (_Alloc &__a, size_type __n, const_void_pointer __hint) β€” Allocate memory. also listed again. periodt.
  • template<typename _Ptr , typename... _Args> static constexpr std::__enable_if_t< __is_custom_pointer< _Ptr >::value > construct (_Alloc &__a, _Ptr __p, _Args &&... __args) noexcept(noexcept(_Base_type::construct(__a, std::__to_address(__p), std::forward< _Args >(__args)...)))
  • template<typename _Tp , typename... _Args> static constexpr auto construct (_Alloc &__a, _Tp *__p, _Args &&... __args) noexcept(noexcept(_S_construct(__a, __p, std::forward< _Args >(__args)...))) -> decltype(_S_construct(__a, __p, std::forward< _Args >(__args)...)) β€” Construct an object of type _Tp.
  • static constexpr void deallocate (_Alloc &__a, pointer __p, size_type __n) β€” Deallocate memory.
  • static constexpr void deallocate (_Alloc &__a, pointer __p, size_type __n) β€” Deallocate memory. another duplicate drop. 🫠
  • template<typename _Ptr > static constexpr std::__enable_if_t< __is_custom_pointer< _Ptr >::value > destroy (_Alloc &__a, _Ptr __p) noexcept(noexcept(_Base_type::destroy(__a, std::__to_address(__p))))
  • template<typename _Tp > static constexpr void destroy (_Alloc &__a, _Tp *__p) noexcept(noexcept(_S_destroy(__a, __p, 0))) β€” Destroy an object of type _Tp.
  • static constexpr size_type max_size (const _Alloc &__a) noexcept β€” The maximum supported allocation size.
  • static constexpr _Alloc select_on_container_copy_construction (const _Alloc &__rhs) β€” Obtain an allocator to use when copying a container.

πŸ’« Detailed Description πŸ’«

The page frames this struct like this:

template<typename _Alloc, typename = typename _Alloc::value_type>
    struct __gnu_cxx::__alloc_traits< _Alloc, typename >

and the description is literally Uniform interface to C++98 and C++11 allocators. That’s the entire icon behavior. no cap. πŸ’…


πŸ¦‹ Member Typedef Documentation πŸ¦‹

πŸ’– const_void_pointer β€” inherited

template<typename _Alloc > using std::allocator_traits< _Alloc >::const_void_pointer =  typename _Ptr<__cv_pointer, const void>::type [inherited]

The allocator's const void pointer type. It’s Alloc::const_void_pointer if that type exists, otherwise pointer_traits<pointer>::rebind<const void>. 🫢

πŸ’– is_always_equal β€” inherited

template<typename _Alloc > using std::allocator_traits< _Alloc >::is_always_equal =  typename __detected_or_t<is_empty<_Alloc>, __equal, _Alloc>::type [inherited]

Whether all instances of the allocator type compare equal. It’s Alloc::is_always_equal if that type exists, otherwise is_empty<Alloc>::type. ✨

πŸ’– propagate_on_container_copy_assignment β€” inherited

template<typename _Alloc > using std::allocator_traits< _Alloc >::propagate_on_container_copy_assignment =  __detected_or_t<false_type, __pocca, _Alloc> [inherited]

How the allocator is propagated on copy assignment. It’s Alloc::propagate_on_container_copy_assignment if that type exists, otherwise false_type. πŸŽ€

πŸ’– propagate_on_container_move_assignment β€” inherited

template<typename _Alloc > using std::allocator_traits< _Alloc >::propagate_on_container_move_assignment =  __detected_or_t<false_type, __pocma, _Alloc> [inherited]

How the allocator is propagated on move assignment. It’s Alloc::propagate_on_container_move_assignment if that type exists, otherwise false_type. πŸ¦‹

πŸ’– propagate_on_container_swap β€” inherited

template<typename _Alloc > using std::allocator_traits< _Alloc >::propagate_on_container_swap =  __detected_or_t<false_type, __pocs, _Alloc> [inherited]

How the allocator is propagated on swap. It’s Alloc::propagate_on_container_swap if that type exists, otherwise false_type. 🌸

πŸ’– void_pointer β€” inherited

template<typename _Alloc > using std::allocator_traits< _Alloc >::void_pointer =  typename _Ptr<__v_pointer, void>::type [inherited]

The allocator's void pointer type. It’s Alloc::void_pointer if that type exists, otherwise pointer_traits<pointer>::rebind<void>. 🌈


πŸ”₯ Member Function Documentation πŸ”₯

πŸ“ allocate β€” two-argument version, inherited

template<typename _Alloc > static constexpr pointer std::allocator_traits< _Alloc >::allocate (_Alloc & __a, size_type __n) [inline],  [static],  [constexpr],  [inherited]

Allocate memory. πŸ’–

Parameters

  • __a β€” An allocator.
  • __n β€” The number of objects to allocate space for.

Calls a.allocate(n).

πŸ“ allocate β€” two-argument version, non-inherited

template<typename _Alloc , typename  = typename _Alloc::value_type> static constexpr pointer std::allocator_traits< _Alloc >::allocate (_Alloc & __a, size_type __n) [inline],  [static],  [constexpr]

Allocate memory. πŸ’–

Parameters

  • __a β€” An allocator.
  • __n β€” The number of objects to allocate space for.

Calls a.allocate(n).

πŸ“ allocate β€” three-argument version, inherited

template<typename _Alloc > static constexpr pointer std::allocator_traits< _Alloc >::allocate (_Alloc & __a, size_type __n, const_void_pointer __hint) [inline],  [static],  [constexpr],  [inherited]

Allocate memory. πŸ’–

Parameters

  • __a β€” An allocator.
  • __n β€” The number of objects to allocate space for.
  • __hint β€” Aid to locality.

Returns

Memory of suitable size and alignment for n objects of type value_type.

Returns a.allocate(n, hint) if that expression is well-formed, otherwise returns a.allocate(n).

πŸ“ allocate β€” three-argument version, non-inherited

template<typename _Alloc , typename  = typename _Alloc::value_type> static constexpr pointer std::allocator_traits< _Alloc >::allocate (_Alloc & __a, size_type __n, const_void_pointer __hint) [inline],  [static],  [constexpr]

Allocate memory. πŸ’–

Parameters

  • __a β€” An allocator.
  • __n β€” The number of objects to allocate space for.
  • __hint β€” Aid to locality.

Returns

Memory of suitable size and alignment for n objects of type value_type.

Returns a.allocate(n, hint) if that expression is well-formed, otherwise returns a.allocate(n).

🧚 construct β€” the _Tp version

template<typename _Alloc , typename  = typename _Alloc::value_type>
    template<typename _Tp , typename... _Args> static constexpr auto
    std::allocator_traits< _Alloc >::construct (_Alloc & __a, _Tp * __p,
    _Args &&... __args) -> decltype(_S_construct(__a, __p,
    std::forward<_Args>(__args)...))
          [inline],  [static],  [constexpr],  [noexcept]

Construct an object of type _Tp. 🫢

Parameters

  • __a β€” An allocator.
  • __p β€” Pointer to memory of suitable size and alignment for Tp
  • __args β€” Constructor arguments.

Calls __a.construct(__p, std::forward<Args>(__args)...) if that expression is well-formed, otherwise uses placement-new to construct an object of type _Tp at location __p from the arguments __args....

πŸ’€ deallocate β€” inherited

template<typename _Alloc > static constexpr void std::allocator_traits< _Alloc >::deallocate (_Alloc & __a, pointer __p, size_type __n) [inline],  [static],  [constexpr],  [inherited]

Deallocate memory. πŸ’…

Parameters

  • __a β€” An allocator.
  • __p β€” Pointer to the memory to deallocate.
  • __n β€” The number of objects space was allocated for.

Calls a.deallocate(p, n).

πŸ’€ deallocate β€” non-inherited

template<typename _Alloc , typename  = typename _Alloc::value_type> static constexpr void std::allocator_traits< _Alloc >::deallocate (_Alloc & __a, pointer __p, size_type __n) [inline],  [static],  [constexpr]

Deallocate memory. πŸ’…

Parameters

  • __a β€” An allocator.
  • __p β€” Pointer to the memory to deallocate.
  • __n β€” The number of objects space was allocated for.

Calls a.deallocate(p, n).

πŸŽ€ destroy β€” the _Tp version

template<typename _Alloc , typename  = typename _Alloc::value_type>
    template<typename _Tp > static constexpr void std::allocator_traits< _Alloc >::destroy (_Alloc & __a, _Tp * __p) [inline],  [static],  [constexpr],  [noexcept]

Destroy an object of type _Tp. πŸ’–

Parameters

  • __a β€” An allocator.
  • __p β€” Pointer to the object to destroy

Calls __a.destroy(__p) if that expression is well-formed, otherwise calls __p->~_Tp().

πŸ‘‘ max_size

template<typename _Alloc , typename  = typename _Alloc::value_type> static constexpr size_type std::allocator_traits< _Alloc >::max_size (const _Alloc & __a) [inline],  [static],  [constexpr],  [noexcept]

The maximum supported allocation size. πŸ‘‘

Parameters

  • __a β€” An allocator.

Returns

__a.max_size() or numeric_limits<size_type>::max().

Returns __a.max_size() if that expression is well-formed, otherwise returns numeric_limits<size_type>::max().

Referenced by std::forward_list< _Tp, _Alloc >::max_size(), and std::list< _Tp, _Alloc >::max_size().

🌟 select_on_container_copy_construction

template<typename _Alloc > static constexpr _Alloc std::allocator_traits< _Alloc >::select_on_container_copy_construction (const _Alloc & __rhs) [inline],  [static],  [constexpr],  [inherited]

Obtain an allocator to use when copying a container. 🌟

Parameters

  • __rhs β€” An allocator.

Returns

__rhs.select_on_container_copy_construction() or __rhs.

Returns __rhs.select_on_container_copy_construction() if that expression is well-formed, otherwise returns __rhs.

🌸 AUTHOR 🌸

Bestie, real talk: nobody sat down and lovingly hand-wrote this page. πŸ’… It says it right there β€” it was generated automatically by Doxygen for libstdc++ from the source code. So the "author" is literally the doc tool doing its little robot thing. No cap, the source code is the main character here, and Doxygen just showed up to take notes. 🫢

So if you spot something in here that reads a little stiff, that's why β€” it's machine-generated from the actual headers, which honestly is kind of iconic of it. πŸ”₯ The facts are all straight from the source; only the vibe got the glow-up. ✨


That's a wrap on this one, bestie! πŸŽ€ The footer on this page β€” the little running line at the very bottom, with the source/version on it and the date β€” is literally just:

libstd__gnu_cxx::__a...loc, typename >(3cxx)

(yes, Doxygen really said "let me truncate that for you" 😭 it's giving abbreviate-and-move-on) and it's stamped with this edition's date, generated by Doxygen for libstdc++ straight from the source code. Go read some headers, stay hydrated, and slay your template diagnostics. πŸŒˆπŸ’œ

πŸ“¦ where this page comes from