8#ifndef INCLUDED_BDLCC_SKIPLIST
9#define INCLUDED_BDLCC_SKIPLIST
424#include <bdlscm_version.h>
453#include <bsl_algorithm.h>
454#include <bsl_functional.h>
455#include <bsl_ostream.h>
456#include <bsl_vector.h>
463template <
class KEY,
class DATA>
474template<
class KEY,
class DATA>
551class SkipList_PoolManager;
601template<
class KEY,
class DATA>
605 typedef SkipList_PoolManager PoolManager;
612 PoolManager *d_poolManager_p;
646 void construct(
const KEY& key,
const DATA& data);
661template <
class KEY,
class DATA>
684 const KEY&
key()
const;
697template <
class KEY,
class DATA>
774 void data(DATA *value)
const;
780 const KEY&
key()
const;
786 void key(KEY *value)
const;
803template<
class KEY,
class DATA>
814#ifndef BDE_OMIT_INTERNAL_DEPRECATED
832 typedef SkipList_PoolManager PoolManager;
844 template <
class VECTOR,
class VALUE_TYPE>
851 k_MAX_NUM_LEVELS = 32,
868 PoolManager *d_poolManager_p;
875 template <
class KEY2,
class DATA2>
878 template <
class KEY2,
class DATA2>
886 static DATA& data(
const Pair *reference);
890 static const KEY& key(
const Pair *reference);
899 static Node *pairToNode(
Pair *reference);
902 static Node *pairToNode(
const Pair *reference);
910 void addNode(
bool *newFrontFlag,
Node *newNode);
918 void addNodeImpR(
bool *newFrontFlag,
Node *newNode,
bool lock);
932 void addNodeR(
bool *newFrontFlag,
Node *newNode);
940 int addNodeUnique(
bool *newFrontFlag,
Node *newNode);
950 int addNodeUniqueR(
bool *newFrontFlag,
Node *newNode);
960 Node *allocateNode(
int level,
const KEY& key,
const DATA& data);
972 void insertImp(
bool *newFrontFlag,
Node *location[],
Node *node);
984 void moveImp(
bool *newFrontFlag,
Node *location[],
Node *node);
995 void releaseNode(
Node *node);
1007 template <
class VECTOR>
1008 int removeAllMaybeUnlock(VECTOR *removed,
bool unlock);
1020 template <
class VECTOR>
1021 int removeAllImp(VECTOR *removed);
1026 int removeNode(
Node *node);
1039 int updateNode(
bool *newFrontFlag,
1042 bool allowDuplicates);
1056 int updateNodeR(
bool *newFrontFlag,
1059 bool allowDuplicates);
1065 Node *backNode()
const;
1070 void checkInvariants()
const;
1074 Node *findNode(
const KEY& key)
const;
1078 Node *findNodeR(
const KEY& key)
const;
1084 Node *findNodeLowerBound(
const KEY& key)
const;
1090 Node *findNodeLowerBoundR(
const KEY& key)
const;
1096 Node *findNodeUpperBound(
const KEY& key)
const;
1102 Node *findNodeUpperBoundR(
const KEY& key)
const;
1106 Node *frontNode()
const;
1114 void lookupImpLowerBound(
Node *location[],
const KEY& key)
const;
1122 void lookupImpLowerBoundR(
Node *location[],
const KEY& key)
const;
1130 void lookupImpUpperBound(
Node *location[],
const KEY& key)
const;
1138 void lookupImpUpperBoundR(
Node *location[],
const KEY& key)
const;
1153 int skipBackward(
Node **node)
const;
1160 int skipForward(
Node **node)
const;
1214 void add(
const KEY& key,
const DATA& data,
bool *newFrontFlag = 0);
1223 bool *newFrontFlag = 0);
1240 bool *newFrontFlag = 0);
1259 bool *newFrontFlag = 0);
1270 bool *newFrontFlag = 0);
1277 int addUnique(
const KEY& key,
const DATA& data,
bool *newFrontFlag = 0);
1288 bool *newFrontFlag = 0);
1301 bool *newFrontFlag = 0);
1322 bool *newFrontFlag = 0);
1342 bool *newFrontFlag = 0);
1349 void addR(
const KEY& key,
const DATA& data,
bool *newFrontFlag = 0);
1360 bool *newFrontFlag = 0);
1372 bool *newFrontFlag = 0);
1381 int addUniqueR(
const KEY& key,
const DATA& data,
bool *newFrontFlag = 0);
1394 bool *newFrontFlag = 0);
1408 bool *newFrontFlag = 0);
1440#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_PMR
1441 int removeAll(std::pmr::vector<PairHandle> *removed);
1452#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_PMR
1468 bool *newFrontFlag = 0,
1469 bool allowDuplicates =
true);
1482 bool *newFrontFlag = 0,
1483 bool allowDuplicates =
true);
1532 void key(KEY *value,
const Pair *reference)
const;
1546 bsl::ostream&
print(bsl::ostream& stream,
1548 int spacesPerLevel = 4)
const;
1735template <
class KEY,
class DATA>
1745template <
class KEY,
class DATA>
1751template<
class KEY,
class DATA>
1761template <
class KEY,
class DATA>
1762template <
class VECTOR,
class VALUE_TYPE>
1763class SkipList<KEY, DATA>::IsVector {
1767 static const bool value =
1769#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_PMR
1779template <
class KEY,
class DATA>
1790 Pair *operator()(Node *node)
const;
1797template <
class KEY,
class DATA>
1826: d_firstGuard(
bsl::min(lock1, lock2,
bsl::less<
bslmt::Mutex *>()))
1827, d_lastGuard(
bsl::max(lock1, lock2,
bsl::less<
bslmt::Mutex *>()))
1835template <
class KEY,
class DATA>
1842template <
class KEY,
class DATA>
1854template <
class KEY,
class DATA>
1862template <
class KEY,
class DATA>
1868, d_node_p(reference)
1872template <
class KEY,
class DATA>
1876: d_list_p(original.d_list_p)
1877, d_node_p(original.d_node_p
1878 ? d_list_p->addPairReferenceRaw(original.d_node_p)
1883template <
class KEY,
class DATA>
1891template <
class KEY,
class DATA>
1896 reset(rhs.d_list_p, 0);
1897 d_node_p = rhs.d_node_p ? d_list_p->addPairReferenceRaw(rhs.d_node_p) : 0;
1901template <
class KEY,
class DATA>
1908 d_list_p->releaseReferenceRaw(d_node_p);
1913template <
class KEY,
class DATA>
1923 *reference = d_node_p;
1927template <
class KEY,
class DATA>
1934 d_node_p = reference;
1938template <
class KEY,
class DATA>
1947template <
class KEY,
class DATA>
1953 d_list_p->data(value, d_node_p);
1956template <
class KEY,
class DATA>
1960 return d_node_p != 0 && d_list_p != 0;
1963template <
class KEY,
class DATA>
1972template <
class KEY,
class DATA>
1978 d_list_p->key(value, d_node_p);
1986template <
class KEY,
class DATA>
2000template<
class KEY,
class DATA>
2003 PoolManager *poolManager,
2007, d_poolManager_p(poolManager)
2009, d_allocator_p(
bslma::Default::allocator(basicAllocator))
2013template<
class KEY,
class DATA>
2019 d_node_p->d_key.~KEY();
2021 PoolUtil::deallocate(d_poolManager_p, d_node_p);
2025template<
class KEY,
class DATA>
2051template<
class KEY,
class DATA>
2057template<
class KEY,
class DATA>
2062 return reinterpret_cast<Pair *
>(node);
2070template<
class KEY,
class DATA>
2077template<
class KEY,
class DATA>
2090template<
class KEY,
class DATA>
2096 Node *node =
static_cast<Node *
>(
static_cast<void *
>(
2097 const_cast<Pair *
>(reference)));
2101template<
class KEY,
class DATA>
2107 const Node *node =
static_cast<const Node *
>(
2108 static_cast<const void *
>(reference));
2112template<
class KEY,
class DATA>
2124 return reinterpret_cast<IntPtr
>(&
reinterpret_cast<Node*
>(0)->d_ptrs);
2127template<
class KEY,
class DATA>
2129typename SkipList<KEY, DATA>::Node
2130 *SkipList<KEY, DATA>::pairToNode(
Pair *reference)
2132 return static_cast<Node *
>(
static_cast<void *
>(reference));
2135template<
class KEY,
class DATA>
2137typename SkipList<KEY, DATA>::Node
2138 *SkipList<KEY, DATA>::pairToNode(
const Pair *reference)
2140 return static_cast<Node *
>(
static_cast<void *
>(
2141 const_cast<Pair *
>(reference)));
2146template<
class KEY,
class DATA>
2147void SkipList<KEY, DATA>::addNode(
bool *newFrontFlag, Node *newNode)
2149 LockGuard guard(&d_lock);
2154 Node *location[k_MAX_NUM_LEVELS];
2155 lookupImpLowerBound(location, newNode->d_key);
2157 insertImp(newFrontFlag, location, newNode);
2160template<
class KEY,
class DATA>
2161void SkipList<KEY, DATA>::addNodeImpR(
bool *newFrontFlag,
2165 LockGuard lockGuard(&d_lock, !lock);
2167 lockGuard.release();
2173 Node *location[k_MAX_NUM_LEVELS];
2174 lookupImpUpperBoundR(location, newNode->d_key);
2176 insertImp(newFrontFlag, location, newNode);
2179template<
class KEY,
class DATA>
2181void SkipList<KEY, DATA>::addNodeR(
bool *newFrontFlag, Node *newNode)
2183 addNodeImpR(newFrontFlag, newNode,
true);
2186template<
class KEY,
class DATA>
2187int SkipList<KEY, DATA>::addNodeUnique(
bool *newFrontFlag, Node *newNode)
2189 LockGuard guard(&d_lock);
2194 Node *location[k_MAX_NUM_LEVELS];
2195 lookupImpLowerBound(location, newNode->d_key);
2197 Node *q = location[0];
2198 if (q != d_tail_p && q->d_key == newNode->d_key) {
2202 insertImp(newFrontFlag, location, newNode);
2207template<
class KEY,
class DATA>
2208int SkipList<KEY, DATA>::addNodeUniqueR(
bool *newFrontFlag, Node *newNode)
2210 LockGuard guard(&d_lock);
2215 Node *location[k_MAX_NUM_LEVELS];
2216 lookupImpLowerBoundR(location, newNode->d_key);
2218 Node *q = location[0];
2219 if (q != d_tail_p && q->d_key == newNode->d_key) {
2223 insertImp(newFrontFlag, location, newNode);
2228template<
class KEY,
class DATA>
2229SkipList_Node<KEY, DATA> *
2230SkipList<KEY, DATA>::allocateNode(
int level,
const KEY& key,
const DATA& data)
2232 int listLevel = d_listLevel;
2233 if (
level > listLevel) {
2234 level = listLevel + 1;
2240 NodeGuard nodeGuard(d_poolManager_p, node, d_allocator_p);
2242 nodeGuard.construct(key, data);
2245 node->d_ptrs[0].d_next_p = 0;
2250template<
class KEY,
class DATA>
2251void SkipList<KEY, DATA>::initialize()
2261 int nodeSizes[k_MAX_NUM_LEVELS];
2263 const IntPtr offset = offsetOfPtrs();
2264 for (
int i = 0; i < k_MAX_NUM_LEVELS; ++i) {
2265 IntPtr nodeSize = offset + (i + 1) *
sizeof(
typename Node::Ptrs);
2266 nodeSize = (nodeSize + alignMask) & ~alignMask;
2267 nodeSizes[i] =
static_cast<int>(nodeSize);
2279 for (
int i = 0; i < k_MAX_NUM_LEVELS; ++i) {
2288template<
class KEY,
class DATA>
2289void SkipList<KEY, DATA>::insertImp(
bool *newFrontFlag,
2296 int level = node->d_level;
2297 if (
level > d_listLevel) {
2300 d_listLevel =
level;
2302 node->d_ptrs[
level].d_prev_p = d_head_p;
2311 for (
int k =
level; k >= 0; --k) {
2312 Node *p = location[k]->d_ptrs[k].d_prev_p;
2313 Node *q = location[k];
2315 node->d_ptrs[k].d_prev_p = p;
2316 node->d_ptrs[k].d_next_p = q;
2318 p->d_ptrs[k].d_next_p = node;
2319 q->d_ptrs[k].d_prev_p = node;
2323 *newFrontFlag = (node->d_ptrs[0].d_prev_p == d_head_p);
2329template<
class KEY,
class DATA>
2330void SkipList<KEY, DATA>::moveImp(
bool *newFrontFlag,
2337 int level = node->d_level;
2340 for (
int k = 0; k <=
level; ++k) {
2341 Node *newP = location[k]->d_ptrs[k].d_prev_p;
2342 Node *newQ = location[k];
2344 if (newP == node || newQ == node) {
2351 Node *oldP = node->d_ptrs[k].d_prev_p;
2352 Node *oldQ = node->d_ptrs[k].d_next_p;
2354 oldQ->d_ptrs[k].d_prev_p = oldP;
2355 oldP->d_ptrs[k].d_next_p = oldQ;
2357 node->d_ptrs[k].d_prev_p = newP;
2358 node->d_ptrs[k].d_next_p = newQ;
2360 newP->d_ptrs[k].d_next_p = node;
2361 newQ->d_ptrs[k].d_prev_p = node;
2365 *newFrontFlag = (node->d_ptrs[0].d_prev_p == d_head_p);
2369template<
class KEY,
class DATA>
2370SkipList_Node<KEY, DATA> *SkipList<KEY, DATA>::popFrontImp()
2372 LockGuard guard(&d_lock);
2375 if (node == d_tail_p) {
2381 for (
int k =
level; k >= 0; --k) {
2382 Node *q = node->d_ptrs[k].d_next_p;
2383 q->d_ptrs[k].d_prev_p = d_head_p;
2393template<
class KEY,
class DATA>
2395void SkipList<KEY, DATA>::releaseNode(Node *node)
2399 const int refCnt = --node->d_refCount;
2402 node->d_data.~DATA();
2413template<
class KEY,
class DATA>
2414template<
class VECTOR>
2415int SkipList<KEY, DATA>::removeAllMaybeUnlock(VECTOR *removed,
bool unlock)
2417 typedef typename VECTOR::value_type ValueType;
2426 PairHandleFactory>::type FactoryType;
2430 Node *
const begin = d_head_p;
2432 int numRemoved = d_length;
2434 for (
int ii = 0; ii <= d_listLevel; ++ii) {
2440 for (Node *q = end;
begin != q; q = q->d_ptrs[0].d_prev_p) {
2441 q->d_ptrs[0].d_next_p = 0;
2450 const FactoryType factory(
this);
2456 removed->resize(oldSize + numRemoved);
2457 typename VECTOR::reverse_iterator removedIt = removed->rbegin();
2458 for (Node *q = end;
begin != q; q = q->d_ptrs[0].d_prev_p) {
2459 *removedIt++ = factory(q);
2461 BSLS_ASSERT(oldSize == removed->rend() - removedIt);
2464 for (Node *q = end;
begin != q; ) {
2465 Node *condemned = q;
2466 q = q->d_ptrs[0].d_prev_p;
2468 releaseNode(condemned);
2475template<
class KEY,
class DATA>
2476template<
class VECTOR>
2477int SkipList<KEY, DATA>::removeAllImp(VECTOR *removed)
2480 return removeAllMaybeUnlock(removed,
true);
2483template<
class KEY,
class DATA>
2484int SkipList<KEY, DATA>::removeNode(Node *node)
2488 LockGuard guard(&d_lock);
2490 if (0 == node->d_ptrs[0].d_next_p) {
2494 int level = node->d_level;
2496 for (
int k =
level; k >= 0; --k) {
2497 Node *p = node->d_ptrs[k].d_prev_p;
2498 Node *q = node->d_ptrs[k].d_next_p;
2500 q->d_ptrs[k].d_prev_p = p;
2501 p->d_ptrs[k].d_next_p = q;
2504 node->d_ptrs[0].d_next_p = 0;
2509template<
class KEY,
class DATA>
2510int SkipList<KEY, DATA>::updateNode(
bool *newFrontFlag,
2513 bool allowDuplicates)
2517 LockGuard guard(&d_lock);
2519 if (0 == node->d_ptrs[0].d_next_p) {
2523 Node *location[k_MAX_NUM_LEVELS];
2524 lookupImpLowerBound(location, newKey);
2526 if (!allowDuplicates) {
2527 Node *q = location[0];
2528 if (q != d_tail_p && q != node && q->d_key == newKey) {
2533 node->d_key = newKey;
2537 moveImp(newFrontFlag, location, node);
2542template<
class KEY,
class DATA>
2543int SkipList<KEY, DATA>::updateNodeR(
bool *newFrontFlag,
2546 bool allowDuplicates)
2550 LockGuard guard(&d_lock);
2552 if (0 == node->d_ptrs[0].d_next_p) {
2556 Node *location[k_MAX_NUM_LEVELS];
2558 if (!allowDuplicates) {
2559 lookupImpLowerBoundR(location, newKey);
2560 Node *p = location[0];
2561 if (p != d_tail_p && p != node && p->d_key == newKey) {
2566 lookupImpUpperBoundR(location, newKey);
2569 node->d_key = newKey;
2573 moveImp(newFrontFlag, location, node);
2579template<
class KEY,
class DATA>
2580SkipList_Node<KEY, DATA> *
2581SkipList<KEY, DATA>::backNode()
const
2583 LockGuard guard(&d_lock);
2586 if (node == d_head_p) {
2594template<
class KEY,
class DATA>
2595void SkipList<KEY, DATA>::checkInvariants()
const
2597 for (
int ii = 0; ii <= d_listLevel; ++ii) {
2599 Node *prev = d_head_p;
2610 for (
int jj = ii - 1; 0 <= jj; --jj) {
2616 BSLS_ASSERT(numNodes <= d_length); (void)numNodes;
2624template<
class KEY,
class DATA>
2625SkipList_Node<KEY, DATA> *SkipList<KEY, DATA>::findNode(
const KEY& key)
const
2627 Node *locator[k_MAX_NUM_LEVELS];
2629 LockGuard guard(&d_lock);
2630 lookupImpLowerBound(locator, key);
2632 Node *q = locator[0];
2633 if (q != d_tail_p && q->d_key == key) {
2641template<
class KEY,
class DATA>
2642SkipList_Node<KEY, DATA> *SkipList<KEY, DATA>::findNodeR(
const KEY& key)
const
2644 Node *locator[k_MAX_NUM_LEVELS];
2646 LockGuard guard(&d_lock);
2647 lookupImpUpperBoundR(locator, key);
2649 Node *p = locator[0];
2650 if (d_head_p != p) {
2651 p = p->d_ptrs[0].d_prev_p;
2652 if (d_head_p != p && key == p->d_key) {
2661template<
class KEY,
class DATA>
2662SkipList_Node<KEY, DATA> *SkipList<KEY, DATA>::findNodeLowerBound(
2663 const KEY& key)
const
2665 Node *locator[k_MAX_NUM_LEVELS];
2667 LockGuard guard(&d_lock);
2668 lookupImpLowerBound(locator, key);
2670 Node *q = locator[0];
2671 if (q != d_tail_p) {
2679template<
class KEY,
class DATA>
2680SkipList_Node<KEY, DATA> *SkipList<KEY, DATA>::findNodeUpperBound(
2681 const KEY& key)
const
2683 Node *locator[k_MAX_NUM_LEVELS];
2685 LockGuard guard(&d_lock);
2686 lookupImpUpperBound(locator, key);
2688 Node *q = locator[0];
2689 if (q != d_tail_p) {
2697template<
class KEY,
class DATA>
2698SkipList_Node<KEY, DATA> *SkipList<KEY, DATA>::findNodeLowerBoundR(
2699 const KEY& key)
const
2701 Node *locator[k_MAX_NUM_LEVELS];
2703 LockGuard guard(&d_lock);
2704 lookupImpLowerBoundR(locator, key);
2706 Node *q = locator[0];
2707 if (q != d_tail_p) {
2715template<
class KEY,
class DATA>
2716SkipList_Node<KEY, DATA> *SkipList<KEY, DATA>::findNodeUpperBoundR(
2717 const KEY& key)
const
2719 Node *locator[k_MAX_NUM_LEVELS];
2721 LockGuard guard(&d_lock);
2722 lookupImpUpperBoundR(locator, key);
2724 Node *q = locator[0];
2725 if (q != d_tail_p) {
2733template<
class KEY,
class DATA>
2734SkipList_Node<KEY, DATA> *SkipList<KEY, DATA>::frontNode()
const
2736 LockGuard guard(&d_lock);
2739 if (node == d_tail_p) {
2747template<
class KEY,
class DATA>
2748void SkipList<KEY, DATA>::lookupImpLowerBound(Node *location[],
2749 const KEY& key)
const
2752 for (
int k = d_listLevel; k >= 0; --k) {
2753 Node *q = p->d_ptrs[k].d_next_p;
2754 while (q != d_tail_p && q->d_key < key) {
2756 q = p->d_ptrs[k].d_next_p;
2764template<
class KEY,
class DATA>
2765void SkipList<KEY, DATA>::lookupImpLowerBoundR(Node *location[],
2766 const KEY& key)
const
2769 for (
int k = d_listLevel; k >= 0; --k) {
2770 Node *p = q->d_ptrs[k].d_prev_p;
2771 while (p != d_head_p && !(p->d_key < key)) {
2773 p = p->d_ptrs[k].d_prev_p;
2781template<
class KEY,
class DATA>
2782void SkipList<KEY, DATA>::lookupImpUpperBound(Node *location[],
2783 const KEY& key)
const
2786 for (
int k = d_listLevel; k >= 0; --k) {
2787 Node *q = p->d_ptrs[k].d_next_p;
2788 while (q != d_tail_p && !(key < q->d_key)) {
2790 q = p->d_ptrs[k].d_next_p;
2799template<
class KEY,
class DATA>
2800void SkipList<KEY, DATA>::lookupImpUpperBoundR(Node *location[],
2801 const KEY& key)
const
2804 for (
int k = d_listLevel; k >= 0; --k) {
2805 Node *p = q->d_ptrs[k].d_prev_p;
2806 while (p != d_head_p && key < p->d_key) {
2808 p = q->d_ptrs[k].d_prev_p;
2816template<
class KEY,
class DATA>
2817SkipList_Node<KEY, DATA> *
2818SkipList<KEY, DATA>::nextNode(Node *node)
const
2823 LockGuard guard(&d_lock);
2825 Node *
next = node->d_ptrs[0].d_next_p;
2826 if (0 ==
next || d_tail_p ==
next) {
2834template<
class KEY,
class DATA>
2835SkipList_Node<KEY, DATA> *
2836SkipList<KEY, DATA>::prevNode(Node *node)
const
2841 LockGuard guard(&d_lock);
2842 if (0 == node->d_ptrs[0].d_next_p) {
2846 Node *prev = node->d_ptrs[0].d_prev_p;
2847 if (d_head_p == prev) {
2855template<
class KEY,
class DATA>
2856int SkipList<KEY, DATA>::skipBackward(Node **node)
const
2860 Node *current = *node;
2865 LockGuard guard(&d_lock);
2867 if (0 == current->d_ptrs[0].d_next_p) {
2873 const int count = --current->d_refCount;
2877 Node *prev = current->d_ptrs[0].d_prev_p;
2878 if (d_head_p == prev) {
2888template<
class KEY,
class DATA>
2889int SkipList<KEY, DATA>::skipForward(Node **node)
const
2893 Node *current = *node;
2898 LockGuard guard(&d_lock);
2900 if (0 == current->d_ptrs[0].d_next_p) {
2906 const int count = --current->d_refCount;
2910 Node *
next = current->d_ptrs[0].d_next_p;
2911 if (d_tail_p ==
next) {
2922template<
class KEY,
class DATA>
2928 Node *node = pairToNode(reference);
2933template<
class KEY,
class DATA>
2943template<
class KEY,
class DATA>
2949, d_allocator_p(
bslma::Default::allocator(basicAllocator))
2956template<
class KEY,
class DATA>
2959#if defined(BSLS_ASSERT_SAFE_IS_ACTIVE)
2966 Node *condemned = p;
2970 releaseNode(condemned);
2973 PoolUtil::deallocate(d_poolManager_p, d_head_p);
2974 PoolUtil::deallocate(d_poolManager_p, d_tail_p);
2976 PoolUtil::deletePoolManager(d_allocator_p, d_poolManager_p);
2980template<
class KEY,
class DATA>
2999 rhsElements.
reserve(rhs.d_length);
3000 for (
Node *node = rhs.d_head_p->d_ptrs[0].d_next_p;
3001 node && node != rhs.d_tail_p;
3002 node = node->d_ptrs[0].d_next_p)
3008 reinterpret_cast<Pair *
>(node));
3015 it != rhsElements.
end(); ++it) {
3016 Node *node = allocateNode(d_rand.randomLevel(),
3017 it->key(), it->data());
3018 addNodeImpR(0, node,
false);
3024template<
class KEY,
class DATA>
3028 Node *node = pairToNode(reference);
3034template<
class KEY,
class DATA>
3042 addRaw(&handle, key, data, newFrontFlag);
3043 result->reset(
this, handle);
3046template<
class KEY,
class DATA>
3052 Pair **zeroPair = 0;
3053 addRaw(zeroPair, key, data, newFrontFlag);
3056template<
class KEY,
class DATA>
3064 Node *node = allocateNode(level, key, data);
3067 *result =
reinterpret_cast<Pair *
>(node);
3070 addNode(newFrontFlag, node);
3073template<
class KEY,
class DATA>
3080 Node *node = allocateNode(level, key, data);
3083 *result =
reinterpret_cast<Pair *
>(node);
3086 int ret = addNodeUnique(newFrontFlag, node);
3099template<
class KEY,
class DATA>
3106 addAtLevelRaw(result, d_rand.randomLevel(), key, data, newFrontFlag);
3109template<
class KEY,
class DATA>
3117 int rc = addUniqueRaw(&handle, key, data, newFrontFlag);
3121 result->reset(
this, handle);
3125template<
class KEY,
class DATA>
3132 Pair **zeroPair = 0;
3133 return addUniqueRaw(zeroPair, key, data, newFrontFlag);
3136template<
class KEY,
class DATA>
3143 return addAtLevelUniqueRaw(result, d_rand.randomLevel(), key, data,
3149template<
class KEY,
class DATA>
3157 Node *node = allocateNode(level, key, data);
3160 *result =
reinterpret_cast<Pair *
>(node);
3163 addNodeR(newFrontFlag, node);
3166template<
class KEY,
class DATA>
3173 Node *node = allocateNode(level, key, data);
3176 *result =
reinterpret_cast<Pair *
>(node);
3179 int ret = addNodeUniqueR(newFrontFlag, node);
3192template<
class KEY,
class DATA>
3200 addRawR(&handle, key, data, newFrontFlag);
3201 result->reset(
this, handle);
3204template<
class KEY,
class DATA>
3210 Pair **zeroPair = 0;
3211 addRawR(zeroPair, key, data, newFrontFlag);
3214template<
class KEY,
class DATA>
3221 addAtLevelRawR(result, d_rand.randomLevel(), key, data, newFrontFlag);
3224template<
class KEY,
class DATA>
3231 int rc = addUniqueRawR(&handle, key, data, newFrontFlag);
3235 result->reset(
this, handle);
3240template<
class KEY,
class DATA>
3246 Pair **zeroPair = 0;
3247 return addUniqueRawR(zeroPair, key, data, newFrontFlag);
3250template<
class KEY,
class DATA>
3257 return addAtLevelUniqueRawR(result, d_rand.randomLevel(), key, data,
3263template<
class KEY,
class DATA>
3267 Node *node = popFrontImp();
3273 item->reset(
this,
reinterpret_cast<Pair *
>(node));
3282template<
class KEY,
class DATA>
3286 Node *node = popFrontImp();
3292 *item =
reinterpret_cast<Pair *
>(node);
3301template<
class KEY,
class DATA>
3305 if (0 == reference) {
3309 Node *node = pairToNode(reference);
3311 int ret = removeNode(node);
3320template<
class KEY,
class DATA>
3327template<
class KEY,
class DATA>
3331 return removeAllImp(removed);
3334template<
class KEY,
class DATA>
3338 return removeAllImp(removed);
3341#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_PMR
3342template<
class KEY,
class DATA>
3346 return removeAllImp(removed);
3350template<
class KEY,
class DATA>
3354 return removeAllImp(removed);
3357template<
class KEY,
class DATA>
3361 return removeAllImp(removed);
3364#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_PMR
3365template<
class KEY,
class DATA>
3369 return removeAllImp(removed);
3375template<
class KEY,
class DATA>
3380 bool allowDuplicates)
3382 if (0 == reference) {
3386 Node *node = pairToNode(reference);
3387 return updateNode(newFrontFlag, node, newKey, allowDuplicates);
3390template<
class KEY,
class DATA>
3395 bool allowDuplicates)
3397 if (0 == reference) {
3401 Node *node = pairToNode(reference);
3402 return updateNodeR(newFrontFlag, node, newKey, allowDuplicates);
3406template<
class KEY,
class DATA>
3411 Node *node = pairToNode(reference);
3413 return const_cast<Pair *
>(reference);
3416template<
class KEY,
class DATA>
3420 Pair *backPtr =
reinterpret_cast<Pair *
>(backNode());
3422 back->reset(
this, backPtr);
3428template<
class KEY,
class DATA>
3432 *back =
reinterpret_cast<Pair *
>(backNode());
3433 return *back ? 0 : -1;
3436template<
class KEY,
class DATA>
3444 const Node *node =
static_cast<const Node *
>(
3445 static_cast<const void *
>(reference));
3449template<
class KEY,
class DATA>
3452 Node *locator[k_MAX_NUM_LEVELS];
3455 lookupImpLowerBound(locator, key);
3457 Node *q = locator[0];
3458 if (q != d_tail_p && q->
d_key == key) {
3465template<
class KEY,
class DATA>
3471 Pair *frontPtr =
reinterpret_cast<Pair *
>(frontNode());
3473 front->reset(
this, frontPtr);
3479template<
class KEY,
class DATA>
3485 *front =
reinterpret_cast<Pair *
>(frontNode());
3486 return *front ? 0 : -1;
3489template<
class KEY,
class DATA>
3495 return d_tail_p == d_head_p->d_ptrs[0].d_next_p;
3498template<
class KEY,
class DATA>
3506 const Node *node =
static_cast<const Node *
>(
3507 static_cast<const void *
>(reference));
3508 *value = node->
d_key;
3511template<
class KEY,
class DATA>
3520template<
class KEY,
class DATA>
3524 int spacesPerLevel)
const
3536 if (0 <= spacesPerLevel) {
3545 const int levelPlus1 = level + 1;
3548 node && node != d_tail_p;
3549 node = node->d_ptrs[0].d_next_p) {
3553 const int levelPlus2 = level + 2;
3555 stream <<
"level = " << node->d_level <<
"\n";
3583 node && node != d_tail_p;
3584 node = node->d_ptrs[0].d_next_p) {
3585 stream <<
"[ (level = " << node->d_level <<
") ";
3598 return stream << bsl::flush;
3603template<
class KEY,
class DATA>
3609 Pair *itemPtr =
reinterpret_cast<Pair *
>(findNode(key));
3611 item->reset(
this, itemPtr);
3617template<
class KEY,
class DATA>
3623 *item =
reinterpret_cast<Pair *
>(findNode(key));
3624 return *item ? 0 : -1;
3629template<
class KEY,
class DATA>
3635 Pair *itemPtr =
reinterpret_cast<Pair *
>(findNodeR(key));
3637 item->reset(
this, itemPtr);
3643template<
class KEY,
class DATA>
3649 *item =
reinterpret_cast<Pair *
>(findNodeR(key));
3650 return *item ? 0 : -1;
3655template<
class KEY,
class DATA>
3661 Pair *itemPtr =
reinterpret_cast<Pair *
>(findNodeLowerBound(key));
3663 item->reset(
this, itemPtr);
3669template<
class KEY,
class DATA>
3675 *item =
reinterpret_cast<Pair *
>(findNodeLowerBound(key));
3676 return *item ? 0 : -1;
3681template<
class KEY,
class DATA>
3684 const KEY& key)
const
3688 Pair *itemPtr =
reinterpret_cast<Pair *
>(findNodeLowerBoundR(key));
3690 item->reset(
this, itemPtr);
3696template<
class KEY,
class DATA>
3702 *item =
reinterpret_cast<Pair *
>(findNodeLowerBoundR(key));
3703 return *item ? 0 : -1;
3708template<
class KEY,
class DATA>
3711 const KEY& key)
const
3715 Pair *itemPtr =
reinterpret_cast<Pair *
>(findNodeUpperBound(key));
3717 item->reset(
this, itemPtr);
3723template<
class KEY,
class DATA>
3729 *item =
reinterpret_cast<Pair *
>(findNodeUpperBound(key));
3730 return *item ? 0 : -1;
3735template<
class KEY,
class DATA>
3738 const KEY& key)
const
3742 Pair *itemPtr =
reinterpret_cast<Pair *
>(findNodeUpperBoundR(key));
3744 item->reset(
this, itemPtr);
3750template<
class KEY,
class DATA>
3756 *item =
reinterpret_cast<Pair *
>(findNodeUpperBoundR(key));
3757 return *item ? 0 : -1;
3761template<
class KEY,
class DATA>
3765 if (0 == reference) {
3769 Node *node = pairToNode(reference);
3770 Node *nNode = nextNode(node);
3772 next->reset(
this,
reinterpret_cast<Pair *
>(nNode));
3778template<
class KEY,
class DATA>
3785 Node *node = pairToNode(reference);
3786 *next =
reinterpret_cast<Pair *
>(nextNode(node));
3788 return *next ? 0 : -1;
3791template<
class KEY,
class DATA>
3794 const Pair *reference)
const
3796 if (0 == reference) {
3800 Node *node = pairToNode(reference);
3801 Node *pNode = prevNode(node);
3803 prevPair->reset(
this,
reinterpret_cast<Pair *
>(pNode));
3809template<
class KEY,
class DATA>
3817 Node *node = pairToNode(reference);
3818 *prevPair =
reinterpret_cast<Pair *
>(prevNode(node));
3819 return *prevPair ? 0 : -1;
3822template<
class KEY,
class DATA>
3828 Node **node_p =
reinterpret_cast<Node **
>(&item->d_node_p);
3829 return skipBackward(node_p);
3832template<
class KEY,
class DATA>
3838 Node **node_p =
reinterpret_cast<Node **
>(item);
3839 return skipBackward(node_p);
3842template<
class KEY,
class DATA>
3848 Node **node_p =
reinterpret_cast<Node **
>(&item->d_node_p);
3849 return skipForward(node_p);
3852template<
class KEY,
class DATA>
3858 Node **node_p =
reinterpret_cast<Node **
>(item);
3859 return skipForward(node_p);
3864template<
class KEY,
class DATA>
3868 return d_allocator_p;
3874template<
class KEY,
class DATA>
3876 const SkipList<KEY, DATA>& rhs)
3888 for (SkipList_Node<KEY, DATA>
3889 *lhsNode =
lhs.d_head_p->d_ptrs[0].d_next_p,
3890 *rhsNode =
rhs.d_head_p->d_ptrs[0].d_next_p;
3892 lhsNode = lhsNode->d_ptrs[0].d_next_p,
3893 rhsNode = rhsNode->d_ptrs[0].d_next_p)
3895 if ((!lhsNode && !rhsNode)
3896 || (lhsNode ==
lhs.d_tail_p && rhsNode ==
rhs.d_tail_p)) {
3901 if (!lhsNode || !rhsNode
3902 || lhsNode ==
lhs.d_tail_p || rhsNode ==
rhs.d_tail_p) {
3908 if (!(lhsNode->d_key == rhsNode->d_key
3909 && lhsNode->d_data == rhsNode->d_data)) {
3919template<
class KEY,
class DATA>
3921 const SkipList<KEY, DATA>& rhs)
3933 for (SkipList_Node<KEY, DATA>
3934 *lhsNode =
lhs.d_head_p->d_ptrs[0].d_next_p,
3935 *rhsNode =
rhs.d_head_p->d_ptrs[0].d_next_p;
3937 lhsNode = lhsNode->d_ptrs[0].d_next_p,
3938 rhsNode = rhsNode->d_ptrs[0].d_next_p)
3940 if ((!lhsNode && !rhsNode)
3941 || (lhsNode ==
lhs.d_tail_p && rhsNode ==
rhs.d_tail_p)) {
3946 if (!lhsNode || !rhsNode
3947 || lhsNode ==
lhs.d_tail_p || rhsNode ==
rhs.d_tail_p) {
3953 if (!(lhsNode->d_key == rhsNode->d_key)
3954 || !(lhsNode->d_data == rhsNode->d_data)) {
3964template<
class KEY,
class DATA>
3967 const SkipList<KEY, DATA>& list)
3969 return list.print(stream, 0, -1);
#define BSLMF_NESTED_TRAIT_DECLARATION(t_TYPE, t_TRAIT)
Definition bslmf_nestedtraitdeclaration.h:231
Definition bdlcc_skiplist.h:698
bool isValid() const
Definition bdlcc_skiplist.h:1958
void release()
Release the reference (if any) managed by this SkipListPairHandle.
Definition bdlcc_skiplist.h:1903
void releaseReferenceRaw(SkipList< KEY, DATA > **list, Pair **reference)
Definition bdlcc_skiplist.h:1915
~SkipListPairHandle()
Definition bdlcc_skiplist.h:1885
SkipListPairHandle()
Construct a new PairHandle that does not refer to a pair.
Definition bdlcc_skiplist.h:1856
DATA & data() const
Definition bdlcc_skiplist.h:1940
SkipListPairHandle & operator=(const SkipListPairHandle &rhs)
Definition bdlcc_skiplist.h:1894
const KEY & key() const
Definition bdlcc_skiplist.h:1965
Definition bdlcc_skiplist.h:662
const KEY & key() const
Return a reference to the non-modifiable "key" value of this pair.
Definition bdlcc_skiplist.h:1844
DATA & data() const
Return a reference to the modifiable "data" of this pair.
Definition bdlcc_skiplist.h:1837
Definition bdlcc_skiplist.h:1780
PairFactory(SkipList *)
Create a PairFactory.
Definition bdlcc_skiplist.h:2053
Pair * operator()(Node *node) const
Convert the specified node to a Pair *.
Definition bdlcc_skiplist.h:2060
Definition bdlcc_skiplist.h:1798
PairHandleFactory(SkipList *list)
Create a PairHandleFactory bound to the specified list.
Definition bdlcc_skiplist.h:2072
PairHandle operator()(Node *node) const
Definition bdlcc_skiplist.h:2080
Definition bdlcc_skiplist.h:500
SkipList_DoubleLockGuard(bslmt::Mutex *lock1, bslmt::Mutex *lock2)
Definition bdlcc_skiplist.h:1824
Definition bdlcc_skiplist.h:602
SkipList_NodeCreationHelper(PoolManager *poolManager, Node *node, bslma::Allocator *basicAllocator=0)
Definition bdlcc_skiplist.h:2002
~SkipList_NodeCreationHelper()
Definition bdlcc_skiplist.h:2015
void construct(const KEY &key, const DATA &data)
Definition bdlcc_skiplist.h:2027
Definition bdlcc_skiplist.h:520
SkipList_RandomLevelGenerator()
Construct a thread-aware random-level generator.
int randomLevel()
Return a random integer between 0 and k_MAX_LEVEL.
Definition bdlcc_skiplist.h:804
int find(PairHandle *item, const KEY &key) const
Definition bdlcc_skiplist.h:3605
int findRRaw(Pair **item, const KEY &key) const
Definition bdlcc_skiplist.h:3645
~SkipList()
Definition bdlcc_skiplist.h:2957
void releaseReferenceRaw(const Pair *reference)
Definition bdlcc_skiplist.h:3026
int remove(const Pair *reference)
Definition bdlcc_skiplist.h:3303
int back(PairHandle *back) const
Definition bdlcc_skiplist.h:3418
int skipForward(PairHandle *item) const
Definition bdlcc_skiplist.h:3844
friend bool operator!=(const SkipList< KEY2, DATA2 > &, const SkipList< KEY2, DATA2 > &)
int addUnique(const KEY &key, const DATA &data, bool *newFrontFlag=0)
Definition bdlcc_skiplist.h:3127
int addUniqueRaw(Pair **result, const KEY &key, const DATA &data, bool *newFrontFlag=0)
Definition bdlcc_skiplist.h:3138
int skipBackwardRaw(Pair **item) const
Definition bdlcc_skiplist.h:3834
bool isEmpty() const
Return true if this list is empty, and false otherwise.
Definition bdlcc_skiplist.h:3491
int skipForwardRaw(Pair **item) const
Definition bdlcc_skiplist.h:3854
bslma::Allocator * allocator() const
Return the allocator used by this object to supply memory.
Definition bdlcc_skiplist.h:3866
int removeAll(std::vector< PairHandle > *removed)
Definition bdlcc_skiplist.h:3336
void addR(const KEY &key, const DATA &data, bool *newFrontFlag=0)
Definition bdlcc_skiplist.h:3206
SkipList(const SkipList &original, bslma::Allocator *basicAllocator=0)
Definition bdlcc_skiplist.h:2944
int findLowerBoundRRaw(Pair **item, const KEY &key) const
Definition bdlcc_skiplist.h:3698
int nextRaw(Pair **next, const Pair *reference) const
Definition bdlcc_skiplist.h:3780
int addUniqueR(const KEY &key, const DATA &data, bool *newFrontFlag=0)
Definition bdlcc_skiplist.h:3242
void addR(PairHandle *result, const KEY &key, const DATA &data, bool *newFrontFlag=0)
Definition bdlcc_skiplist.h:3194
int removeAllRaw(bsl::vector< Pair * > *removed)
Definition bdlcc_skiplist.h:3352
bsl::ostream & print(bsl::ostream &stream, int level=0, int spacesPerLevel=4) const
Definition bdlcc_skiplist.h:3522
int removeAllRaw(std::vector< Pair * > *removed)
Definition bdlcc_skiplist.h:3359
int length() const
Return the number of items in this list.
Definition bdlcc_skiplist.h:3513
int findLowerBoundRaw(Pair **item, const KEY &key) const
Definition bdlcc_skiplist.h:3671
friend bool operator==(const SkipList< KEY2, DATA2 > &, const SkipList< KEY2, DATA2 > &)
void addAtLevelRawR(Pair **result, int level, const KEY &key, const DATA &data, bool *newFrontFlag=0)
Definition bdlcc_skiplist.h:3151
int findUpperBound(PairHandle *item, const KEY &key) const
Definition bdlcc_skiplist.h:3710
int removeAll(bsl::vector< PairHandle > *removed)
Definition bdlcc_skiplist.h:3329
int next(PairHandle *next, const Pair *reference) const
Definition bdlcc_skiplist.h:3763
int findLowerBoundR(PairHandle *item, const KEY &key) const
Definition bdlcc_skiplist.h:3683
int popFront(PairHandle *item=0)
Definition bdlcc_skiplist.h:3265
static int level(const Pair *reference)
Definition bdlcc_skiplist.h:2924
int previous(PairHandle *prevPair, const Pair *reference) const
Definition bdlcc_skiplist.h:3793
SkipList(bslma::Allocator *basicAllocator=0)
Definition bdlcc_skiplist.h:2934
int popFrontRaw(Pair **item)
Definition bdlcc_skiplist.h:3284
int update(const Pair *reference, const KEY &newKey, bool *newFrontFlag=0, bool allowDuplicates=true)
Definition bdlcc_skiplist.h:3377
int findR(PairHandle *item, const KEY &key) const
Definition bdlcc_skiplist.h:3631
SkipListPairHandle< KEY, DATA > PairHandle
Definition bdlcc_skiplist.h:828
int addUniqueRawR(Pair **result, const KEY &key, const DATA &data, bool *newFrontFlag=0)
Definition bdlcc_skiplist.h:3252
int addUniqueR(PairHandle *result, const KEY &key, const DATA &data, bool *newFrontFlag=0)
Definition bdlcc_skiplist.h:3225
void key(KEY *value, const Pair *reference) const
Definition bdlcc_skiplist.h:3500
SkipList & operator=(const SkipList &rhs)
Definition bdlcc_skiplist.h:2982
@ RET_INVALID
Definition bdlcc_skiplist.h:822
@ RET_NOT_FOUND
Definition bdlcc_skiplist.h:820
@ RET_SUCCESS
Definition bdlcc_skiplist.h:819
@ e_INVALID
Definition bdlcc_skiplist.h:812
@ BCEC_NOT_FOUND
Definition bdlcc_skiplist.h:816
@ BCEC_INVALID
Definition bdlcc_skiplist.h:818
@ e_NOT_FOUND
Definition bdlcc_skiplist.h:810
@ RET_DUPLICATE
Definition bdlcc_skiplist.h:821
@ BCEC_SUCCESS
Definition bdlcc_skiplist.h:815
@ e_SUCCESS
Definition bdlcc_skiplist.h:809
@ BCEC_DUPLICATE
Definition bdlcc_skiplist.h:817
@ e_DUPLICATE
Definition bdlcc_skiplist.h:811
void add(const KEY &key, const DATA &data, bool *newFrontFlag=0)
Definition bdlcc_skiplist.h:3048
int addUnique(PairHandle *result, const KEY &key, const DATA &data, bool *newFrontFlag=0)
Definition bdlcc_skiplist.h:3111
void add(PairHandle *result, const KEY &key, const DATA &data, bool *newFrontFlag=0)
Definition bdlcc_skiplist.h:3036
void addRawR(Pair **result, const KEY &key, const DATA &data, bool *newFrontFlag=0)
Definition bdlcc_skiplist.h:3216
SkipListPair< KEY, DATA > Pair
Definition bdlcc_skiplist.h:827
void data(DATA *value, const Pair *reference) const
Definition bdlcc_skiplist.h:3438
bool exists(const KEY &key) const
Definition bdlcc_skiplist.h:3450
int addAtLevelUniqueRawR(Pair **result, int level, const KEY &key, const DATA &data, bool *newFrontFlag=0)
Definition bdlcc_skiplist.h:3167
Pair * addPairReferenceRaw(const Pair *reference) const
Definition bdlcc_skiplist.h:3409
BSLMF_NESTED_TRAIT_DECLARATION(SkipList, bslma::UsesBslmaAllocator)
void addRaw(Pair **result, const KEY &key, const DATA &data, bool *newFrontFlag=0)
Definition bdlcc_skiplist.h:3101
int backRaw(Pair **back) const
Definition bdlcc_skiplist.h:3430
void addAtLevelRaw(Pair **result, int level, const KEY &key, const DATA &data, bool *newFrontFlag=0)
Definition bdlcc_skiplist.h:3058
int findUpperBoundRRaw(Pair **item, const KEY &key) const
Definition bdlcc_skiplist.h:3752
int findLowerBound(PairHandle *item, const KEY &key) const
Definition bdlcc_skiplist.h:3657
int updateR(const Pair *reference, const KEY &newKey, bool *newFrontFlag=0, bool allowDuplicates=true)
Definition bdlcc_skiplist.h:3392
int findUpperBoundR(PairHandle *item, const KEY &key) const
Definition bdlcc_skiplist.h:3737
int findUpperBoundRaw(Pair **item, const KEY &key) const
Definition bdlcc_skiplist.h:3725
int addAtLevelUniqueRaw(Pair **result, int level, const KEY &key, const DATA &data, bool *newFrontFlag=0)
Definition bdlcc_skiplist.h:3074
int removeAll()
Definition bdlcc_skiplist.h:3322
int findRaw(Pair **item, const KEY &key) const
Definition bdlcc_skiplist.h:3619
int skipBackward(PairHandle *item) const
Definition bdlcc_skiplist.h:3824
int frontRaw(Pair **front) const
Definition bdlcc_skiplist.h:3481
int front(PairHandle *front) const
Definition bdlcc_skiplist.h:3467
int previousRaw(Pair **prevPair, const Pair *reference) const
Definition bdlcc_skiplist.h:3812
iterator begin() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_vector.h:2866
iterator end() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_vector.h:2874
Definition bslstl_vector.h:1120
iterator insert(const_iterator position, const VALUE_TYPE &value)
Definition bslstl_vector.h:4386
void reserve(size_type newCapacity)
Definition bslstl_vector.h:4263
VALUE_TYPE * iterator
Definition bslstl_vector.h:1152
Definition bslma_allocator.h:545
Definition bslmt_lockguard.h:234
Definition bslmt_mutex.h:317
void lock()
Definition bslmt_mutex.h:399
void unlock()
Definition bslmt_mutex.h:417
Definition bsls_atomic.h:744
Definition bsls_atomic.h:1362
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#define BSLMT_MUTEXASSERT_IS_LOCKED(mutex_p)
Definition bslmt_mutexassert.h:299
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_ASSERT_SAFE(X)
Definition bsls_assert.h:1917
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_CONSTEXPR
Definition bsls_keyword.h:624
#define BSLS_UTIL_ADDRESSOF(OBJ)
Definition bsls_util.h:296
bsl::ostream & print(bsl::ostream &stream, const TYPE &object, int level=0, int spacesPerLevel=4)
Definition bdlb_printmethods.h:725
Definition bdlcc_boundedqueue.h:270
bool operator!=(const SkipList< KEY, DATA > &lhs, const SkipList< KEY, DATA > &rhs)
bool operator==(const SkipList< KEY, DATA > &lhs, const SkipList< KEY, DATA > &rhs)
bsl::ostream & operator<<(bsl::ostream &stream, const SkipList< KEY, DATA > &list)
Definition bdlat_valuetypefunctions.h:939
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
T::iterator begin(T &container)
Definition bslstl_iterator.h:1593
ALLOCATOR & lhs
Definition bslstl_string.h:3917
T::iterator end(T &container)
Definition bslstl_iterator.h:1621
Definition baljsn_encoder_testtypes.h:76
Definition bslmt_barrier.h:344
static bsl::ostream & indent(bsl::ostream &stream, int level, int spacesPerLevel=4)
Definition bdlcc_skiplist.h:480
Node * d_prev_p
Definition bdlcc_skiplist.h:483
Node * d_next_p
Definition bdlcc_skiplist.h:482
Definition bdlcc_skiplist.h:475
DATA d_data
Definition bdlcc_skiplist.h:489
SkipList_Node< KEY, DATA > Node
Definition bdlcc_skiplist.h:478
Ptrs d_ptrs[1]
Definition bdlcc_skiplist.h:491
int d_level
Definition bdlcc_skiplist.h:488
KEY d_key
Definition bdlcc_skiplist.h:490
bsls::AtomicInt d_refCount
Definition bdlcc_skiplist.h:487
Definition bdlcc_skiplist.h:556
static void deallocate(PoolManager *poolManager, void *address)
static PoolManager * createPoolManager(int *objectSizes, int numLevels, bslma::Allocator *basicAllocator)
static void deletePoolManager(bslma::Allocator *basicAllocator, PoolManager *poolManager)
SkipList_PoolManager PoolManager
Definition bdlcc_skiplist.h:559
static void * allocate(PoolManager *poolManager, int level)
Definition bslmf_conditional.h:123
Definition bslmf_issame.h:146
static void copyConstruct(TARGET_TYPE *address, const TARGET_TYPE &original, bslma::Allocator *allocator)
Definition bslalg_scalarprimitives.h:1617
Definition bslma_usesbslmaallocator.h:344
Definition bsls_alignmentfromtype.h:378
std::ptrdiff_t IntPtr
Definition bsls_types.h:132