8#ifndef INCLUDED_BSLMA_ALLOCATORTRAITS
9#define INCLUDED_BSLMA_ALLOCATORTRAITS
491#include <bslscm_version.h>
505#if BSLS_COMPILERFEATURES_CPLUSPLUS >= 201703L
509#if BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
515# define COMPILING_BSLMA_ALLOCATORTRAITS_H
517# undef COMPILING_BSLMA_ALLOCATORTRAITS_H
539template <
class ALLOC>
544 typedef struct {
char d_a; } yes_type;
545 typedef struct {
char d_a[2]; } no_type;
552 static yes_type match(
typename U::is_always_equal *);
554 static no_type match(...);
558 static const bool value =
sizeof(match<ALLOC>(0)) ==
sizeof(yes_type);
572template <class ALLOC, bool = AllocatorTraits_HasIsAlwaysEqual<ALLOC>::value>
581template <
class ALLOC>
600template <
class ALLOCATOR_TYPE>
604 typedef struct {
char a; } yes_type;
605 typedef struct {
char a[2]; } no_type;
611 template <
class T, T>
struct MatchType { };
614 struct MethodAlias {
typedef T (T::*Method)()
const; };
620 template <
class TYPE>
621 static yes_type match(MatchType<
typename MethodAlias<TYPE>::Method,
622 &TYPE::select_on_container_copy_construction> *);
623 template <
class TYPE>
624 static no_type match(...);
628 sizeof(match<ALLOCATOR_TYPE>(0)) ==
sizeof(yes_type);
644template <
class ALLOCATOR_TYPE>
648 typedef struct {
char a; } yes_type;
649 typedef struct {
char a[2]; } no_type;
656 yes_type match(
typename U::propagate_on_container_copy_assignment *);
658 static no_type match(...);
662 sizeof(match<ALLOCATOR_TYPE>(0)) ==
sizeof(yes_type);
675template <
class ALLOCATOR_TYPE,
686template <
class ALLOC>
688 :
public ALLOC::propagate_on_container_copy_assignment
704template <
class ALLOC>
708 typedef struct {
char a; } yes_type;
709 typedef struct {
char a[2]; } no_type;
716 yes_type match(
typename U::propagate_on_container_move_assignment *);
718 static no_type match(...);
721 static const bool value =
sizeof(match<ALLOC>(0)) ==
sizeof(yes_type);
734template <
class ALLOC,
745template <
class ALLOC>
747 :
public ALLOC::propagate_on_container_move_assignment
762template <
class ALLOC>
766 typedef struct {
char a; } yes_type;
767 typedef struct {
char a[2]; } no_type;
774 yes_type match(
typename U::propagate_on_container_swap *);
776 static no_type match(...);
779 static const bool value =
sizeof(match<ALLOC>(0)) ==
sizeof(yes_type);
791template <class ALLOC, bool = AllocatorTraits_HasPropOnSwap<ALLOC>::value>
801template <
class ALLOC>
803 :
public ALLOC::propagate_on_container_swap
807#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE) && \
808 defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES) && \
809 defined(BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES)
815template <
class T,
class Return,
class... Args>
816struct AllocatorTraits_HasConstructMethod {
819 static auto match(U *) ->
821 bslmf::Util::declval<Args>()...)),
827 typedef decltype(match<T>(0)) type;
828 static const bool value = type::value;
835template <
class T,
class Return,
class... Args>
836struct AllocatorTraits_HasDestroyMethod {
839 static auto match(U *) ->
841 bslmf::Util::declval<Args>()...)),
847 typedef decltype(match<T>(0)) type;
848 static const bool value = type::value;
857template <
class T,
class =
void>
859 typedef typename T::value_type *
type;
865 typedef typename T::pointer
type;
872template <
class T,
class =
void>
875 typedef const typename T::value_type *
type;
883 typedef typename T::const_pointer
type;
891template <
class T,
class =
void>
902 typedef typename T::void_pointer
type;
909template <
class T,
class =
void>
920 typedef typename T::const_void_pointer
type;
927template <
class T,
class =
void>
935 typedef typename T::size_type
type;
945template <
class T,
class =
void>
956 typedef typename T::difference_type
type;
963#if defined(BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES)
968template <
class T,
class U>
972template <
template <
class,
class...>
class ALLOC,
976struct AllocatorTraits_RebindFront<ALLOC<T, ARGS...>, U> {
977 using type = ALLOC<U, ARGS...>;
980template <
class T,
class U>
986template <
template <
class>
class ALLOC,
1001template <
class T,
class U,
class =
void>
1006template <
class T,
class U>
1011 typedef typename T::template rebind<U>::other
type;
1018#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1019template <
class T,
class =
void>
1020struct AllocatorTraits_CallMaxSize {
1030 static SizeType max_size(
const T &)
1032 return std::numeric_limits<SizeType>::max() /
1033 sizeof(
typename T::value_type);
1041struct AllocatorTraits_CallMaxSize<
1046 typedef typename AllocatorTraits_SizeType<T>::type SizeType;
1053 static SizeType max_size(
const T &alloc)
1055 return alloc.max_size();
1088template <
class ALLOCATOR_TYPE>
1093 typedef typename BloombergLP::bslma::AllocatorTraits_HasSelectOnCopyMethod<
1094 ALLOCATOR_TYPE>::type DelegateSelectMethod;
1100 ALLOCATOR_TYPE selectOnCopyConstruct(
const ALLOCATOR_TYPE& stdAllocator,
1108 ALLOCATOR_TYPE selectOnCopyConstruct(
const ALLOCATOR_TYPE& stdAllocator,
1111#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE) && \
1112 defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES) && \
1113 defined(BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES)
1124 template <
class ELEMENT_TYPE,
class... Args>
1126 BloombergLP::bslma::AllocatorTraits_HasConstructMethod<ALLOCATOR_TYPE,
1131 privateConstruct(ALLOCATOR_TYPE& basicAllocator,
1132 ELEMENT_TYPE *elementAddr,
1133 Args&&... arguments);
1134 template <
class ELEMENT_TYPE,
class... Args>
1136 !BloombergLP::bslma::AllocatorTraits_HasConstructMethod<
1142 privateConstruct(ALLOCATOR_TYPE& basicAllocator,
1143 ELEMENT_TYPE *elementAddr,
1144 Args&&... arguments);
1146 template <
class ELEMENT_TYPE>
1148 BloombergLP::bslma::AllocatorTraits_HasDestroyMethod<
1151 ELEMENT_TYPE *>::value,
1153 privateDestroy(ALLOCATOR_TYPE& basicAllocator, ELEMENT_TYPE *elementAddr);
1163 template <
class ELEMENT_TYPE>
1165 !BloombergLP::bslma::AllocatorTraits_HasDestroyMethod<
1168 ELEMENT_TYPE *>::value,
1170 privateDestroy(ALLOCATOR_TYPE& basicAllocator, ELEMENT_TYPE *elementAddr);
1179 BloombergLP::bslma::AllocatorTraits_PointerType<ALLOCATOR_TYPE>::type
1182 BloombergLP::bslma::AllocatorTraits_ConstPointerType<ALLOCATOR_TYPE>::type
1185 BloombergLP::bslma::AllocatorTraits_VoidPointerType<ALLOCATOR_TYPE>::type
1187 typedef typename BloombergLP::bslma::
1188 AllocatorTraits_ConstVoidPointerType<ALLOCATOR_TYPE>::type
1192 BloombergLP::bslma::AllocatorTraits_DifferenceType<ALLOCATOR_TYPE>::type
1195 BloombergLP::bslma::AllocatorTraits_SizeType<ALLOCATOR_TYPE>::type
1198#ifdef BSLS_COMPILERFEATURES_SUPPORT_ALIAS_TEMPLATES
1199 template <
class ELEMENT_TYPE>
1201 BloombergLP::bslma::AllocatorTraits_RebindAlloc<ALLOCATOR_TYPE,
1202 ELEMENT_TYPE>::type;
1204 template <
class ELEMENT_TYPE>
1207 template <
class ELEMENT_TYPE>
1209 : BloombergLP::bslma::AllocatorTraits_RebindAlloc<ALLOCATOR_TYPE,
1219 typedef typename BloombergLP::bslma::
1220 AllocatorTraits_RebindAlloc<ALLOCATOR_TYPE, ELEMENT_TYPE>::type
1223 template <
typename ARG>
1234 template <
class ELEMENT_TYPE>
1236 rebind_alloc<ELEMENT_TYPE>::allocator_type>
1263#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
1275 template <
class ELEMENT_TYPE,
class... Args>
1277 ELEMENT_TYPE *elementAddr,
1278 Args&&... arguments);
1289 template <
class ELEMENT_TYPE>
1290 static void destroy(ALLOCATOR_TYPE& basicAllocator,
1291 ELEMENT_TYPE *elementAddr);
1314 static ALLOCATOR_TYPE
1322 typedef typename BloombergLP::bslma::AllocatorTraits_IsAlwaysEqual<
1331 typedef typename BloombergLP::bslma::AllocatorTraits_PropOnCopyAssign<
1340 typedef typename BloombergLP::bslma::AllocatorTraits_PropOnMoveAssign<
1349 typedef typename BloombergLP::bslma::AllocatorTraits_PropOnSwap<
1365template <
class ALLOCATOR_TYPE>
1369#if BSLS_COMPILERFEATURES_CPLUSPLUS >= 201703L
1384template <
class ALLOCATOR_TYPE>
1386: std::allocator_traits<std::allocator<ALLOCATOR_TYPE> > {
1403template <
class ALLOCATOR_TYPE>
1405ALLOCATOR_TYPE allocator_traits<ALLOCATOR_TYPE>::selectOnCopyConstruct(
1406 const ALLOCATOR_TYPE& stdAllocator,
1409 return stdAllocator.select_on_container_copy_construction();
1412template <
class ALLOCATOR_TYPE>
1414ALLOCATOR_TYPE allocator_traits<ALLOCATOR_TYPE>::selectOnCopyConstruct(
1415 const ALLOCATOR_TYPE& stdAllocator,
1418 return stdAllocator;
1421#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE) && \
1422 defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES) && \
1423 defined(BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES)
1424template <
class ALLOCATOR_TYPE>
1425template <
class ELEMENT_TYPE,
class... Args>
1428 BloombergLP::bslma::AllocatorTraits_HasConstructMethod<ALLOCATOR_TYPE,
1433allocator_traits<ALLOCATOR_TYPE>::privateConstruct(
1434 ALLOCATOR_TYPE& basicAllocator,
1435 ELEMENT_TYPE *elementAddr,
1436 Args&&... arguments)
1438 basicAllocator.construct(
1442template <
class ALLOCATOR_TYPE>
1443template <
class ELEMENT_TYPE,
class... Args>
1446 !BloombergLP::bslma::AllocatorTraits_HasConstructMethod<ALLOCATOR_TYPE,
1451allocator_traits<ALLOCATOR_TYPE>::privateConstruct(ALLOCATOR_TYPE&,
1452 ELEMENT_TYPE *elementAddr,
1453 Args&&... arguments)
1455 ::new (
static_cast<void *
>(elementAddr))
1459template <
class ALLOCATOR_TYPE>
1460template <
class ELEMENT_TYPE>
1462typename bsl::enable_if<BloombergLP::bslma::AllocatorTraits_HasDestroyMethod<
1465 ELEMENT_TYPE *>::value,
1467allocator_traits<ALLOCATOR_TYPE>::privateDestroy(
1468 ALLOCATOR_TYPE& basicAllocator,
1469 ELEMENT_TYPE *elementAddr)
1471 basicAllocator.destroy(elementAddr);
1474template <
class ALLOCATOR_TYPE>
1475template <
class ELEMENT_TYPE>
1477typename bsl::enable_if<!BloombergLP::bslma::AllocatorTraits_HasDestroyMethod<
1480 ELEMENT_TYPE *>::value,
1482allocator_traits<ALLOCATOR_TYPE>::privateDestroy(ALLOCATOR_TYPE&,
1483 ELEMENT_TYPE *elementAddr)
1485 elementAddr->~ELEMENT_TYPE();
1491template <
class ALLOCATOR_TYPE>
1497 return basicAllocator.allocate(n);
1500template <
class ALLOCATOR_TYPE>
1507 return basicAllocator.allocate(n, hint);
1510template <
class ALLOCATOR_TYPE>
1517 basicAllocator.deallocate(elementAddr, n);
1522#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
1523template <
class ALLOCATOR_TYPE>
1524template <
class ELEMENT_TYPE,
class... Args>
1528 ELEMENT_TYPE *elementAddr,
1529 Args&&... arguments)
1531#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1532 privateConstruct(basicAllocator,
1539 basicAllocator.construct(
1545template <
class ALLOCATOR_TYPE>
1546template <
class ELEMENT_TYPE>
1550 ELEMENT_TYPE *elementAddr)
1558#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE) && \
1559 defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES)
1560 privateDestroy(stdAllocator, elementAddr);
1562 elementAddr->~ELEMENT_TYPE();
1563 (void) stdAllocator;
1567template <
class ALLOCATOR_TYPE>
1573#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1574 return BloombergLP::bslma::
1575 AllocatorTraits_CallMaxSize<ALLOCATOR_TYPE>::max_size(basicAllocator);
1580 return basicAllocator.max_size();
1584template <
class ALLOCATOR_TYPE>
1588 const ALLOCATOR_TYPE&
rhs)
1590 return selectOnCopyConstruct(
rhs, DelegateSelectMethod());
Definition bslma_bslallocator.h:588
#define BSLMF_VOIDTYPE(ARG)
Definition bslmf_voidtype.h:343
#define BSLS_COMPILERFEATURES_FORWARD(T, V)
Definition bsls_compilerfeatures.h:2349
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:674
Definition bdlat_valuetypefunctions.h:939
integral_constant< bool, false > false_type
Definition bslmf_integralconstant.h:290
integral_constant< bool, true > true_type
Definition bslmf_integralconstant.h:296
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
Definition baljsn_encoder_testtypes.h:76
Definition bdlbb_blob.h:579
Definition bdldfp_decimal.h:5549
Definition bslma_allocatortraits.h:1211
rebind_alloc(const ARG &allocatorArg)
Definition bslma_allocatortraits.h:1224
BloombergLP::bslma::AllocatorTraits_RebindAlloc< ALLOCATOR_TYPE, ELEMENT_TYPE >::type allocator_type
Definition bslma_allocatortraits.h:1221
Definition bslma_allocatortraits.h:1237
Definition bslma_allocatortraits.h:1089
static pointer allocate(ALLOCATOR_TYPE &basicAllocator, size_type n)
Return basicAllocator.allocate(n).
Definition bslma_allocatortraits.h:1494
BloombergLP::bslma::AllocatorTraits_ConstPointerType< ALLOCATOR_TYPE >::type const_pointer
Definition bslma_allocatortraits.h:1183
BloombergLP::bslma::AllocatorTraits_VoidPointerType< ALLOCATOR_TYPE >::type void_pointer
Definition bslma_allocatortraits.h:1186
BloombergLP::bslma::AllocatorTraits_PropOnCopyAssign< ALLOCATOR_TYPE >::type propagate_on_container_copy_assignment
Definition bslma_allocatortraits.h:1332
BloombergLP::bslma::AllocatorTraits_PropOnMoveAssign< ALLOCATOR_TYPE >::type propagate_on_container_move_assignment
Definition bslma_allocatortraits.h:1341
static ALLOCATOR_TYPE select_on_container_copy_construction(const ALLOCATOR_TYPE &rhs)
Definition bslma_allocatortraits.h:1587
BloombergLP::bslma::AllocatorTraits_SizeType< ALLOCATOR_TYPE >::type size_type
Definition bslma_allocatortraits.h:1196
static void construct(ALLOCATOR_TYPE &basicAllocator, ELEMENT_TYPE *elementAddr, Args &&... arguments)
Definition bslma_allocatortraits.h:1527
static pointer allocate(ALLOCATOR_TYPE &basicAllocator, size_type n, const_void_pointer hint)
Return basicAllocator.allocate(n, hint).
Definition bslma_allocatortraits.h:1503
static size_type max_size(const ALLOCATOR_TYPE &basicAllocator) BSLS_KEYWORD_NOEXCEPT
Definition bslma_allocatortraits.h:1570
BloombergLP::bslma::AllocatorTraits_PointerType< ALLOCATOR_TYPE >::type pointer
Definition bslma_allocatortraits.h:1180
static void destroy(ALLOCATOR_TYPE &basicAllocator, ELEMENT_TYPE *elementAddr)
Definition bslma_allocatortraits.h:1549
BloombergLP::bslma::AllocatorTraits_IsAlwaysEqual< ALLOCATOR_TYPE >::type is_always_equal
Definition bslma_allocatortraits.h:1323
static void deallocate(ALLOCATOR_TYPE &basicAllocator, pointer elementAddr, size_type n)
Definition bslma_allocatortraits.h:1513
BloombergLP::bslma::AllocatorTraits_PropOnSwap< ALLOCATOR_TYPE >::type propagate_on_container_swap
Definition bslma_allocatortraits.h:1350
ALLOCATOR_TYPE allocator_type
Definition bslma_allocatortraits.h:1175
BloombergLP::bslma::AllocatorTraits_ConstVoidPointerType< ALLOCATOR_TYPE >::type const_void_pointer
Definition bslma_allocatortraits.h:1189
BloombergLP::bslma::AllocatorTraits_DifferenceType< ALLOCATOR_TYPE >::type difference_type
Definition bslma_allocatortraits.h:1193
ALLOCATOR_TYPE::value_type value_type
Definition bslma_allocatortraits.h:1176
Definition bslmf_enableif.h:530
Definition bslmf_integralconstant.h:261
Definition bslmf_isempty.h:319
Definition bslmf_issame.h:146
T::const_pointer type
Definition bslma_allocatortraits.h:883
Definition bslma_allocatortraits.h:873
const T::value_type * type
should be pointer_traits::rebind of template above
Definition bslma_allocatortraits.h:875
T::const_void_pointer type
Definition bslma_allocatortraits.h:920
Definition bslma_allocatortraits.h:910
const void * type
should be pointer_traits::rebind of template above
Definition bslma_allocatortraits.h:912
T::difference_type type
Definition bslma_allocatortraits.h:956
Definition bslma_allocatortraits.h:946
std::ptrdiff_t type
Definition bslma_allocatortraits.h:947
Definition bslma_allocatortraits.h:540
static const bool value
Definition bslma_allocatortraits.h:558
bsl::integral_constant< bool, value > type
Definition bslma_allocatortraits.h:561
Definition bslma_allocatortraits.h:645
static const bool value
Definition bslma_allocatortraits.h:661
bsl::integral_constant< bool, value > type
Definition bslma_allocatortraits.h:663
Definition bslma_allocatortraits.h:705
bsl::integral_constant< bool, value > type
Definition bslma_allocatortraits.h:722
static const bool value
Definition bslma_allocatortraits.h:721
Definition bslma_allocatortraits.h:763
bsl::integral_constant< bool, value > type
Definition bslma_allocatortraits.h:780
static const bool value
Definition bslma_allocatortraits.h:779
Definition bslma_allocatortraits.h:601
bsl::integral_constant< bool, value > type
Definition bslma_allocatortraits.h:629
static const bool value
Definition bslma_allocatortraits.h:627
Definition bslma_allocatortraits.h:574
T::pointer type
Definition bslma_allocatortraits.h:865
Definition bslma_allocatortraits.h:858
T::value_type * type
Definition bslma_allocatortraits.h:859
Definition bslma_allocatortraits.h:678
Definition bslma_allocatortraits.h:737
Definition bslma_allocatortraits.h:793
T::template rebind< U >::other type
Definition bslma_allocatortraits.h:1011
Definition bslma_allocatortraits.h:1002
AllocatorTraits_RebindFront< T, U >::type type
Definition bslma_allocatortraits.h:1003
ALLOC< U > type
Definition bslma_allocatortraits.h:990
Definition bslma_allocatortraits.h:981
T::size_type type
Definition bslma_allocatortraits.h:935
Definition bslma_allocatortraits.h:928
std::size_t type
Definition bslma_allocatortraits.h:929
T::void_pointer type
Definition bslma_allocatortraits.h:902
Definition bslma_allocatortraits.h:892
void * type
should be pointer_traits::rebind of template above
Definition bslma_allocatortraits.h:894