8#ifndef INCLUDED_BDLCC_MULTIPRIORITYQUEUE
9#define INCLUDED_BDLCC_MULTIPRIORITYQUEUE
444#include <bdlscm_version.h>
469#include <bsl_climits.h>
470#include <bsl_cstdint.h>
472#include <bsl_vector.h>
474#ifndef BDE_DONT_ALLOW_TRANSITIVE_INCLUDES
575 k_BITS_PER_INT =
sizeof(int) * CHAR_BIT,
576 k_DEFAULT_NUM_PRIORITIES = k_BITS_PER_INT,
577 k_MAX_NUM_PRIORITIES = k_BITS_PER_INT
640 int tryPopFrontImpl(TYPE *item,
int *itemPriority,
bool blockFlag);
795: d_item(item, basicAllocator)
804: d_item(
bslmf::MovableRefUtil::move(item), basicAllocator)
818 return d_item.object();
847 enum { e_SUCCESS = 0, e_FAILURE = -1 };
857 while (0 == d_length) {
865 d_notEmptyCondition.wait(&d_mutex);
873 (bsl::uint32_t)d_notEmptyFlags);
878 Node *& head = d_heads[priority];
883 head = head->nextPtr();
888 d_notEmptyFlags &= ~(1 << priority);
895 *itemPriority = priority;
899 d_pool.deallocate(condemned);
907: d_heads((typename
NodePtrVector::size_type)k_DEFAULT_NUM_PRIORITIES, 0,
909, d_tails((typename
NodePtrVector::size_type)k_DEFAULT_NUM_PRIORITIES, 0,
912, d_pool(sizeof(Node),
bslma::Default::allocator(basicAllocator))
915, d_allocator_p(
bslma::Default::allocator(basicAllocator))
922: d_heads((typename
NodePtrVector::size_type)numPriorities, 0, basicAllocator)
923, d_tails((typename
NodePtrVector::size_type)numPriorities, 0, basicAllocator)
925, d_pool(sizeof(Node),
bslma::Default::allocator(basicAllocator))
928, d_allocator_p(
bslma::Default::allocator(basicAllocator))
942 for (it = d_heads.begin(), endIt = d_heads.end(); endIt != it; ++it) {
957 tryPopFrontImpl(item, itemPriority,
true);
963 enum { e_SUCCESS = 0, e_FAILURE = -1 };
965 BSLS_ASSERT((
unsigned)itemPriority < d_heads.size());
975 Node *newNode = (Node *)d_pool.allocate();
979 ::new (newNode) Node(item, d_allocator_p);
986 if (!d_enabledFlag) {
992 const int mask = 1 << itemPriority;
993 if (d_notEmptyFlags & mask) {
994 d_tails[itemPriority]->nextPtr() = newNode;
997 d_heads[itemPriority] = newNode;
998 d_notEmptyFlags |= mask;
1000 d_tails[itemPriority] = newNode;
1005 d_notEmptyCondition.signal();
1010template <
class TYPE>
1014 enum { e_SUCCESS = 0, e_FAILURE = -1 };
1016 BSLS_ASSERT((
unsigned)itemPriority < d_heads.size());
1026 Node *newNode =
static_cast<Node *
>(d_pool.allocate());
1036 if (!d_enabledFlag) {
1044 const int mask = 1 << itemPriority;
1045 if (d_notEmptyFlags & mask) {
1046 d_tails[itemPriority]->nextPtr() = newNode;
1049 d_heads[itemPriority] = newNode;
1050 d_notEmptyFlags |= mask;
1052 d_tails[itemPriority] = newNode;
1057 d_notEmptyCondition.signal();
1062template <
class TYPE>
1067 BSLS_ASSERT((
unsigned)itemPriority < d_heads.size());
1069 const int mask = 1 << itemPriority;
1074 for (
int ii = 0; ii < numItems; ++ii) {
1075 Node *newNode = (Node *)d_pool.allocate();
1079 ::new (newNode) Node(item, d_allocator_p);
1082 if (d_notEmptyFlags & mask) {
1083 d_tails[itemPriority]->nextPtr() = newNode;
1086 d_heads[itemPriority] = newNode;
1087 d_notEmptyFlags |= mask;
1089 d_tails[itemPriority] = newNode;
1095 for (
int ii = 0; ii < numItems; ++ii) {
1096 d_notEmptyCondition.signal();
1100template <
class TYPE>
1105 BSLS_ASSERT((
unsigned)itemPriority < d_heads.size());
1107 const int mask = 1 << itemPriority;
1112 for (
int ii = 0; ii < numItems; ++ii) {
1113 Node *newNode = (Node *)d_pool.allocate();
1117 ::new (newNode) Node(item, d_allocator_p);
1120 Node *& head = d_heads[itemPriority];
1122 d_tails[itemPriority] = newNode;
1123 d_notEmptyFlags |= mask;
1125 newNode->nextPtr() = head;
1132 for (
int ii = 0; ii < numItems; ++ii) {
1133 d_notEmptyCondition.signal();
1137template <
class TYPE>
1141 return tryPopFrontImpl(item, itemPriority,
false);
1144template <
class TYPE>
1147 Node *condemnedList = 0;
1152 while (d_notEmptyFlags) {
1154 static_cast<bsl::uint32_t
>(d_notEmptyFlags));
1156 Node *& head = d_heads[priority];
1159 d_tails[priority]->nextPtr() = condemnedList;
1160 condemnedList = head;
1164 d_notEmptyFlags &= ~(1 << priority);
1172 Node *node = condemnedList;
1174 Node *condemnedNode = node;
1175 node = node->nextPtr();
1177 condemnedNode->~Node();
1178 d_pool.deallocate(condemnedNode);
1182template <
class TYPE>
1188 d_enabledFlag =
true;
1191template <
class TYPE>
1197 d_enabledFlag =
false;
1201template <
class TYPE>
1205 return static_cast<int>(d_heads.size());
1208template <
class TYPE>
1215template <
class TYPE>
1219 return 0 == d_length;
1222template <
class TYPE>
1226 return d_enabledFlag;
Definition bdlcc_multipriorityqueue.h:491
MultipriorityQueue_Node *& nextPtr()
Definition bdlcc_multipriorityqueue.h:823
~MultipriorityQueue_Node()
Definition bdlcc_multipriorityqueue.h:810
BSLMF_NESTED_TRAIT_DECLARATION(MultipriorityQueue_Node, bslma::UsesBslmaAllocator)
TYPE & item()
Return a reference to the non-modifiable item stored in this node.
Definition bdlcc_multipriorityqueue.h:816
Definition bdlcc_multipriorityqueue.h:571
void pushBackMultipleRaw(const TYPE &item, int itemPriority, int numItems)
Definition bdlcc_multipriorityqueue.h:1063
int pushBack(bslmf::MovableRef< TYPE > item, int itemPriority)
Definition bdlcc_multipriorityqueue.h:1011
int pushBack(const TYPE &item, int itemPriority)
Definition bdlcc_multipriorityqueue.h:961
void enable()
Definition bdlcc_multipriorityqueue.h:1184
void disable()
Definition bdlcc_multipriorityqueue.h:1193
MultipriorityQueue(int numPriorities, bslma::Allocator *basicAllocator=0)
Definition bdlcc_multipriorityqueue.h:920
void popFront(TYPE *item, int *itemPriority=0)
Definition bdlcc_multipriorityqueue.h:955
void pushFrontMultipleRaw(const TYPE &item, int itemPriority, int numItems)
Definition bdlcc_multipriorityqueue.h:1101
bool isEmpty() const
Definition bdlcc_multipriorityqueue.h:1217
int length() const
Return the total number of items in this multi-priority queue.
Definition bdlcc_multipriorityqueue.h:1210
int tryPopFront(TYPE *item, int *itemPriority=0)
Definition bdlcc_multipriorityqueue.h:1139
void removeAll()
Remove and destroy all items from this multi-priority queue.
Definition bdlcc_multipriorityqueue.h:1145
int numPriorities() const
Definition bdlcc_multipriorityqueue.h:1203
bool isEnabled() const
Definition bdlcc_multipriorityqueue.h:1224
BSLMF_NESTED_TRAIT_DECLARATION(MultipriorityQueue, bslma::UsesBslmaAllocator)
MultipriorityQueue(bslma::Allocator *basicAllocator=0)
Definition bdlcc_multipriorityqueue.h:906
~MultipriorityQueue()
Definition bdlcc_multipriorityqueue.h:935
Definition bdlma_concurrentpool.h:332
Definition bslstl_vector.h:1120
Node * * iterator
Definition bslstl_vector.h:1152
Definition bslalg_constructorproxy.h:376
Definition bslma_allocator.h:545
Definition bslma_deallocatorproctor.h:312
void release()
Definition bslma_deallocatorproctor.h:389
Definition bslma_managedptr.h:1173
ManagedPtr_PairProxy< TARGET_TYPE, ManagedPtrDeleter > release()
Definition bslma_managedptr.h:2490
Definition bslmf_movableref.h:752
Definition bslmt_condition.h:220
Definition bslmt_lockguard.h:234
Definition bslmt_mutex.h:317
Definition bsls_atomic.h:744
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
Definition bdlcc_boundedqueue.h:270
Definition baljsn_encoder_testtypes.h:76
Definition bdlbb_blob.h:579
static int numTrailingUnsetBits(unsigned int value)
Definition bdlb_bitutil.h:456
Definition bslma_usesbslmaallocator.h:344
static MovableRef< t_TYPE > move(t_TYPE &reference) BSLS_KEYWORD_NOEXCEPT
Definition bslmf_movableref.h:1067