BDE 4.39.x 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 pointer.
370///
371/// \note Note that this type does not contain any "payload" member
372/// data: Clients creating a red-black binary search tree must define an
373/// appropriate node type that incorporates `RbTreeNode` (generally via
374/// inheritance), and that holds the "key" value and any associated data.
375///
376/// See @ref bslalg_rbtreenode
378
379 public:
380 // TYPES
381 enum Color{
383 BSLALG_BLACK = 1
384 };
385
386 private:
387 // DATA
388 RbTreeNode *d_parentWithColor_p; // parent of this node (may be 0) with
389 // the color information stored in the
390 // least significant bit
391
392 RbTreeNode *d_left_p; // left-child of this node (may be 0)
393
394 RbTreeNode *d_right_p; // right-child of this node (may be 0)
395
396
397 private:
398 // PRIVATE CLASS METHODS
399
400 /// Return the specified `value` as an `unsigned int`.
401 static bsls::Types::UintPtr toInt(RbTreeNode *value);
402
403 /// Return the specified `value` as `RbTreeNode *`.
404 static RbTreeNode *toNode(bsls::Types::UintPtr value);
405
406 public:
407 RbTreeNode() = default;
408 // Create a 'RbTreeNode' object having uninitialized values.
409
410 RbTreeNode(const RbTreeNode& original) = default;
411 // Create a 'RbTreeNode' object having the same value as the specified
412 // 'original' object.
413
414 ~RbTreeNode() = default;
415 // Destroy this object.
416
417 // MANIPULATORS
418 RbTreeNode& operator= (const RbTreeNode& rhs) = default;
419 // Assign to this object the value of the specified 'rhs' object, and
420 // return a reference providing modifiable access to this object.
421
422 /// Set the color of this node to black.
423 /// \note Note that this operation is
424 /// at least as fast as (and potentially faster than) `setColor`.
425 void makeBlack();
426
427 /// Set the color of this node to red.
428 /// \note Note that this operation is
429 /// at least as fast as (and potentially faster than) `setColor`.
430 void makeRed();
431
432 /// Set the parent of this node to the specified `address`. If
433 /// `address` is 0, then this node will have not have a parent node (i.e., it will be the root node).
434 ///
435 /// \pre The behavior is undefined unless
436 /// `address` is aligned to at least two bytes.
437 void setParent(RbTreeNode *address);
438
439 /// Set the left child of this node to the specified `address`. If
440 /// `address` is 0, then this node will not have a left child.
441 void setLeftChild(RbTreeNode *address);
442
443 /// Set the right child of this node to the specified `address`. If
444 /// `address` is 0, then this node will not have a right child.
445 void setRightChild(RbTreeNode *address);
446
447 /// Set the color of this node to the specified `value`.
448 void setColor(Color value);
449
450 /// Set the color of this node to the alternative color. If this
451 /// node's color is red, set it to black, and set it to red otherwise.
452 ///
453 /// \note Note that this operation is at least as fast as (and potentially
454 /// faster than) `setColor`.
455 void toggleColor();
456
457 /// Reset this object to have the specified `parent`, `leftChild`,
458 /// `rightChild`, and `color` property values.
459 void reset(RbTreeNode *parent,
462 Color color);
463
464 /// Return the address of the (modifiable) parent of this node if one
465 /// exists, and 0 otherwise.
467
468 /// Return the address of the (modifiable) left child of this node if
469 /// one exists, and 0 otherwise.
471
472 /// Return the address of the (modifiable) right child of this node if
473 /// one exists, and 0 otherwise.
475
476 // ACCESSORS
477
478 /// Return the address of the parent of this node if one exists, and 0
479 /// otherwise.
480 const RbTreeNode *parent() const;
481
482 /// Return `true` if this node is black.
483 bool isBlack() const;
484
485 /// Return `true` if this node is red.
486 bool isRed() const;
487
488 /// Return the address of the left child of this node if one exists,
489 /// and 0 otherwise.
490 const RbTreeNode *leftChild() const;
491
492 /// Return the address of the right child of this node if one exists,
493 /// and 0 otherwise.
494 const RbTreeNode *rightChild() const;
495
496 /// Return the color of this node.
497 Color color() const;
498};
499
500// ============================================================================
501// INLINE FUNCTION DEFINITIONS
502// ============================================================================
503
504// PRIVATE METHODS
505inline
506bsls::Types::UintPtr RbTreeNode::toInt(RbTreeNode *value)
507{
508#if defined(BSLS_PLATFORM_HAS_PRAGMA_GCC_DIAGNOSTIC) && \
509 !defined(BSLS_PLATFORM_CMP_CLANG)
510#pragma GCC diagnostic push
511#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
512#endif
513
514 return reinterpret_cast<bsls::Types::UintPtr>(value);
515
516#if defined(BSLS_PLATFORM_HAS_PRAGMA_GCC_DIAGNOSTIC) && \
517 !defined(BSLS_PLATFORM_CMP_CLANG)
518#pragma GCC diagnostic pop
519#endif
520}
521
522inline
523RbTreeNode *RbTreeNode::toNode(bsls::Types::UintPtr value)
524{
525 return reinterpret_cast<RbTreeNode *>(value);
526}
527
528// MANIPULATORS
529inline
531{
532 d_parentWithColor_p = toNode(toInt(d_parentWithColor_p) | 0x01);
533}
534
535inline
537{
538 d_parentWithColor_p = toNode(toInt(d_parentWithColor_p) & ~0x01);
539}
540
541inline
543{
544 BSLS_ASSERT_SAFE(0 == (toInt(address) & 0x01));
545
546 d_parentWithColor_p =
547 toNode(toInt(address) | (toInt(d_parentWithColor_p) & 0x01));
548}
549
550inline
552{
553 d_left_p = address;
554}
555
556inline
558{
559 d_right_p = address;
560}
561
562inline
564{
565 d_parentWithColor_p = toNode((toInt(d_parentWithColor_p) & ~0x01) | value);
566}
567
568inline
570{
573
574 d_parentWithColor_p = toNode(toInt(d_parentWithColor_p) ^ 0x01);
575}
576
577inline
579 RbTreeNode *leftChild,
580 RbTreeNode *rightChild,
581 Color color)
582{
583 BSLS_ASSERT_SAFE(0 == (toInt(parent) & 0x01));
584
585 d_parentWithColor_p = toNode(toInt(parent) | color);
586 d_left_p = leftChild;
587 d_right_p = rightChild;
588}
589
590inline
592{
593 return toNode(toInt(d_parentWithColor_p) & ~0x01);
594}
595
596inline
598{
599 return d_left_p;
600}
601
602inline
604{
605 return d_right_p;
606}
607
608// ACCESSORS
609inline
611{
612 return toNode(toInt(d_parentWithColor_p) & ~0x01);
613}
614
615inline
617{
618 return toInt(d_parentWithColor_p) & 0x01;
619}
620
621inline
623{
624 return !isBlack();
625}
626
627inline
629{
630 return d_left_p;
631}
632
633inline
635{
636 return d_right_p;
637}
638
639inline
641{
642 return static_cast<Color>(toInt(d_parentWithColor_p) & 0x01);
643}
644
645} // close package namespace
646
647
648#endif
649
650// ----------------------------------------------------------------------------
651// Copyright 2013 Bloomberg Finance L.P.
652//
653// Licensed under the Apache License, Version 2.0 (the "License");
654// you may not use this file except in compliance with the License.
655// You may obtain a copy of the License at
656//
657// http://www.apache.org/licenses/LICENSE-2.0
658//
659// Unless required by applicable law or agreed to in writing, software
660// distributed under the License is distributed on an "AS IS" BASIS,
661// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
662// See the License for the specific language governing permissions and
663// limitations under the License.
664// ----------------------------- END-OF-FILE ----------------------------------
665
666/** @} */
667/** @} */
668/** @} */
Definition bslalg_rbtreenode.h:377
RbTreeNode & operator=(const RbTreeNode &rhs)=default
RbTreeNode * rightChild()
Definition bslalg_rbtreenode.h:603
void toggleColor()
Definition bslalg_rbtreenode.h:569
RbTreeNode * leftChild()
Definition bslalg_rbtreenode.h:597
void reset(RbTreeNode *parent, RbTreeNode *leftChild, RbTreeNode *rightChild, Color color)
Definition bslalg_rbtreenode.h:578
bool isRed() const
Return true if this node is red.
Definition bslalg_rbtreenode.h:622
void setRightChild(RbTreeNode *address)
Definition bslalg_rbtreenode.h:557
void makeRed()
Definition bslalg_rbtreenode.h:536
void makeBlack()
Definition bslalg_rbtreenode.h:530
void setParent(RbTreeNode *address)
Definition bslalg_rbtreenode.h:542
RbTreeNode()=default
Color color() const
Return the color of this node.
Definition bslalg_rbtreenode.h:640
bool isBlack() const
Return true if this node is black.
Definition bslalg_rbtreenode.h:616
void setLeftChild(RbTreeNode *address)
Definition bslalg_rbtreenode.h:551
void setColor(Color value)
Set the color of this node to the specified value.
Definition bslalg_rbtreenode.h:563
RbTreeNode * parent()
Definition bslalg_rbtreenode.h:591
Color
Definition bslalg_rbtreenode.h:381
@ BSLALG_BLACK
Definition bslalg_rbtreenode.h:383
@ BSLALG_RED
Definition bslalg_rbtreenode.h:382
~RbTreeNode()=default
RbTreeNode(const RbTreeNode &original)=default
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#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
Definition bdlc_flathashmap.h:2218
std::size_t UintPtr
Definition bsls_types.h:128