BDE 4.14.0 Production release
Loading...
Searching...
No Matches
bslalg_rbtreenode.h
Go to the documentation of this file.
1/// @file bslalg_rbtreenode.h
2///
3/// The content of this file has been pre-processed for Doxygen.
4///
5
6
7// bslalg_rbtreenode.h -*-C++-*-
8#ifndef INCLUDED_BSLALG_RBTREENODE
9#define INCLUDED_BSLALG_RBTREENODE
10
11#include <bsls_ident.h>
12BSLS_IDENT("$Id$ $CSID$")
13
14/// @defgroup bslalg_rbtreenode bslalg_rbtreenode
15/// @brief Provide a base class for a red-black binary tree node.
16/// @addtogroup bsl
17/// @{
18/// @addtogroup bslalg
19/// @{
20/// @addtogroup bslalg_rbtreenode
21/// @{
22///
23/// <h1> Outline </h1>
24/// * <a href="#bslalg_rbtreenode-purpose"> Purpose</a>
25/// * <a href="#bslalg_rbtreenode-classes"> Classes </a>
26/// * <a href="#bslalg_rbtreenode-description"> Description </a>
27/// * <a href="#bslalg_rbtreenode-storing-color-information"> Storing Color Information </a>
28/// * <a href="#bslalg_rbtreenode-usage"> Usage </a>
29/// * <a href="#bslalg_rbtreenode-example-1-creating-a-function-to-print-a-red-black-tree"> Example 1: Creating a Function to Print a Red Black Tree </a>
30/// * <a href="#bslalg_rbtreenode-example-2-creating-a-simple-red-black-tree"> Example 2: Creating a Simple Red-Black Tree </a>
31/// * <a href="#bslalg_rbtreenode-example-3-creating-a-function-to-validate-a-red-black-tree"> Example 3: Creating a Function To Validate a Red-Black Tree </a>
32///
33/// # Purpose {#bslalg_rbtreenode-purpose}
34/// Provide a base class for a red-black binary tree node.
35///
36/// # Classes {#bslalg_rbtreenode-classes}
37///
38/// - bslalg::RbTreeNode: base class for a red-black binary tree node
39///
40/// @see bslalg_rbtreeutil
41///
42/// # Description {#bslalg_rbtreenode-description}
43/// This component provides a single POD-like class, `RbTreeNode`,
44/// used to represent a node in a red-black binary search tree. An `RbTreeNode`
45/// provides the address to its parent, left-child, and right-child nodes, as
46/// well as providing a "color" (red or black). `RbTreeNode` does not, however,
47/// contain "payload" data (e.g., a value), as it is intended to work with
48/// generalized tree operations (see @ref bslalg_rbtreenodeutil ). Clients creating
49/// a red-black binary search tree must define their own node type that
50/// incorporates `RbTreeNode` (generally via inheritance), and that maintains
51/// the "key" value and any associated data.
52///
53/// ## Storing Color Information {#bslalg_rbtreenode-storing-color-information}
54///
55///
56/// To reduce the memory footprint of the `RbTreeNode`, the color information is
57/// stored at the least-significant-bit (LSB) of the parent node. The address
58/// of the parent node and the color can be accessed through bit-wise
59/// operations. This is possible because all memory addresses are at least
60/// 4-bytes aligned, therefore, the 2 LSB of any pointer are always 0.
61///
62/// ## Usage {#bslalg_rbtreenode-usage}
63///
64///
65/// This section illustrates intended usage of this component.
66///
67/// ### Example 1: Creating a Function to Print a Red Black Tree {#bslalg_rbtreenode-example-1-creating-a-function-to-print-a-red-black-tree}
68///
69///
70/// This example demonstrates creating a function that prints, to a `FILE`, a
71/// tree of `RbTreeNode` objects.
72///
73/// First, we define the signature of a function, `printTree`, that accepts, in
74/// addition to an output file and root node, a function pointer argument
75/// (supplied by clients) used to print each node's value, note that a node's
76/// value is not accessible through `RbTreeNode`:
77/// @code
78/// void printTree(FILE *output,
79/// const RbTreeNode *rootNode,
80/// void (*printNodeValueCallback)(FILE *, const RbTreeNode *))
81/// {
82/// @endcode
83/// Now, we define the body of `printTree`, which is a recursive function that
84/// performs a prefix traversal of the supplied binary tree, printing the value
85/// and color of `rootNode` before recursively printing its left and then right
86/// sub-trees.
87/// @code
88/// if (0 == rootNode) {
89/// return; // RETURN
90/// }
91/// fprintf(output, " [ ");
92///
93/// // Print the value and color of 'rootNode'.
94///
95/// printNodeValueCallback(output, rootNode);
96/// fprintf(output,
97/// ": %s",
98/// rootNode->color() == RbTreeNode::BSLALG_RED ? "RED" : "BLACK");
99///
100/// // Recursively call 'printTree' on the left and right sub-trees.
101///
102/// printTree(output, rootNode->leftChild(), printNodeValueCallback);
103/// printTree(output, rootNode->rightChild(), printNodeValueCallback);
104/// fprintf(output, " ]");
105/// }
106/// @endcode
107/// Notice that we use `FILE` in the context of this usage example to avoid a
108/// dependency of standard library streams. Finally, we will use `printTree` to
109/// print a description of a tree in the next example.
110///
111/// ### Example 2: Creating a Simple Red-Black Tree {#bslalg_rbtreenode-example-2-creating-a-simple-red-black-tree}
112///
113///
114/// This example demonstrates creating a simple tree of integer values using
115/// `RbTreeNode`. Note that, in practice, clients should use associated
116/// utilities to manage such a tree (see @ref bslalg_rbtreenodeutil ).
117///
118/// First, we define a node-type, `IntTreeNode`, that inherits from
119///`RbTreeNode`:
120/// @code
121/// struct IntTreeNode : public RbTreeNode {
122/// // A red-black tree node containing an integer data-value.
123///
124/// int d_value; // "payload" value represented by the node
125/// };
126/// @endcode
127/// Then, we define a function `printIntNodeValue` to print the value of an
128/// integer node. Note that this function's signature matches that
129/// required by `printTree` (defined in the preceding example):
130/// @code
131/// void printIntTreeNodeValue(FILE *output, const RbTreeNode *node)
132/// {
133/// BSLS_ASSERT(0 != node);
134///
135/// fprintf(output, "%d", static_cast<const IntTreeNode*>(node)->d_value);
136/// }
137/// @endcode
138/// Next, we define `main` for our test, and create three nodes that we'll use
139/// to construct a tree:
140/// @code
141/// int main(int argc, const char *argv[])
142/// {
143/// IntTreeNode A, B, C;
144/// @endcode
145/// Then, we describe the structure of the tree we wish to construct.
146/// @code
147///
148/// A (value: 2, BLACK)
149/// / \.
150/// / \.
151/// B (value: 1, RED) C ( value: 3, RED )
152/// @endcode
153/// Now, we set the properties for the nodes `A`, `B`, and `C` to form a valid
154/// tree whose structure matches that description:
155/// @code
156/// A.d_value = 2;
157/// A.setColor(RbTreeNode::BSLALG_BLACK);
158/// A.setParent(0);
159/// A.setLeftChild(&B);
160/// A.setRightChild(&C);
161///
162/// B.d_value = 1;
163/// B.setColor(RbTreeNode::BSLALG_RED);
164/// B.setParent(&A);
165/// B.setLeftChild(0);
166/// B.setRightChild(0);
167///
168/// C.d_value = 3;
169/// C.setColor(RbTreeNode::BSLALG_RED);
170/// C.setParent(&A);
171/// C.setLeftChild(0);
172/// C.setRightChild(0);
173/// @endcode
174/// Finally, we use the `printTree` function with the `printIntTreeNodeValue`
175/// function to print the structure of our tree to `stdout`:
176/// @code
177/// printTree(stdout, &A, printIntTreeNodeValue);
178/// }
179/// @endcode
180/// Resulting in a single line of console output:
181/// @code
182/// [ 2: BLACK [ 1: RED ] [ 3: RED ] ]
183/// @endcode
184///
185/// ### Example 3: Creating a Function To Validate a Red-Black Tree {#bslalg_rbtreenode-example-3-creating-a-function-to-validate-a-red-black-tree}
186///
187///
188/// This example demonstrates creating a function to validate the properties of
189/// a red-black tree.
190///
191/// First, we declare the signature of a function `validateRbTree`, which takes
192/// two arguments: (1) the address to the root node of a tree, and (2) a
193/// comparator function, which is used to compare the payload values of the tree
194/// nodes. Note that the parameterized comparator is needed because a node's
195/// value is not accessible through the supplied `RbTreeNode`.
196/// @code
197/// template <class NODE_COMPARATOR>
198/// int validateRbTree(const RbTreeNode *rootNode,
199/// const NODE_COMPARATOR& comparator);
200/// // Return the uniform number of black nodes between every leaf node in
201/// // the tree and the specified 'rootNode', 0 if 'rootNode' is 0, and a
202/// // negative value if 'rootNode' does not refer to a valid red-black
203/// // binary-search tree that is ordered according to the specified
204/// // 'comparator'. 'rootNode' is considered a valid red-black binary
205/// // search-tree if it obeys the following rules:
206/// //
207/// //: 1 All nodes in the left sub-tree of 'rootNode' are ordered at or
208/// //: before 'rootNode' (as determined by 'comparator'), and all nodes
209/// //: in the right sub-tree are ordered at or after 'rootNode'.
210/// //:
211/// //: 2 Both children of 'rootNode' refer to 'rootNode' as a parent.
212/// //:
213/// //: 3 If 'rootNode' is red, its children are either black or 0.
214/// //:
215/// //: 4 Every path from 'rootNode' to a leaf contains the same number of
216/// //: black nodes (the uniform number of black nodes in every path is
217/// //: returned by this function if valid).
218/// //:
219/// //: 5 Rules (1-4) are obeyed, recursively, by the left and right
220/// //: sub-trees of 'rootNode'.
221/// //
222/// // Note that this particular specification of the constraints of a
223/// // red-black tree does not require the presense of black-colored NIL
224/// // leaf-nodes; instead NULL children are implicitly assumed to be NIL
225/// // leaf-nodes (as is typically the case for C/C++ implementations).
226/// // This specification also does not require the root node to be
227/// // colored black, as there's no practical benefit to enforcing that
228/// // constraint.
229/// @endcode
230/// Then, we declare the signature for an auxiliary function,
231/// `validateRbTreeRaw`, that accepts, additionally, the address of minimum
232/// and maximum value nodes, and is needed to recursively apply rule 1:
233/// @code
234/// template <class NODE_COMPARATOR>
235/// int validateRbTreeRaw(const RbTreeNode *rootNode,
236/// const RbTreeNode *minNodeValue,
237/// const RbTreeNode *maxNodeValue,
238/// NODE_COMPARATOR comparator);
239///
240/// // Return the uniform number of black nodes between every leaf node in
241/// // the tree and the specified 'rootNode', 0 if 'rootNode' is 0, and a
242/// // negative value if (1) 'rootNode' does not refer to a valid red-black
243/// // binary search tree that is ordered according to the specified
244/// // 'comparator', (2) the specified 'minNodeValue' is not 0 and there is
245/// // at least 1 node in the tree ordered before 'minNodeValue', or (3)
246/// // the specified 'maxNodeValue' is not 0 and there is at least 1 node
247/// // in the tree ordered after 'maxNodeValue'.
248/// @endcode
249/// Now, we define the implementation of `validateRbTree`, which simply
250/// delegates to `validateRbTreeRaw`.
251/// @code
252/// template <class NODE_COMPARATOR>
253/// int validateRbTree(const RbTreeNode *rootNode,
254/// NODE_COMPARATOR comparator)
255/// {
256/// return validateRbTreeRaw(rootNode, 0, 0, comparator);
257/// }
258/// @endcode
259/// Finally, we define the implementation of `validateRbTreeRaw`, which tests if
260/// `rootNode` violates any of the rules defined in the `validateRbTree` method
261/// documentation, and then recursively calls `validateRbTreeRaw` on the left
262/// and right sub-trees or `rootNode`:
263/// @code
264/// template <class NODE_COMPARATOR>
265/// int validateRbTreeRaw(const RbTreeNode *rootNode,
266/// const RbTreeNode *minNodeValue,
267/// const RbTreeNode *maxNodeValue,
268/// NODE_COMPARATOR comparator)
269/// {
270/// enum { INVALID_RBTREE = -1 };
271///
272/// // The black-height of a empty tree is considered 0.
273///
274/// if (0 == rootNode) {
275/// return 0; // RETURN
276/// }
277///
278/// // Rule 1.
279///
280/// if ((minNodeValue && comparator(*rootNode, *minNodeValue)) ||
281/// (maxNodeValue && comparator(*maxNodeValue, *rootNode))) {
282/// return INVALID_RBTREE; // RETURN
283/// }
284///
285/// // Rule 2.
286///
287/// const RbTreeNode *left = rootNode->leftChild();
288/// const RbTreeNode *right = rootNode->rightChild();
289/// if ((left && left->parent() != rootNode) ||
290/// (right && right->parent() != rootNode)) {
291/// return INVALID_RBTREE; // RETURN
292/// }
293///
294/// // Rule 3.
295///
296/// if (RbTreeNode::BSLALG_RED == rootNode->color()) {
297/// if ((left && left->color() != RbTreeNode::BSLALG_BLACK) ||
298/// (right && right->color() != RbTreeNode::BSLALG_BLACK)) {
299/// return INVALID_RBTREE; // RETURN
300/// }
301/// }
302///
303/// // Recursively validate the left and right sub-tree's and obtain their
304/// // black-height in order to apply rule 5.
305///
306/// int leftDepth = validateRbTreeRaw(rootNode->leftChild(),
307/// minNodeValue,
308/// rootNode,
309/// comparator);
310///
311/// int rightDepth = validateRbTreeRaw(rootNode->rightChild(),
312/// rootNode,
313/// maxNodeValue,
314/// comparator);
315///
316/// if (leftDepth < 0 || rightDepth < 0) {
317/// return INVALID_RBTREE; // RETURN
318/// }
319///
320/// // Rule 4.
321///
322/// if (leftDepth != rightDepth) {
323/// return INVALID_RBTREE; // RETURN
324/// }
325///
326/// return (rootNode->color() == RbTreeNode::BSLALG_BLACK)
327/// ? leftDepth + 1
328/// : leftDepth;
329/// }
330/// @endcode
331/// @}
332/** @} */
333/** @} */
334
335/** @addtogroup bsl
336 * @{
337 */
338/** @addtogroup bslalg
339 * @{
340 */
341/** @addtogroup bslalg_rbtreenode
342 * @{
343 */
344
345#include <bslscm_version.h>
346
347#include <bslmf_assert.h>
348
349#include <bsls_assert.h>
350#include <bsls_types.h>
351#include <bsls_platform.h>
352
353
354namespace bslalg {
355
356 // ================
357 // class RbTreeNode
358 // ================
359
360/// This POD-like `class` describes a node suitable for use in a red-black
361/// binary search tree, holding the addresses of the parent, left-child, and
362/// right-child nodes (any of which may be 0), as well as a "color" (red or
363/// black). This class is a "POD-like" to facilitate efficient allocation
364/// and use in the context of a container implementation. In order to meet
365/// the essential requirements of a POD type, this `class` does not define a
366/// constructor or destructor. However its data members are private. Since
367/// this class will be aligned to a word boundary, a pointer type will be a
368/// multiple of 4. This class use this property to reduce its size by
369/// storing the color information in the least significant bit of the parent
370/// pointer. Note that this type does not contain any "payload" member
371/// data: Clients creating a red-black binary search tree must define an
372/// appropriate node type that incorporates `RbTreeNode` (generally via
373/// inheritance), and that holds the "key" value and any associated data.
374///
375/// See @ref bslalg_rbtreenode
377
378 public:
379 // TYPES
380 enum Color{
382 BSLALG_BLACK = 1
383 };
384
385 private:
386 // DATA
387 RbTreeNode *d_parentWithColor_p; // parent of this node (may be 0) with
388 // the color information stored in the
389 // least significant bit
390
391 RbTreeNode *d_left_p; // left-child of this node (may be 0)
392
393 RbTreeNode *d_right_p; // right-child of this node (may be 0)
394
395
396 private:
397 // PRIVATE CLASS METHODS
398
399 /// Return the specified `value` as an `unsigned int`.
400 static bsls::Types::UintPtr toInt(RbTreeNode *value);
401
402 /// Return the specified `value` as `RbTreeNode *`.
403 static RbTreeNode *toNode(bsls::Types::UintPtr value);
404
405 public:
406 RbTreeNode() = default;
407 // Create a 'RbTreeNode' object having uninitialized values.
408
409 RbTreeNode(const RbTreeNode& original) = default;
410 // Create a 'RbTreeNode' object having the same value as the specified
411 // 'original' object.
412
413 ~RbTreeNode() = default;
414 // Destroy this object.
415
416 // MANIPULATORS
417 RbTreeNode& operator= (const RbTreeNode& rhs) = default;
418 // Assign to this object the value of the specified 'rhs' object, and
419 // return a reference providing modifiable access to this object.
420
421 /// Set the color of this node to black. Note that this operation is
422 /// at least as fast as (and potentially faster than) `setColor`.
423 void makeBlack();
424
425 /// Set the color of this node to red. Note that this operation is
426 /// at least as fast as (and potentially faster than) `setColor`.
427 void makeRed();
428
429 /// Set the parent of this node to the specified `address`. If
430 /// `address` is 0, then this node will have not have a parent node
431 /// (i.e., it will be the root node). The behavior is undefined unless
432 /// `address` is aligned to at least two bytes.
433 void setParent(RbTreeNode *address);
434
435 /// Set the left child of this node to the specified `address`. If
436 /// `address` is 0, then this node will not have a left child.
437 void setLeftChild(RbTreeNode *address);
438
439 /// Set the right child of this node to the specified `address`. If
440 /// `address` is 0, then this node will not have a right child.
441 void setRightChild(RbTreeNode *address);
442
443 /// Set the color of this node to the specified `value`.
444 void setColor(Color value);
445
446 /// Set the color of this node to the alternative color. If this
447 /// node's color is red, set it to black, and set it to red otherwise.
448 /// Note that this operation is at least as fast as (and potentially
449 /// faster than) `setColor`.
450 void toggleColor();
451
452 /// Reset this object to have the specified `parent`, `leftChild`,
453 /// `rightChild`, and `color` property values.
454 void reset(RbTreeNode *parent,
457 Color color);
458
459 /// Return the address of the (modifiable) parent of this node if one
460 /// exists, and 0 otherwise.
462
463 /// Return the address of the (modifiable) left child of this node if
464 /// one exists, and 0 otherwise.
466
467 /// Return the address of the (modifiable) right child of this node if
468 /// one exists, and 0 otherwise.
470
471 // ACCESSORS
472
473 /// Return the address of the parent of this node if one exists, and 0
474 /// otherwise.
475 const RbTreeNode *parent() const;
476
477 /// Return `true` if this node is black.
478 bool isBlack() const;
479
480 /// Return `true` if this node is red.
481 bool isRed() const;
482
483 /// Return the address of the left child of this node if one exists,
484 /// and 0 otherwise.
485 const RbTreeNode *leftChild() const;
486
487 /// Return the address of the right child of this node if one exists,
488 /// and 0 otherwise.
489 const RbTreeNode *rightChild() const;
490
491 /// Return the color of this node.
492 Color color() const;
493};
494
495// ============================================================================
496// INLINE FUNCTION DEFINITIONS
497// ============================================================================
498
499// PRIVATE METHODS
500inline
501bsls::Types::UintPtr RbTreeNode::toInt(RbTreeNode *value)
502{
503#if defined(BSLS_PLATFORM_HAS_PRAGMA_GCC_DIAGNOSTIC) && \
504 !defined(BSLS_PLATFORM_CMP_CLANG)
505#pragma GCC diagnostic push
506#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
507#endif
508
509 return reinterpret_cast<bsls::Types::UintPtr>(value);
510
511#if defined(BSLS_PLATFORM_HAS_PRAGMA_GCC_DIAGNOSTIC) && \
512 !defined(BSLS_PLATFORM_CMP_CLANG)
513#pragma GCC diagnostic pop
514#endif
515}
516
517inline
518RbTreeNode *RbTreeNode::toNode(bsls::Types::UintPtr value)
519{
520 return reinterpret_cast<RbTreeNode *>(value);
521}
522
523// MANIPULATORS
524inline
526{
527 d_parentWithColor_p = toNode(toInt(d_parentWithColor_p) | 0x01);
528}
529
530inline
532{
533 d_parentWithColor_p = toNode(toInt(d_parentWithColor_p) & ~0x01);
534}
535
536inline
538{
539 BSLS_ASSERT_SAFE(0 == (toInt(address) & 0x01));
540
541 d_parentWithColor_p =
542 toNode(toInt(address) | (toInt(d_parentWithColor_p) & 0x01));
543}
544
545inline
547{
548 d_left_p = address;
549}
550
551inline
553{
554 d_right_p = address;
555}
556
557inline
559{
560 d_parentWithColor_p = toNode((toInt(d_parentWithColor_p) & ~0x01) | value);
561}
562
563inline
565{
568
569 d_parentWithColor_p = toNode(toInt(d_parentWithColor_p) ^ 0x01);
570}
571
572inline
574 RbTreeNode *leftChild,
575 RbTreeNode *rightChild,
576 Color color)
577{
578 BSLS_ASSERT_SAFE(0 == (toInt(parent) & 0x01));
579
580 d_parentWithColor_p = toNode(toInt(parent) | color);
581 d_left_p = leftChild;
582 d_right_p = rightChild;
583}
584
585inline
587{
588 return toNode(toInt(d_parentWithColor_p) & ~0x01);
589}
590
591inline
593{
594 return d_left_p;
595}
596
597inline
599{
600 return d_right_p;
601}
602
603// ACCESSORS
604inline
606{
607 return toNode(toInt(d_parentWithColor_p) & ~0x01);
608}
609
610inline
612{
613 return toInt(d_parentWithColor_p) & 0x01;
614}
615
616inline
618{
619 return !isBlack();
620}
621
622inline
624{
625 return d_left_p;
626}
627
628inline
630{
631 return d_right_p;
632}
633
634inline
636{
637 return static_cast<Color>(toInt(d_parentWithColor_p) & 0x01);
638}
639
640} // close package namespace
641
642
643#endif
644
645// ----------------------------------------------------------------------------
646// Copyright 2013 Bloomberg Finance L.P.
647//
648// Licensed under the Apache License, Version 2.0 (the "License");
649// you may not use this file except in compliance with the License.
650// You may obtain a copy of the License at
651//
652// http://www.apache.org/licenses/LICENSE-2.0
653//
654// Unless required by applicable law or agreed to in writing, software
655// distributed under the License is distributed on an "AS IS" BASIS,
656// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
657// See the License for the specific language governing permissions and
658// limitations under the License.
659// ----------------------------- END-OF-FILE ----------------------------------
660
661/** @} */
662/** @} */
663/** @} */
Definition bslalg_rbtreenode.h:376
RbTreeNode & operator=(const RbTreeNode &rhs)=default
RbTreeNode * rightChild()
Definition bslalg_rbtreenode.h:598
void toggleColor()
Definition bslalg_rbtreenode.h:564
RbTreeNode * leftChild()
Definition bslalg_rbtreenode.h:592
void reset(RbTreeNode *parent, RbTreeNode *leftChild, RbTreeNode *rightChild, Color color)
Definition bslalg_rbtreenode.h:573
bool isRed() const
Return true if this node is red.
Definition bslalg_rbtreenode.h:617
void setRightChild(RbTreeNode *address)
Definition bslalg_rbtreenode.h:552
void makeRed()
Definition bslalg_rbtreenode.h:531
void makeBlack()
Definition bslalg_rbtreenode.h:525
void setParent(RbTreeNode *address)
Definition bslalg_rbtreenode.h:537
RbTreeNode()=default
Color color() const
Return the color of this node.
Definition bslalg_rbtreenode.h:635
bool isBlack() const
Return true if this node is black.
Definition bslalg_rbtreenode.h:611
void setLeftChild(RbTreeNode *address)
Definition bslalg_rbtreenode.h:546
void setColor(Color value)
Set the color of this node to the specified value.
Definition bslalg_rbtreenode.h:558
RbTreeNode * parent()
Definition bslalg_rbtreenode.h:586
Color
Definition bslalg_rbtreenode.h:380
@ BSLALG_BLACK
Definition bslalg_rbtreenode.h:382
@ BSLALG_RED
Definition bslalg_rbtreenode.h:381
~RbTreeNode()=default
RbTreeNode(const RbTreeNode &original)=default
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:229
#define BSLS_ASSERT_SAFE(X)
Definition bsls_assert.h:1762
#define BSLS_IDENT(str)
Definition bsls_ident.h:195
Definition bdlc_flathashmap.h:1805
std::size_t UintPtr
Definition bsls_types.h:126