11#ifndef INCLUDED_BSLMA_ALLOCATORTRAITS_CPP03
12#define INCLUDED_BSLMA_ALLOCATORTRAITS_CPP03
63#ifdef COMPILING_BSLMA_ALLOCATORTRAITS_H
83struct AllocatorTraits_HasIsAlwaysEqual {
87 typedef struct {
char d_a; } yes_type;
88 typedef struct {
char d_a[2]; } no_type;
95 static yes_type match(
typename U::is_always_equal *);
97 static no_type match(...);
101 static const bool value =
sizeof(match<ALLOC>(0)) ==
sizeof(yes_type);
115template <class ALLOC, bool = AllocatorTraits_HasIsAlwaysEqual<ALLOC>::value>
116struct AllocatorTraits_IsAlwaysEqual :
public ALLOC::is_always_equal
124template <
class ALLOC>
125struct AllocatorTraits_IsAlwaysEqual<ALLOC, false>
143template <
class ALLOCATOR_TYPE>
144struct AllocatorTraits_HasSelectOnCopyMethod {
147 typedef struct {
char a; } yes_type;
148 typedef struct {
char a[2]; } no_type;
154 template <
class T, T>
struct MatchType { };
157 struct MethodAlias {
typedef T (T::*Method)() const; };
163 template <
class TYPE>
164 static yes_type match(MatchType<
typename MethodAlias<TYPE>::Method,
165 &TYPE::select_on_container_copy_construction> *);
166 template <
class TYPE>
167 static no_type match(...);
170 static const bool value =
171 sizeof(match<ALLOCATOR_TYPE>(0)) ==
sizeof(yes_type);
187template <
class ALLOCATOR_TYPE>
188struct AllocatorTraits_HasPropOnCopyAssign {
191 typedef struct {
char a; } yes_type;
192 typedef struct {
char a[2]; } no_type;
199 yes_type match(
typename U::propagate_on_container_copy_assignment *);
201 static no_type match(...);
204 static const bool value =
205 sizeof(match<ALLOCATOR_TYPE>(0)) ==
sizeof(yes_type);
218template <
class ALLOCATOR_TYPE,
229template <
class ALLOC>
230struct AllocatorTraits_PropOnCopyAssign<ALLOC, true>
231 :
public ALLOC::propagate_on_container_copy_assignment
247template <
class ALLOC>
248struct AllocatorTraits_HasPropOnMoveAssign {
251 typedef struct {
char a; } yes_type;
252 typedef struct {
char a[2]; } no_type;
259 yes_type match(
typename U::propagate_on_container_move_assignment *);
261 static no_type match(...);
264 static const bool value =
sizeof(match<ALLOC>(0)) ==
sizeof(yes_type);
277template <
class ALLOC,
288template <
class ALLOC>
289struct AllocatorTraits_PropOnMoveAssign<ALLOC, true>
290 :
public ALLOC::propagate_on_container_move_assignment
305template <
class ALLOC>
306struct AllocatorTraits_HasPropOnSwap {
309 typedef struct {
char a; } yes_type;
310 typedef struct {
char a[2]; } no_type;
317 yes_type match(
typename U::propagate_on_container_swap *);
319 static no_type match(...);
322 static const bool value =
sizeof(match<ALLOC>(0)) ==
sizeof(yes_type);
334template <class ALLOC, bool = AllocatorTraits_HasPropOnSwap<ALLOC>::value>
344template <
class ALLOC>
345struct AllocatorTraits_PropOnSwap<ALLOC, true>
346 :
public ALLOC::propagate_on_container_swap
350#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE) && \
351 defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES) && \
352 defined(BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES)
358template <
class T,
class Return,
class... Args>
359struct AllocatorTraits_HasConstructMethod {
362 static auto match(U *) ->
364 bslmf::Util::declval<Args>()...)),
370 typedef decltype(match<T>(0)) type;
371 static const bool value = type::value;
378template <
class T,
class Return,
class... Args>
379struct AllocatorTraits_HasDestroyMethod {
382 static auto match(U *) ->
384 bslmf::Util::declval<Args>()...)),
390 typedef decltype(match<T>(0)) type;
391 static const bool value = type::value;
400template <
class T,
class =
void>
401struct AllocatorTraits_PointerType {
402 typedef typename T::value_type *
type;
407struct AllocatorTraits_PointerType<T,
BSLMF_VOIDTYPE(typename T::pointer)> {
408 typedef typename T::pointer
type;
415template <
class T,
class =
void>
416struct AllocatorTraits_ConstPointerType {
418 typedef const typename T::value_type *
type;
423struct AllocatorTraits_ConstPointerType<
426 typedef typename T::const_pointer
type;
434template <
class T,
class =
void>
435struct AllocatorTraits_VoidPointerType {
442struct AllocatorTraits_VoidPointerType<
445 typedef typename T::void_pointer
type;
452template <
class T,
class =
void>
453struct AllocatorTraits_ConstVoidPointerType {
455 typedef const void *
type;
460struct AllocatorTraits_ConstVoidPointerType<
463 typedef typename T::const_void_pointer
type;
470template <
class T,
class =
void>
471struct AllocatorTraits_SizeType {
472 typedef std::size_t
type;
477struct AllocatorTraits_SizeType<T,
BSLMF_VOIDTYPE(typename T::size_type)> {
478 typedef typename T::size_type
type;
488template <
class T,
class =
void>
489struct AllocatorTraits_DifferenceType {
490 typedef std::ptrdiff_t
type;
496struct AllocatorTraits_DifferenceType<
499 typedef typename T::difference_type
type;
506#if defined(BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES)
511template <
class T,
class U>
512struct AllocatorTraits_RebindFront {
515template <
template <
class,
class...>
class ALLOC,
519struct AllocatorTraits_RebindFront<ALLOC<T, ARGS...>, U> {
520 using type = ALLOC<U, ARGS...>;
523template <
class T,
class U>
524struct AllocatorTraits_RebindFront {
529template <
template <
class>
class ALLOC,
532struct AllocatorTraits_RebindFront<ALLOC<T>, U> {
533 typedef ALLOC<U> type;
544template <
class T,
class U,
class =
void>
545struct AllocatorTraits_RebindAlloc {
546 typedef typename AllocatorTraits_RebindFront<T, U>::type
type;
549template <
class T,
class U>
550struct AllocatorTraits_RebindAlloc<
554 typedef typename T::template rebind<U>::other
type;
561#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
562template <
class T,
class =
void>
563struct AllocatorTraits_CallMaxSize {
566 typedef typename AllocatorTraits_SizeType<T>::type SizeType;
573 static SizeType max_size(
const T &)
575 return std::numeric_limits<SizeType>::max() /
576 sizeof(
typename T::value_type);
584struct AllocatorTraits_CallMaxSize<
589 typedef typename AllocatorTraits_SizeType<T>::type SizeType;
596 static SizeType max_size(
const T &alloc)
598 return alloc.max_size();
631template <
class ALLOCATOR_TYPE>
632struct allocator_traits {
636 typedef typename BloombergLP::bslma::AllocatorTraits_HasSelectOnCopyMethod<
637 ALLOCATOR_TYPE>::type DelegateSelectMethod;
643 ALLOCATOR_TYPE selectOnCopyConstruct(
const ALLOCATOR_TYPE& stdAllocator,
651 ALLOCATOR_TYPE selectOnCopyConstruct(
const ALLOCATOR_TYPE& stdAllocator,
654#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE) && \
655 defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES) && \
656 defined(BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES)
667 template <
class ELEMENT_TYPE,
class... Args>
669 BloombergLP::bslma::AllocatorTraits_HasConstructMethod<ALLOCATOR_TYPE,
674 privateConstruct(ALLOCATOR_TYPE& basicAllocator,
675 ELEMENT_TYPE *elementAddr,
676 Args&&... arguments);
677 template <
class ELEMENT_TYPE,
class... Args>
679 !BloombergLP::bslma::AllocatorTraits_HasConstructMethod<
685 privateConstruct(ALLOCATOR_TYPE& basicAllocator,
686 ELEMENT_TYPE *elementAddr,
687 Args&&... arguments);
689 template <
class ELEMENT_TYPE>
691 BloombergLP::bslma::AllocatorTraits_HasDestroyMethod<
694 ELEMENT_TYPE *>::value,
696 privateDestroy(ALLOCATOR_TYPE& basicAllocator, ELEMENT_TYPE *elementAddr);
706 template <
class ELEMENT_TYPE>
708 !BloombergLP::bslma::AllocatorTraits_HasDestroyMethod<
711 ELEMENT_TYPE *>::value,
713 privateDestroy(ALLOCATOR_TYPE& basicAllocator, ELEMENT_TYPE *elementAddr);
719 typedef typename ALLOCATOR_TYPE::value_type
value_type;
722 BloombergLP::bslma::AllocatorTraits_PointerType<ALLOCATOR_TYPE>::type
725 BloombergLP::bslma::AllocatorTraits_ConstPointerType<ALLOCATOR_TYPE>::type
728 BloombergLP::bslma::AllocatorTraits_VoidPointerType<ALLOCATOR_TYPE>::type
730 typedef typename BloombergLP::bslma::
731 AllocatorTraits_ConstVoidPointerType<ALLOCATOR_TYPE>::type
735 BloombergLP::bslma::AllocatorTraits_DifferenceType<ALLOCATOR_TYPE>::type
738 BloombergLP::bslma::AllocatorTraits_SizeType<ALLOCATOR_TYPE>::type
741#ifdef BSLS_COMPILERFEATURES_SUPPORT_ALIAS_TEMPLATES
742 template <
class ELEMENT_TYPE>
743 using rebind_alloc =
typename
744 BloombergLP::bslma::AllocatorTraits_RebindAlloc<ALLOCATOR_TYPE,
747 template <
class ELEMENT_TYPE>
748 using rebind_traits = allocator_traits<rebind_alloc<ELEMENT_TYPE>>;
750 template <
class ELEMENT_TYPE>
752 : BloombergLP::bslma::AllocatorTraits_RebindAlloc<ALLOCATOR_TYPE,
762 typedef typename BloombergLP::bslma::
763 AllocatorTraits_RebindAlloc<ALLOCATOR_TYPE, ELEMENT_TYPE>::type
766 template <
typename ARG>
777 template <
class ELEMENT_TYPE>
778 struct rebind_traits : allocator_traits<typename allocator_traits::template
779 rebind_alloc<ELEMENT_TYPE>::allocator_type>
800 static void deallocate(ALLOCATOR_TYPE& basicAllocator,
806#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
809#ifndef BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT
810#define BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT 14
812#ifndef BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A
813#define BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT
816#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A >= 0
817 template <
class ELEMENT_TYPE>
818 static void construct(ALLOCATOR_TYPE& basicAllocator,
819 ELEMENT_TYPE *elementAddr);
822#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A >= 1
823 template <
class ELEMENT_TYPE,
class Args_01>
824 static void construct(ALLOCATOR_TYPE& basicAllocator,
825 ELEMENT_TYPE *elementAddr,
829#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A >= 2
830 template <
class ELEMENT_TYPE,
class Args_01,
832 static void construct(ALLOCATOR_TYPE& basicAllocator,
833 ELEMENT_TYPE *elementAddr,
838#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A >= 3
839 template <
class ELEMENT_TYPE,
class Args_01,
842 static void construct(ALLOCATOR_TYPE& basicAllocator,
843 ELEMENT_TYPE *elementAddr,
849#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A >= 4
850 template <
class ELEMENT_TYPE,
class Args_01,
854 static void construct(ALLOCATOR_TYPE& basicAllocator,
855 ELEMENT_TYPE *elementAddr,
862#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A >= 5
863 template <
class ELEMENT_TYPE,
class Args_01,
868 static void construct(ALLOCATOR_TYPE& basicAllocator,
869 ELEMENT_TYPE *elementAddr,
877#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A >= 6
878 template <
class ELEMENT_TYPE,
class Args_01,
884 static void construct(ALLOCATOR_TYPE& basicAllocator,
885 ELEMENT_TYPE *elementAddr,
894#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A >= 7
895 template <
class ELEMENT_TYPE,
class Args_01,
902 static void construct(ALLOCATOR_TYPE& basicAllocator,
903 ELEMENT_TYPE *elementAddr,
913#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A >= 8
914 template <
class ELEMENT_TYPE,
class Args_01,
922 static void construct(ALLOCATOR_TYPE& basicAllocator,
923 ELEMENT_TYPE *elementAddr,
934#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A >= 9
935 template <
class ELEMENT_TYPE,
class Args_01,
944 static void construct(ALLOCATOR_TYPE& basicAllocator,
945 ELEMENT_TYPE *elementAddr,
957#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A >= 10
958 template <
class ELEMENT_TYPE,
class Args_01,
968 static void construct(ALLOCATOR_TYPE& basicAllocator,
969 ELEMENT_TYPE *elementAddr,
982#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A >= 11
983 template <
class ELEMENT_TYPE,
class Args_01,
994 static void construct(ALLOCATOR_TYPE& basicAllocator,
995 ELEMENT_TYPE *elementAddr,
1009#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A >= 12
1010 template <
class ELEMENT_TYPE,
class Args_01,
1022 static void construct(ALLOCATOR_TYPE& basicAllocator,
1023 ELEMENT_TYPE *elementAddr,
1038#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A >= 13
1039 template <
class ELEMENT_TYPE,
class Args_01,
1052 static void construct(ALLOCATOR_TYPE& basicAllocator,
1053 ELEMENT_TYPE *elementAddr,
1069#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_A >= 14
1070 template <
class ELEMENT_TYPE,
class Args_01,
1084 static void construct(ALLOCATOR_TYPE& basicAllocator,
1085 ELEMENT_TYPE *elementAddr,
1106 template <
class ELEMENT_TYPE,
class... Args>
1107 static void construct(ALLOCATOR_TYPE& basicAllocator,
1108 ELEMENT_TYPE *elementAddr,
1121 template <
class ELEMENT_TYPE>
1122 static void destroy(ALLOCATOR_TYPE& basicAllocator,
1123 ELEMENT_TYPE *elementAddr);
1146 static ALLOCATOR_TYPE
1154 typedef typename BloombergLP::bslma::AllocatorTraits_IsAlwaysEqual<
1163 typedef typename BloombergLP::bslma::AllocatorTraits_PropOnCopyAssign<
1172 typedef typename BloombergLP::bslma::AllocatorTraits_PropOnMoveAssign<
1181 typedef typename BloombergLP::bslma::AllocatorTraits_PropOnSwap<
1197template <
class ALLOCATOR_TYPE>
1198struct allocator_traits<ALLOCATOR_TYPE *> {
1201#if BSLS_COMPILERFEATURES_CPLUSPLUS >= 201703L
1216template <
class ALLOCATOR_TYPE>
1217struct allocator_traits<
std::allocator<ALLOCATOR_TYPE> >
1218: std::allocator_traits<std::allocator<ALLOCATOR_TYPE> > {
1235template <
class ALLOCATOR_TYPE>
1237ALLOCATOR_TYPE allocator_traits<ALLOCATOR_TYPE>::selectOnCopyConstruct(
1238 const ALLOCATOR_TYPE& stdAllocator,
1241 return stdAllocator.select_on_container_copy_construction();
1244template <
class ALLOCATOR_TYPE>
1246ALLOCATOR_TYPE allocator_traits<ALLOCATOR_TYPE>::selectOnCopyConstruct(
1247 const ALLOCATOR_TYPE& stdAllocator,
1250 return stdAllocator;
1253#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE) && \
1254 defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES) && \
1255 defined(BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES)
1256template <
class ALLOCATOR_TYPE>
1257template <
class ELEMENT_TYPE,
class... Args>
1260 BloombergLP::bslma::AllocatorTraits_HasConstructMethod<ALLOCATOR_TYPE,
1265allocator_traits<ALLOCATOR_TYPE>::privateConstruct(
1266 ALLOCATOR_TYPE& basicAllocator,
1267 ELEMENT_TYPE *elementAddr,
1268 Args&&... arguments)
1270 basicAllocator.construct(
1274template <
class ALLOCATOR_TYPE>
1275template <
class ELEMENT_TYPE,
class... Args>
1278 !BloombergLP::bslma::AllocatorTraits_HasConstructMethod<ALLOCATOR_TYPE,
1283allocator_traits<ALLOCATOR_TYPE>::privateConstruct(ALLOCATOR_TYPE&,
1284 ELEMENT_TYPE *elementAddr,
1285 Args&&... arguments)
1287 ::new (
static_cast<void *
>(elementAddr))
1291template <
class ALLOCATOR_TYPE>
1292template <
class ELEMENT_TYPE>
1294typename bsl::enable_if<BloombergLP::bslma::AllocatorTraits_HasDestroyMethod<
1297 ELEMENT_TYPE *>::value,
1299allocator_traits<ALLOCATOR_TYPE>::privateDestroy(
1300 ALLOCATOR_TYPE& basicAllocator,
1301 ELEMENT_TYPE *elementAddr)
1303 basicAllocator.destroy(elementAddr);
1306template <
class ALLOCATOR_TYPE>
1307template <
class ELEMENT_TYPE>
1309typename bsl::enable_if<!BloombergLP::bslma::AllocatorTraits_HasDestroyMethod<
1312 ELEMENT_TYPE *>::value,
1314allocator_traits<ALLOCATOR_TYPE>::privateDestroy(ALLOCATOR_TYPE&,
1315 ELEMENT_TYPE *elementAddr)
1317 elementAddr->~ELEMENT_TYPE();
1323template <
class ALLOCATOR_TYPE>
1329 return basicAllocator.allocate(n);
1332template <
class ALLOCATOR_TYPE>
1337 const_void_pointer hint)
1339 return basicAllocator.allocate(n, hint);
1342template <
class ALLOCATOR_TYPE>
1346 pointer elementAddr,
1349 basicAllocator.deallocate(elementAddr, n);
1354#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
1357#ifndef BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT
1358#define BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT 14
1360#ifndef BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B
1361#define BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT
1363#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B >= 0
1364template <
class ALLOCATOR_TYPE>
1365template <
class ELEMENT_TYPE>
1369 ELEMENT_TYPE *elementAddr)
1371#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1372 privateConstruct(basicAllocator,
1375 basicAllocator.construct(
1381#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B >= 1
1382template <
class ALLOCATOR_TYPE>
1383template <
class ELEMENT_TYPE,
class Args_01>
1387 ELEMENT_TYPE *elementAddr,
1390#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1391 privateConstruct(basicAllocator,
1395 basicAllocator.construct(
1401#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B >= 2
1402template <
class ALLOCATOR_TYPE>
1403template <
class ELEMENT_TYPE,
class Args_01,
1408 ELEMENT_TYPE *elementAddr,
1412#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1413 privateConstruct(basicAllocator,
1418 basicAllocator.construct(
1425#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B >= 3
1426template <
class ALLOCATOR_TYPE>
1427template <
class ELEMENT_TYPE,
class Args_01,
1433 ELEMENT_TYPE *elementAddr,
1438#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1439 privateConstruct(basicAllocator,
1445 basicAllocator.construct(
1453#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B >= 4
1454template <
class ALLOCATOR_TYPE>
1455template <
class ELEMENT_TYPE,
class Args_01,
1462 ELEMENT_TYPE *elementAddr,
1468#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1469 privateConstruct(basicAllocator,
1476 basicAllocator.construct(
1485#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B >= 5
1486template <
class ALLOCATOR_TYPE>
1487template <
class ELEMENT_TYPE,
class Args_01,
1495 ELEMENT_TYPE *elementAddr,
1502#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1503 privateConstruct(basicAllocator,
1511 basicAllocator.construct(
1521#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B >= 6
1522template <
class ALLOCATOR_TYPE>
1523template <
class ELEMENT_TYPE,
class Args_01,
1532 ELEMENT_TYPE *elementAddr,
1540#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1541 privateConstruct(basicAllocator,
1550 basicAllocator.construct(
1561#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B >= 7
1562template <
class ALLOCATOR_TYPE>
1563template <
class ELEMENT_TYPE,
class Args_01,
1573 ELEMENT_TYPE *elementAddr,
1582#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1583 privateConstruct(basicAllocator,
1593 basicAllocator.construct(
1605#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B >= 8
1606template <
class ALLOCATOR_TYPE>
1607template <
class ELEMENT_TYPE,
class Args_01,
1618 ELEMENT_TYPE *elementAddr,
1628#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1629 privateConstruct(basicAllocator,
1640 basicAllocator.construct(
1653#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B >= 9
1654template <
class ALLOCATOR_TYPE>
1655template <
class ELEMENT_TYPE,
class Args_01,
1667 ELEMENT_TYPE *elementAddr,
1678#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1679 privateConstruct(basicAllocator,
1691 basicAllocator.construct(
1705#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B >= 10
1706template <
class ALLOCATOR_TYPE>
1707template <
class ELEMENT_TYPE,
class Args_01,
1720 ELEMENT_TYPE *elementAddr,
1732#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1733 privateConstruct(basicAllocator,
1746 basicAllocator.construct(
1761#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B >= 11
1762template <
class ALLOCATOR_TYPE>
1763template <
class ELEMENT_TYPE,
class Args_01,
1777 ELEMENT_TYPE *elementAddr,
1790#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1791 privateConstruct(basicAllocator,
1805 basicAllocator.construct(
1821#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B >= 12
1822template <
class ALLOCATOR_TYPE>
1823template <
class ELEMENT_TYPE,
class Args_01,
1838 ELEMENT_TYPE *elementAddr,
1852#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1853 privateConstruct(basicAllocator,
1868 basicAllocator.construct(
1885#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B >= 13
1886template <
class ALLOCATOR_TYPE>
1887template <
class ELEMENT_TYPE,
class Args_01,
1903 ELEMENT_TYPE *elementAddr,
1918#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1919 privateConstruct(basicAllocator,
1935 basicAllocator.construct(
1953#if BSLMA_ALLOCATORTRAITS_VARIADIC_LIMIT_B >= 14
1954template <
class ALLOCATOR_TYPE>
1955template <
class ELEMENT_TYPE,
class Args_01,
1972 ELEMENT_TYPE *elementAddr,
1988#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
1989 privateConstruct(basicAllocator,
2006 basicAllocator.construct(
2028template <
class ALLOCATOR_TYPE>
2029template <
class ELEMENT_TYPE,
class... Args>
2033 ELEMENT_TYPE *elementAddr,
2036#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
2037 privateConstruct(basicAllocator,
2041 basicAllocator.construct(
2048template <
class ALLOCATOR_TYPE>
2049template <
class ELEMENT_TYPE>
2053 ELEMENT_TYPE *elementAddr)
2061#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE) && \
2062 defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES)
2063 privateDestroy(stdAllocator, elementAddr);
2065 elementAddr->~ELEMENT_TYPE();
2066 (void) stdAllocator;
2070template <
class ALLOCATOR_TYPE>
2076#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)
2077 return BloombergLP::bslma::
2078 AllocatorTraits_CallMaxSize<ALLOCATOR_TYPE>::max_size(basicAllocator);
2083 return basicAllocator.max_size();
2087template <
class ALLOCATOR_TYPE>
2091 const ALLOCATOR_TYPE&
rhs)
2093 return selectOnCopyConstruct(
rhs, DelegateSelectMethod());
2099# error Not valid except when included from bslma_allocatortraits.h
#define BSLMF_VOIDTYPE(ARG)
Definition bslmf_voidtype.h:343
#define BSLS_COMPILERFEATURES_FORWARD_REF(T)
Definition bsls_compilerfeatures.h:2343
#define BSLS_COMPILERFEATURES_FORWARD(T, V)
Definition bsls_compilerfeatures.h:2349
#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
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
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 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
const T::value_type * type
should be pointer_traits::rebind of template above
Definition bslma_allocatortraits.h:875
const void * type
should be pointer_traits::rebind of template above
Definition bslma_allocatortraits.h:912
std::ptrdiff_t type
Definition bslma_allocatortraits.h:947
static const bool value
Definition bslma_allocatortraits.h:558
bsl::integral_constant< bool, value > type
Definition bslma_allocatortraits.h:561
static const bool value
Definition bslma_allocatortraits.h:661
bsl::integral_constant< bool, value > type
Definition bslma_allocatortraits.h:663
bsl::integral_constant< bool, value > type
Definition bslma_allocatortraits.h:722
static const bool value
Definition bslma_allocatortraits.h:721
bsl::integral_constant< bool, value > type
Definition bslma_allocatortraits.h:780
static const bool value
Definition bslma_allocatortraits.h:779
bsl::integral_constant< bool, value > type
Definition bslma_allocatortraits.h:629
static const bool value
Definition bslma_allocatortraits.h:627
T::value_type * type
Definition bslma_allocatortraits.h:859
AllocatorTraits_RebindFront< T, U >::type type
Definition bslma_allocatortraits.h:1003
std::size_t type
Definition bslma_allocatortraits.h:929
void * type
should be pointer_traits::rebind of template above
Definition bslma_allocatortraits.h:894