8#ifndef INCLUDED_BSLTF_STDSTATEFULALLOCATOR
9#define INCLUDED_BSLTF_STDSTATEFULALLOCATOR
176#include <bslscm_version.h>
193#if BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
199# define COMPILING_BSLTF_STDSTATEFULALLOCATOR_H
201# undef COMPILING_BSLTF_STDSTATEFULALLOCATOR_H
233 bool PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION =
true,
234 bool PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT =
true,
235 bool PROPAGATE_ON_CONTAINER_SWAP =
true,
236 bool PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT =
true,
237 bool IS_ALWAYS_EQUAL =
false>
260#if !defined(BSLSTL_ALLOCATOR_TRAITS_SUPPORTS_ALL_CPP11_DEDUCTIONS)
268 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT>
275 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT>
289 template <
class BDE_OTHER_TYPE>
295 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
296 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
297 PROPAGATE_ON_CONTAINER_SWAP,
298 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
314 template <
class BDE_OTHER_TYPE>
317 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
318 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
319 PROPAGATE_ON_CONTAINER_SWAP,
320 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
321 IS_ALWAYS_EQUAL>& original);
338#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
346 template <
class ELEMENT_TYPE,
class... Args>
347 void construct(ELEMENT_TYPE *address, Args&&... arguments);
360 template <
class ELEMENT_TYPE>
361 void destroy(ELEMENT_TYPE *address);
364#if !defined(BSLSTL_ALLOCATOR_TRAITS_SUPPORTS_ALL_CPP11_DEDUCTIONS)
391template <
class TYPE1,
393 bool PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
394 bool PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
395 bool PROPAGATE_ON_CONTAINER_SWAP,
396 bool PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
397 bool IS_ALWAYS_EQUAL>
400 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
401 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
402 PROPAGATE_ON_CONTAINER_SWAP,
403 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
404 IS_ALWAYS_EQUAL>& lhs,
407 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
408 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
409 PROPAGATE_ON_CONTAINER_SWAP,
410 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
411 IS_ALWAYS_EQUAL>& rhs);
415template <
class TYPE1,
417 bool PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
418 bool PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
419 bool PROPAGATE_ON_CONTAINER_SWAP,
420 bool PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
421 bool IS_ALWAYS_EQUAL>
424 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
425 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
426 PROPAGATE_ON_CONTAINER_SWAP,
427 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
428 IS_ALWAYS_EQUAL>& lhs,
431 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
432 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
433 PROPAGATE_ON_CONTAINER_SWAP,
434 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
435 IS_ALWAYS_EQUAL>& rhs);
448 bool PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
449 bool PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
450 bool PROPAGATE_ON_CONTAINER_SWAP,
451 bool PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
452 bool IS_ALWAYS_EQUAL>
455 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
456 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
457 PROPAGATE_ON_CONTAINER_SWAP,
458 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
461: d_allocator_p(
bslma::Default::allocator(allocator))
466 bool PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
467 bool PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
468 bool PROPAGATE_ON_CONTAINER_SWAP,
469 bool PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
470 bool IS_ALWAYS_EQUAL>
471template <
class BDE_OTHER_TYPE>
474 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
475 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
476 PROPAGATE_ON_CONTAINER_SWAP,
477 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
481 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
482 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
483 PROPAGATE_ON_CONTAINER_SWAP,
484 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
485 IS_ALWAYS_EQUAL>& original)
486: d_allocator_p(original.allocator())
492 bool PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
493 bool PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
494 bool PROPAGATE_ON_CONTAINER_SWAP,
495 bool PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
496 bool IS_ALWAYS_EQUAL>
500 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
501 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
502 PROPAGATE_ON_CONTAINER_SWAP,
503 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
504 IS_ALWAYS_EQUAL>::allocate(
507 if (numElements > this->max_size()) {
508 BloombergLP::bsls::BslExceptionUtil::throwBadAlloc();
511 return static_cast<TYPE *
>(d_allocator_p->allocate(
515#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
517 bool PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
518 bool PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
519 bool PROPAGATE_ON_CONTAINER_SWAP,
520 bool PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
521 bool IS_ALWAYS_EQUAL>
522template <
class ELEMENT_TYPE,
class... Args>
526 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
527 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
528 PROPAGATE_ON_CONTAINER_SWAP,
529 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
530 IS_ALWAYS_EQUAL>::construct(
531 ELEMENT_TYPE *address, Args&&... arguments)
533 ::new (
static_cast<void*
>(address)) ELEMENT_TYPE(
539 bool PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
540 bool PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
541 bool PROPAGATE_ON_CONTAINER_SWAP,
542 bool PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
543 bool IS_ALWAYS_EQUAL>
546 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
547 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
548 PROPAGATE_ON_CONTAINER_SWAP,
549 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
557 bool PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
558 bool PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
559 bool PROPAGATE_ON_CONTAINER_SWAP,
560 bool PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
561 bool IS_ALWAYS_EQUAL>
562template <
class ELEMENT_TYPE>
565 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
566 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
567 PROPAGATE_ON_CONTAINER_SWAP,
568 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
569 IS_ALWAYS_EQUAL>::destroy(
570 ELEMENT_TYPE * address)
572 address->~ELEMENT_TYPE();
576 bool PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
577 bool PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
578 bool PROPAGATE_ON_CONTAINER_SWAP,
579 bool PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
580 bool IS_ALWAYS_EQUAL>
584 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
585 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
586 PROPAGATE_ON_CONTAINER_SWAP,
587 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
588 IS_ALWAYS_EQUAL>::size_type
590 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
591 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
592 PROPAGATE_ON_CONTAINER_SWAP,
593 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
605 std::size_t>::value));
607 static const std::size_t MAX_NUM_BYTES =
~std::size_t(0);
608 static const std::size_t MAX_NUM_ELEMENTS =
609 std::size_t(MAX_NUM_BYTES) /
sizeof(TYPE);
610 return MAX_NUM_ELEMENTS;
614 bool PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
615 bool PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
616 bool PROPAGATE_ON_CONTAINER_SWAP,
617 bool PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
618 bool IS_ALWAYS_EQUAL>
621 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
622 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
623 PROPAGATE_ON_CONTAINER_SWAP,
624 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
627 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
628 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
629 PROPAGATE_ON_CONTAINER_SWAP,
630 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
632select_on_container_copy_construction()
const
634 if (PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION) {
644 bool PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
645 bool PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
646 bool PROPAGATE_ON_CONTAINER_SWAP,
647 bool PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
648 bool IS_ALWAYS_EQUAL>
652 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
653 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
654 PROPAGATE_ON_CONTAINER_SWAP,
655 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
659 return d_allocator_p;
665template <
class TYPE1,
667 bool PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
668 bool PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
669 bool PROPAGATE_ON_CONTAINER_SWAP,
670 bool PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
671 bool IS_ALWAYS_EQUAL>
675 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
676 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
677 PROPAGATE_ON_CONTAINER_SWAP,
678 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
679 IS_ALWAYS_EQUAL>& lhs,
680 const StdStatefulAllocator<
682 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
683 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
684 PROPAGATE_ON_CONTAINER_SWAP,
685 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
686 IS_ALWAYS_EQUAL>& rhs)
688 return IS_ALWAYS_EQUAL || (lhs.allocator() == rhs.allocator());
691template <
class TYPE1,
693 bool PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
694 bool PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
695 bool PROPAGATE_ON_CONTAINER_SWAP,
696 bool PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
697 bool IS_ALWAYS_EQUAL>
701 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
702 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
703 PROPAGATE_ON_CONTAINER_SWAP,
704 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
705 IS_ALWAYS_EQUAL>& lhs,
706 const StdStatefulAllocator<
708 PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION,
709 PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT,
710 PROPAGATE_ON_CONTAINER_SWAP,
711 PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT,
712 IS_ALWAYS_EQUAL>& rhs)
714 return !IS_ALWAYS_EQUAL && (
lhs.allocator() !=
rhs.allocator());
Definition bslma_allocator.h:545
std::size_t size_type
Definition bslma_allocator.h:593
Definition bsltf_stdstatefulallocator.h:238
std::ptrdiff_t difference_type
Definition bsltf_stdstatefulallocator.h:262
bslma::Allocator * allocator() const
Return the address of the allocator wrapped by this object.
Definition bsltf_stdstatefulallocator.h:657
bsl::integral_constant< bool, PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT > propagate_on_container_move_assignment
Definition bsltf_stdstatefulallocator.h:276
StdStatefulAllocator select_on_container_copy_construction() const
Definition bsltf_stdstatefulallocator.h:632
TYPE * allocate(bslma::Allocator::size_type numElements)
Definition bsltf_stdstatefulallocator.h:504
bsl::integral_constant< bool, PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT > propagate_on_container_copy_assignment
Definition bsltf_stdstatefulallocator.h:269
const TYPE * const_pointer
Definition bsltf_stdstatefulallocator.h:264
~StdStatefulAllocator()=default
StdStatefulAllocator(const StdStatefulAllocator &original)=default
std::size_t size_type
Definition bsltf_stdstatefulallocator.h:261
TYPE value_type
Definition bsltf_stdstatefulallocator.h:251
bsl::integral_constant< bool, PROPAGATE_ON_CONTAINER_SWAP > propagate_on_container_swap
Definition bsltf_stdstatefulallocator.h:272
void destroy(ELEMENT_TYPE *address)
Definition bsltf_stdstatefulallocator.h:569
void construct(ELEMENT_TYPE *address, Args &&... arguments)
Definition bsltf_stdstatefulallocator.h:530
BSLMF_NESTED_TRAIT_DECLARATION(StdStatefulAllocator, bslma::IsStdAllocator)
StdStatefulAllocator & operator=(const StdStatefulAllocator &rhs)=default
bsl::integral_constant< bool, IS_ALWAYS_EQUAL > is_always_equal
Definition bsltf_stdstatefulallocator.h:280
void deallocate(TYPE *address, bslma::Allocator::size_type numElements)
Definition bsltf_stdstatefulallocator.h:551
size_type max_size() const
Definition bsltf_stdstatefulallocator.h:595
TYPE * pointer
Definition bsltf_stdstatefulallocator.h:263
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#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
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
ALLOCATOR & lhs
Definition bslstl_string.h:3917
Definition baljsn_encoder_testtypes.h:76
Definition bsltf_allocargumenttype.h:92
bool operator!=(const AllocBitwiseMoveableTestType &lhs, const AllocBitwiseMoveableTestType &rhs)
bool operator==(const AllocBitwiseMoveableTestType &lhs, const AllocBitwiseMoveableTestType &rhs)
Definition bdldfp_decimal.h:5549
Definition bslmf_integralconstant.h:261
Definition bslmf_issame.h:146
static Allocator * defaultAllocator()
Definition bslma_default.h:905
Definition bslma_isstdallocator.h:202
Definition bsltf_stdstatefulallocator.h:291
StdStatefulAllocator< BDE_OTHER_TYPE, PROPAGATE_ON_CONTAINER_COPY_CONSTRUCTION, PROPAGATE_ON_CONTAINER_COPY_ASSIGNMENT, PROPAGATE_ON_CONTAINER_SWAP, PROPAGATE_ON_CONTAINER_MOVE_ASSIGNMENT, IS_ALWAYS_EQUAL > other
Definition bsltf_stdstatefulallocator.h:299