11#ifndef INCLUDED_BSLSTL_TREENODEPOOL_CPP03
12#define INCLUDED_BSLSTL_TREENODEPOOL_CPP03
63#ifdef COMPILING_BSLSTL_TREENODEPOOL_H
81template <
class VALUE,
class ALLOCATOR>
85 typedef SimplePool<TreeNode<VALUE>, ALLOCATOR> Pool;
99 TreeNodePool(
const TreeNodePool&);
100 TreeNodePool& operator=(
const TreeNodePool&);
110 typedef typename AllocatorTraits::size_type
size_type;
117 explicit TreeNodePool(
const ALLOCATOR&
allocator);
151#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
154#ifndef BSLSTL_TREENODEPOOL_VARIADIC_LIMIT
155#define BSLSTL_TREENODEPOOL_VARIADIC_LIMIT 10
157#ifndef BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_A
158#define BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_A BSLSTL_TREENODEPOOL_VARIADIC_LIMIT
160#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_A >= 0
165#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_A >= 1
166 template <
class Args_01>
171#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_A >= 2
172 template <
class Args_01,
179#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_A >= 3
180 template <
class Args_01,
189#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_A >= 4
190 template <
class Args_01,
201#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_A >= 5
202 template <
class Args_01,
215#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_A >= 6
216 template <
class Args_01,
231#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_A >= 7
232 template <
class Args_01,
249#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_A >= 8
250 template <
class Args_01,
269#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_A >= 9
270 template <
class Args_01,
291#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_A >= 10
292 template <
class Args_01,
318 template <
class... Args>
353 void swap(TreeNodePool& other);
390template <
class VALUE,
class ALLOCATOR>
392TreeNodePool<VALUE, ALLOCATOR>::TreeNodePool(
const ALLOCATOR& allocator)
397template <
class VALUE,
class ALLOCATOR>
399TreeNodePool<VALUE, ALLOCATOR>::TreeNodePool(
401: d_pool(MoveUtil::move(MoveUtil::access(original).d_pool))
406template <
class VALUE,
class ALLOCATOR>
411 TreeNodePool& lvalue = pool;
412 d_pool.adopt(MoveUtil::move(lvalue.d_pool));
415template <
class VALUE,
class ALLOCATOR>
417typename SimplePool<TreeNode<VALUE>, ALLOCATOR>::AllocatorType&
418TreeNodePool<VALUE, ALLOCATOR>::allocator()
420 return d_pool.allocator();
423template <
class VALUE,
class ALLOCATOR>
428 return emplaceIntoNewNode(
429 static_cast<const TreeNode<VALUE>&
>(original).value());
432#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
435#ifndef BSLSTL_TREENODEPOOL_VARIADIC_LIMIT
436#define BSLSTL_TREENODEPOOL_VARIADIC_LIMIT 10
438#ifndef BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_B
439#define BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_B BSLSTL_TREENODEPOOL_VARIADIC_LIMIT
441#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_B >= 0
442template <
class VALUE,
class ALLOCATOR>
445TreeNodePool<VALUE, ALLOCATOR>::emplaceIntoNewNode(
448 TreeNode<VALUE> *node = d_pool.allocate();
451 AllocatorTraits::construct(allocator(),
458#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_B >= 1
459template <
class VALUE,
class ALLOCATOR>
460template <
class Args_01>
463TreeNodePool<VALUE, ALLOCATOR>::emplaceIntoNewNode(
466 TreeNode<VALUE> *node = d_pool.allocate();
469 AllocatorTraits::construct(allocator(),
477#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_B >= 2
478template <
class VALUE,
class ALLOCATOR>
479template <
class Args_01,
483TreeNodePool<VALUE, ALLOCATOR>::emplaceIntoNewNode(
487 TreeNode<VALUE> *node = d_pool.allocate();
490 AllocatorTraits::construct(allocator(),
499#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_B >= 3
500template <
class VALUE,
class ALLOCATOR>
501template <
class Args_01,
506TreeNodePool<VALUE, ALLOCATOR>::emplaceIntoNewNode(
511 TreeNode<VALUE> *node = d_pool.allocate();
514 AllocatorTraits::construct(allocator(),
524#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_B >= 4
525template <
class VALUE,
class ALLOCATOR>
526template <
class Args_01,
532TreeNodePool<VALUE, ALLOCATOR>::emplaceIntoNewNode(
538 TreeNode<VALUE> *node = d_pool.allocate();
541 AllocatorTraits::construct(allocator(),
552#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_B >= 5
553template <
class VALUE,
class ALLOCATOR>
554template <
class Args_01,
561TreeNodePool<VALUE, ALLOCATOR>::emplaceIntoNewNode(
568 TreeNode<VALUE> *node = d_pool.allocate();
571 AllocatorTraits::construct(allocator(),
583#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_B >= 6
584template <
class VALUE,
class ALLOCATOR>
585template <
class Args_01,
593TreeNodePool<VALUE, ALLOCATOR>::emplaceIntoNewNode(
601 TreeNode<VALUE> *node = d_pool.allocate();
604 AllocatorTraits::construct(allocator(),
617#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_B >= 7
618template <
class VALUE,
class ALLOCATOR>
619template <
class Args_01,
628TreeNodePool<VALUE, ALLOCATOR>::emplaceIntoNewNode(
637 TreeNode<VALUE> *node = d_pool.allocate();
640 AllocatorTraits::construct(allocator(),
654#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_B >= 8
655template <
class VALUE,
class ALLOCATOR>
656template <
class Args_01,
666TreeNodePool<VALUE, ALLOCATOR>::emplaceIntoNewNode(
676 TreeNode<VALUE> *node = d_pool.allocate();
679 AllocatorTraits::construct(allocator(),
694#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_B >= 9
695template <
class VALUE,
class ALLOCATOR>
696template <
class Args_01,
707TreeNodePool<VALUE, ALLOCATOR>::emplaceIntoNewNode(
718 TreeNode<VALUE> *node = d_pool.allocate();
721 AllocatorTraits::construct(allocator(),
737#if BSLSTL_TREENODEPOOL_VARIADIC_LIMIT_B >= 10
738template <
class VALUE,
class ALLOCATOR>
739template <
class Args_01,
751TreeNodePool<VALUE, ALLOCATOR>::emplaceIntoNewNode(
763 TreeNode<VALUE> *node = d_pool.allocate();
766 AllocatorTraits::construct(allocator(),
786template <
class VALUE,
class ALLOCATOR>
787template <
class... Args>
790TreeNodePool<VALUE, ALLOCATOR>::emplaceIntoNewNode(
793 TreeNode<VALUE> *node = d_pool.allocate();
796 AllocatorTraits::construct(allocator(),
805template <
class VALUE,
class ALLOCATOR>
811 TreeNode<VALUE> *treeNode =
static_cast<TreeNode<VALUE> *
>(node);
812 AllocatorTraits::destroy(allocator(),
814 d_pool.deallocate(treeNode);
817template <
class VALUE,
class ALLOCATOR>
822 return emplaceIntoNewNode(
823 MoveUtil::move(
static_cast<TreeNode<VALUE> *
>(original)->value()));
826template <
class VALUE,
class ALLOCATOR>
828void TreeNodePool<VALUE, ALLOCATOR>::reserveNodes(size_type numNodes)
832 d_pool.reserve(numNodes);
835template <
class VALUE,
class ALLOCATOR>
837void TreeNodePool<VALUE, ALLOCATOR>::swap(
838 TreeNodePool<VALUE, ALLOCATOR>& other)
842 d_pool.swap(other.d_pool);
845template <
class VALUE,
class ALLOCATOR>
847void TreeNodePool<VALUE, ALLOCATOR>::swapExchangeAllocators(
848 TreeNodePool<VALUE, ALLOCATOR>& other)
850 d_pool.quickSwapExchangeAllocators(other.d_pool);
853template <
class VALUE,
class ALLOCATOR>
855void TreeNodePool<VALUE, ALLOCATOR>::swapRetainAllocators(
856 TreeNodePool<VALUE, ALLOCATOR>& other)
860 d_pool.quickSwapRetainAllocators(other.d_pool);
864template <
class VALUE,
class ALLOCATOR>
866const typename SimplePool<TreeNode<VALUE>, ALLOCATOR>::AllocatorType&
867TreeNodePool<VALUE, ALLOCATOR>::allocator()
const
869 return d_pool.allocator();
872template <
class VALUE,
class ALLOCATOR>
874bool TreeNodePool<VALUE, ALLOCATOR>::hasFreeNodes()
const
876 return d_pool.hasFreeBlocks();
883# error Not valid except when included from bslstl_treenodepool.h
Definition bslalg_rbtreenode.h:377
Definition bslma_deallocatorproctor.h:312
Definition bslmf_movableref.h:752
Types::AllocatorType AllocatorType
Definition bslstl_simplepool.h:343
Types::AllocatorTraits AllocatorTraits
Definition bslstl_simplepool.h:347
void reserveNodes(size_type numNodes)
Definition bslstl_treenodepool.h:524
void adopt(bslmf::MovableRef< TreeNodePool > pool)
Definition bslstl_treenodepool.h:460
AllocatorTraits::size_type size_type
Alias for the size_type of the allocator defined by SimplePool.
Definition bslstl_treenodepool.h:323
bslalg::RbTreeNode * moveIntoNewNode(bslalg::RbTreeNode *original)
Definition bslstl_treenodepool.h:516
Pool::AllocatorType AllocatorType
Alias for the allocator type defined by SimplePool.
Definition bslstl_treenodepool.h:320
void swap(TreeNodePool &other)
Definition bslstl_treenodepool.h:533
AllocatorType & allocator()
Definition bslstl_treenodepool.h:469
bslalg::RbTreeNode * emplaceIntoNewNode(Args &&... args)
Definition bslstl_treenodepool.h:488
void swapExchangeAllocators(TreeNodePool &other)
Definition bslstl_treenodepool.h:543
void deleteNode(bslalg::RbTreeNode *node)
Definition bslstl_treenodepool.h:503
bool hasFreeNodes() const
Definition bslstl_treenodepool.h:570
bslalg::RbTreeNode * cloneNode(const bslalg::RbTreeNode &original)
Definition bslstl_treenodepool.h:476
void swapRetainAllocators(TreeNodePool &other)
Definition bslstl_treenodepool.h:551
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_ASSERT_SAFE(X)
Definition bsls_assert.h:1917
#define BSLS_COMPILERFEATURES_FORWARD_REF(T)
Definition bsls_compilerfeatures.h:2343
#define BSLS_COMPILERFEATURES_FORWARD(T, V)
Definition bsls_compilerfeatures.h:2349
#define BSLS_UTIL_ADDRESSOF(OBJ)
Definition bsls_util.h:296
Definition bslstl_algorithm.h:84
Definition bslmf_movableref.h:795