BDE 4.39.x Production Release
Loading...
Searching...
No Matches
ball_recordattributes.h
Go to the documentation of this file.
1/// @file ball_recordattributes.h
2///
3/// The content of this file has been pre-processed for Doxygen.
4///
5
6
7// ball_recordattributes.h -*-C++-*-
8#ifndef INCLUDED_BALL_RECORDATTRIBUTES
9#define INCLUDED_BALL_RECORDATTRIBUTES
10
11#include <bsls_ident.h>
12BSLS_IDENT("$Id: $")
13
14/// @defgroup ball_recordattributes ball_recordattributes
15/// @brief Provide a container for a fixed set of fields suitable for logging.
16/// @addtogroup bal
17/// @{
18/// @addtogroup ball
19/// @{
20/// @addtogroup ball_recordattributes
21/// @{
22///
23/// <h1> Outline </h1>
24/// * <a href="#ball_recordattributes-purpose"> Purpose</a>
25/// * <a href="#ball_recordattributes-classes"> Classes </a>
26/// * <a href="#ball_recordattributes-description"> Description </a>
27/// * <a href="#ball_recordattributes-usage"> Usage </a>
28/// * <a href="#ball_recordattributes-example-1-syntax"> Example 1: Syntax </a>
29/// * <a href="#ball_recordattributes-example-2-streaming-data-into-a-message-attribute"> Example 2: Streaming Data Into a Message Attribute </a>
30///
31/// # Purpose {#ball_recordattributes-purpose}
32/// Provide a container for a fixed set of fields suitable for logging.
33///
34/// # Classes {#ball_recordattributes-classes}
35///
36/// - ball::RecordAttributes: container for a fixed set of log fields
37///
38/// @see ball_record
39///
40/// # Description {#ball_recordattributes-description}
41/// This component defines a container for aggregating a fixed set
42/// of fields intrinsically appropriate for logging. Using
43/// `ball::RecordAttributes`, a logger can transmit log message text together
44/// with relevant auxiliary information (e.g., timestamp, filename, line number,
45/// etc.) as a single instance, rather than passing around individual attributes
46/// separately.
47///
48/// The attributes held by `ball::RecordAttributes` are given in the following
49/// table:
50/// @code
51/// Attribute Type Description Default
52/// ---------- ------------- ------------------------------ --------
53/// timestamp bdlt::Datetime creation date and time (*Note*)
54/// processID int process id of creator 0
55/// threadID Uint64 thread id of creator 0
56/// fileName string file where created (__FILE__) ""
57/// lineNumber int line number in file (__LINE__) 0
58/// category string category of logged record ""
59/// severity int severity of logged record 0
60/// message string log message text ""
61/// @endcode
62/// *Note*: The default value given to the timestamp attribute is implementation
63/// defined. (See the @ref bdlt_datetime component-level documentation for more
64/// information.)
65///
66/// *Cached Stream State*: Although a `RecordAttributes` object is nominally a
67/// value-semantic attribute type whose attributes are described in the table
68/// above, for performance and convenience a `RecordAttributes` object provides
69/// access to internal instances of `bdlsb::MemOutStreamBuf` and `bsl::ostream`
70/// objects (via `messageStreamBuf` and `messageStream` accessors, respectively)
71/// that allow users to build the `message` directly without having to construct
72/// any I/O stream objects independently. This is useful because `ball::Record`
73/// objects and their `RecordAttributes` are cached for performance. Note that
74/// it's possible for two equal instances of `RecordAttributes` objects to have
75/// different stream states. Resetting the message will clear most stream
76/// state, except for the locale, installed callbacks, and any pword/iword data.
77///
78/// For each attribute, there is a method to access its value and a method to
79/// change its value. E.g., for the timestamp attribute, there is the
80/// `timestamp` accessor and the `setTimestamp` manipulator. Note that for the
81/// message attribute, there is a `message` accessor which is *deprecated*; use
82/// the `messageRef` accessor instead. The class also provides the ability to
83/// stream an object (whose class must support the `operator<<`) into the
84/// message attribute using `messageStreamBuf` method (see the usage example-2).
85///
86/// Alternately, an object can be streamed directly into the message attribute
87/// via the stream exposed by the `messageStream` method: in that case, the
88/// `messageStreamBuf` should not also be used simultaneously. More precisely,
89/// use of the references returned by the `messageStreamBuf` and `messageStream`
90/// methods to build a message results in undefined behavior if interleaved with
91/// each other, or if interspersed with calls to `setMessage`, `clearMessage`,
92/// `operator=`, or `message` (but not `messageRef`). In other words, streaming
93/// an object into the message attribute must be done in one uninterrupted
94/// sequence of operations.
95///
96/// The default values listed in the table above are the values given to the
97/// respective attributes by the default constructor of
98/// `ball::RecordAttributes`.
99///
100/// ## Usage {#ball_recordattributes-usage}
101///
102///
103/// This section illustrates intended use of this component.
104///
105/// ### Example 1: Syntax {#ball_recordattributes-example-1-syntax}
106///
107///
108/// The `ball::RecordAttributes` class holds sufficient information on which to
109/// base a rudimentary logging, tracing, or reporting facility. The following
110/// code fragments illustrate the essentials of working with these attributes.
111///
112/// Assume that our example is part of a financial application using categories
113/// and message severities as follows:
114/// @code
115/// const char *Category[] = { "Bonds", "Equities", "Futures" };
116/// enum { INFO, WARN, BUY, SELL };
117/// @endcode
118/// First define a `ball::RecordAttributes` object with each attribute
119/// initialized to its default value:
120/// @code
121/// ball::RecordAttributes attributes;
122/// @endcode
123/// Next set each of the attributes to some meaningful value:
124/// @code
125/// bdlt::Datetime now;
126/// bdlt::EpochUtil::convertFromTimeT(&now, time(0));
127/// attributes.setTimestamp(now); // current time
128/// attributes.setProcessID(getpid());
129/// attributes.setThreadID((bsls::Types::Uint64) pthread_self());
130/// attributes.setFileName(__FILE__);
131/// attributes.setLineNumber(__LINE__);
132/// attributes.setCategory(Category[2]); // "Futures"
133/// attributes.setSeverity(WARN);
134/// attributes.setMessage("sugar up (locust infestations on the rise)");
135/// @endcode
136/// The message in this example briefly informs that something interesting may
137/// be happening with respect to sugar futures. In general, the message
138/// attribute can contain an arbitrary amount of information.
139///
140/// Now that the sample `ball::RecordAttributes` object has been populated with
141/// the desired information, it can be passed to a function, stored in a
142/// database, cached in a container of `ball::RecordAttributes` objects, etc.
143/// For the purposes of this illustration, we'll simply format and stream
144/// selected attributes to a specified `ostream` using the following function:
145/// @code
146/// void printMessage(ostream& stream,
147/// const ball::RecordAttributes& attributes)
148/// {
149/// using namespace std;
150/// stream << "\tTimestamp: " << attributes.timestamp() << endl;
151/// stream << "\tCategory: " << attributes.category() << endl;
152/// stream << "\tMessage: " << attributes.messageRef() << endl;
153/// stream << endl;
154/// }
155/// @endcode
156/// The following call:
157/// @code
158/// printMessage(bsl::cout, attributes);
159/// @endcode
160/// prints these attributes to `stdout`:
161/// @code
162/// Timestamp: 19JAN2004_23:07:38.000
163/// Category: Futures
164/// Message: sugar up (locust infestations on the rise)
165/// @endcode
166///
167/// ### Example 2: Streaming Data Into a Message Attribute {#ball_recordattributes-example-2-streaming-data-into-a-message-attribute}
168///
169///
170/// Following example demonstrates how an object of a class supporting `ostream`
171/// operation (`operator<<`) can be streamed into the message attribute.
172/// Suppose we want to stream objects of the following class.
173/// @code
174/// class Information
175/// {
176/// private:
177/// bsl::string d_heading;
178/// bsl::string d_contents;
179///
180/// public:
181/// Information(const char *heading, const char *contents);
182/// const bsl::string& heading() const;
183/// const bsl::string& contents() const;
184/// };
185/// @endcode
186/// The component containing the `Information` must provide `operator<<`. Here
187/// is a possible implementation.
188/// @code
189/// bsl::ostream& operator<<(bsl::ostream& stream,
190/// const Information& information)
191/// {
192/// stream << information.heading() << endl;
193/// stream << '\t';
194/// stream << information.contents() << endl;
195/// return stream;
196/// }
197/// @endcode
198/// The following function streams an `Information` object into the message
199/// attribute of a `ball::RecordAttributes` object.
200/// @code
201/// void streamInformationIntoMessageAttribute(
202/// ball::RecordAttributes& attributes,
203/// const Information& information)
204/// {
205/// // First clear the message attributes.
206/// attributes.clearMessage();
207///
208/// // Create an 'ostream' from message stream buffer.
209/// bsl::ostream os(&attributes.messageStreamBuf());
210///
211/// // Now stream the information object into the created ostream.
212/// // This will set the message attribute of 'attributes' to the
213/// // streamed contents.
214/// os << information;
215/// }
216/// @endcode
217/// @}
218/** @} */
219/** @} */
220
221/** @addtogroup bal
222 * @{
223 */
224/** @addtogroup ball
225 * @{
226 */
227/** @addtogroup ball_recordattributes
228 * @{
229 */
230
231#include <balscm_version.h>
232
234
235#include <bdlt_datetime.h>
236
237#include <bslma_allocator.h>
239
241
242#include <bsls_performancehint.h>
243#include <bsls_platform.h>
244#include <bsls_types.h>
245
246#include <bsl_ostream.h>
247#include <bsl_string.h>
248#include <bsl_string_view.h>
249
250
251namespace ball {
252
253 // ======================
254 // class RecordAttributes
255 // ======================
256
257/// This class provides a container for a fixed set of attributes
258/// appropriate for logging. For each attribute in this class (e.g.,
259/// `category`), there is an accessor for obtaining the attribute's value
260/// (the `category` accessor) and a manipulator for changing the attribute's
261/// value (the `setCategory` manipulator).
262///
263/// Additionally, this class supports a complete set of *value* *semantic*
264/// operations, including copy construction, assignment and equality
265/// comparison, and `ostream` printing. A precise operational definition of
266/// when two instances have the same value can be found in the description
267/// of `operator==` for the class. This class is *exception* *neutral* with
268/// no guarantee of rollback: If an exception is thrown during the
269/// invocation of a method on a pre-existing instance, the object is left in
270/// a valid state, but its value is undefined. In no event is memory
271/// leaked. Finally, *aliasing* (e.g., using all or part of an object as
272/// both source and destination) is supported in all cases.
273///
274/// See @ref ball_recordattributes
276
277 // PRIVATE TYPES
278 typedef bsls::Types::Uint64 Uint64;
279
280 // PRIVATE CONSTANTS
281 enum {
282 k_RESET_MESSAGE_STREAM_CAPACITY = 256 // maximum capacity above which
283 // the message stream is reset
284 // (and not rewound)
285 };
286
287 // DATA
288 bdlt::Datetime d_timestamp; // creation date and time
289 int d_processID; // process id of creator
290 Uint64 d_threadID; // thread id of creator
291 Uint64 d_kernelThreadID; // thread id of creator
292 bsl::string d_fileName; // name of file where created (__FILE__)
293 int d_lineNumber; // line number of said file (__LINE__)
294 bsl::string d_category; // category of log record
295 int d_severity; // severity of log record
296
297 bdlsb::MemOutStreamBuf d_messageStreamBuf; // stream buffer associated
298 // with the message attribute
299
300 bsl::ostream d_messageStream; // stream associated with the
301 // message attribute
302
303 // FRIENDS
304 friend bool operator==(const RecordAttributes&, const RecordAttributes&);
305
306 // PRIVATE MANIPULATORS
307
308 /// Reset the message stream state to the default stream state, except
309 /// for the imbued locale, any installed callbacks, and any pword/iword
310 /// data (in practice these are unlikely to deviate from the default in
311 /// the first place).
312 void resetMessageStreamState();
313
314 public:
315 // TRAITS
318
319 // CREATORS
320
321 /// Create a record attributes object with all attributes having default
322 /// values. Optionally specify a `basicAllocator` used to supply
323 /// memory. If `basicAllocator` is 0, the currently installed default
324 /// allocator is used.
325 explicit RecordAttributes(bslma::Allocator *basicAllocator = 0);
326
327 /// Create a record attributes object having the specified `timestamp`,
328 /// `processID`, `threadID`, `kernelThreadId`, `fileName`, `lineNumber`,
329 /// `category`, `severity` and `message` values, respectively. Optionally
330 /// specify a `basicAllocator` used to supply memory. If `basicAllocator`
331 /// is 0, the currently installed default allocator is used.
333 int processID,
336 int lineNumber,
338 int severity,
340 bslma::Allocator *basicAllocator = 0);
342 int processID,
346 int lineNumber,
348 int severity,
350 bslma::Allocator *basicAllocator = 0);
351
352 /// Create a record attributes object having the value of the specified
353 /// `original` record attributes object. Optionally specify a
354 /// `basicAllocator` used to supply memory. If `basicAllocator` is 0,
355 /// the currently installed default allocator is used.
357 bslma::Allocator *basicAllocator = 0);
358
359 /// Destroy this object.
360 ~RecordAttributes() = default;
361
362 // MANIPULATORS
363
364 /// Assign to this record attributes object the value of the specified
365 /// `rhs` record attributes object. Resets the objects returned by the
366 /// `messageStreamBuf` and `messageStream` methods.
368
369 /// Set the message attribute of this record attributes object to the
370 /// empty string. Resets the objects returned by the `messageStreamBuf`
371 /// and `messageStream` methods.
372 void clearMessage();
373
374 /// Return a reference to the modifiable stream buffer associated with
375 /// the message attribute of this record attributes object.
377
378 /// Return a reference to the modifiable stream associated with the
379 /// message attribute of this record attributes object.
380 bsl::ostream& messageStream();
381
382 /// Set the category attribute of this record attributes object to the
383 /// specified `category`.
385
386 /// Set the filename attribute of this record attributes object to the
387 /// specified `fileName`.
389
390 /// Set the line number attribute of this record attributes object to
391 /// the specified `lineNumber`.
392 void setLineNumber(int lineNumber);
393
394 /// Set the message attribute of this record attributes object to the
395 /// specified `message`. Resets the objects returned by the
396 /// `messageStreamBuf` and `messageStream` methods.
398
399 /// Set the processID attribute of this record attributes object to the
400 /// specified `processID`.
401 void setProcessID(int processID);
402
403 /// Set the severity attribute of this record attributes object to the
404 /// specified `severity`.
405 void setSeverity(int severity);
406
407 /// Set the threadID attribute of this record attributes object to the
408 /// specified `threadID`.
410
411 /// Set the kernelThreadID attribute of this record attributes object to
412 /// the specified `kernelThreadID`.
414
415 /// Set the timestamp attribute of this record attributes object to the
416 /// specified `timestamp`.
418
419 // ACCESSORS
420
421 /// Return the category attribute of this record attributes object.
422 const char *category() const;
423
424 /// Return the filename attribute of this record attributes object.
425 const char *fileName() const;
426
427 /// Return the line number attribute of this record attributes object.
428 int lineNumber() const;
429
430 /// Return the message attribute of this record attributes object.
431 ///
432 /// \note Note that this method will return a truncated message if it contains
433 /// embedded null ('\0') characters; see `messageRef` for an alternative
434 /// to this method. **Warning:** This method is *not* const thread-safe,
435 /// and cannot be safely called concurrently. It may modify the stream
436 /// buffer returned by `messageStreamBuf`.
437 ///
438 /// @deprecated Use @ref messageRef instead.
439 const char *message() const;
440
441 /// Return a string reference providing non-modifiable access to the message attribute of this record attributes object.
442 ///
443 /// \note Note that the
444 /// returned string reference is not null-terminated, and may contain
445 /// null ('\0') characters.
447
448 /// Return the processID attribute of this record attributes object.
449 int processID() const;
450
451 /// Return the severity attribute of this record attributes object.
452 int severity() const;
453
454 /// Return the threadID attribute of this record attributes object.
456
457 /// Return the kernelThreadID attribute of this record attributes object.
459
460 /// Return the timestamp attribute of this record attributes object.
461 const bdlt::Datetime& timestamp() const;
462
463 /// Return a reference to the non-modifiable stream buffer associated
464 /// with the message attribute of this record attributes object.
466
467 /// Return a reference to the non-modifiable stream associated with the
468 /// message attribute of this record attributes object.
469 const bsl::ostream& messageStream() const;
470
471 /// Format this object to the specified output `stream` at the
472 /// optionally specified indentation `level` and return a reference to
473 /// the modifiable `stream`. If `level` is specified, optionally
474 /// specify `spacesPerLevel`, the number of spaces per indentation level
475 /// for this and all of its nested objects. Each line is indented by
476 /// the absolute value of `level * spacesPerLevel`. If `level` is
477 /// negative, suppress indentation of the first line. If
478 /// `spacesPerLevel` is negative, suppress line breaks and format the
479 /// entire output on one line. If `stream` is initially invalid, this
480 /// operation has no effect.
481 bsl::ostream& print(bsl::ostream& stream,
482 int level = 0,
483 int spacesPerLevel = 4) const;
484
485};
486
487// FREE OPERATORS
488
489/// Return `true` if the specified `lhs` and `rhs` record attributes objects
490/// have the same value, and `false` otherwise. Two record attributes
491/// objects have the same value if each respective pair of attributes have
492/// the same value.
493bool operator==(const RecordAttributes& lhs, const RecordAttributes& rhs);
494
495/// Return `true` if the specified `lhs` and `rhs` record attributes objects
496/// do not have the same value, and `false` otherwise. Two record
497/// attributes objects do not have the same value if one or more respective
498/// attributes differ in value.
499inline
500bool operator!=(const RecordAttributes& lhs, const RecordAttributes& rhs);
501
502/// Format the members of the specified `object` to the specified output
503/// `stream` and return a reference to the modifiable `stream`.
504inline
505bsl::ostream& operator<<(bsl::ostream& stream, const RecordAttributes& object);
506
507// ============================================================================
508// INLINE DEFINITIONS
509// ============================================================================
510
511 // ----------------------
512 // class RecordAttributes
513 // ----------------------
514
515// PRIVATE MANIPULATORS
516inline
517void RecordAttributes::resetMessageStreamState()
518{
519 // See basic_ios::init; note that we intentionally avoid 'copyfmt' here as
520 // re-imbuing the stream with a locale is quite expensive, and would defeat
521 // the purpose of caching the stream object in the attributes in the first
522 // place.
523 d_messageStream.exceptions(bsl::ios_base::goodbit);
524 d_messageStream.clear();
525 d_messageStream.tie(0);
526 d_messageStream.flags(bsl::ios_base::dec | bsl::ios_base::skipws);
527 d_messageStream.fill(' ');
528 d_messageStream.precision(6);
529 d_messageStream.width(0);
530}
531
532// MANIPULATORS
533inline
535{
536 // Note that the stream buffer holding the message attribute has initial
537 // capacity of 256 bytes (by implementation). Reset those stream buffers
538 // that are bigger than the default and "rewind" those that are smaller or
539 // equal.
541 k_RESET_MESSAGE_STREAM_CAPACITY < d_messageStreamBuf.capacity())) {
543 d_messageStreamBuf.reset();
544 }
545 else {
546 d_messageStreamBuf.pubseekpos(0);
547 }
548 resetMessageStreamState();
549}
550
551inline
553{
554 return d_messageStreamBuf;
555}
556
557inline
559{
560 return d_messageStream;
561}
562
563inline
565{
566 d_category = category;
567}
568
569inline
571{
572 d_fileName = fileName;
573}
574
575inline
577{
578 d_lineNumber = lineNumber;
579}
580
581inline
583{
584 d_processID = processID;
585}
586
587inline
589{
590 d_severity = severity;
591}
592
593inline
595{
596 d_threadID = threadID;
597}
598
599inline
601{
602 d_kernelThreadID = kernelThreadID;
603}
604
605inline
607{
608 d_timestamp = timestamp;
609}
610
611// ACCESSORS
612inline
613const char *RecordAttributes::category() const
614{
615 return d_category.c_str();
616}
617
618inline
619const char *RecordAttributes::fileName() const
620{
621 return d_fileName.c_str();
622}
623
624inline
626{
627 return d_lineNumber;
628}
629
630inline
632{
633 return d_processID;
634}
635
636inline
638{
639 return d_severity;
640}
641
642inline
644{
645 return d_threadID;
646}
647
648inline
650{
651 return d_kernelThreadID;
652}
653
654inline
656{
657 return d_messageStreamBuf;
658}
659
660inline
661const bsl::ostream& RecordAttributes::messageStream() const
662{
663 return d_messageStream;
664}
665
666inline
668{
669 return d_timestamp;
670}
671
672} // close package namespace
673
674// FREE OPERATORS
675inline
676bool ball::operator!=(const RecordAttributes& lhs, const RecordAttributes& rhs)
677{
678 return !(lhs == rhs);
679}
680
681inline
682bsl::ostream& ball::operator<<(bsl::ostream& stream,
683 const RecordAttributes& object)
684{
685 return object.print(stream, 0, -1);
686}
687
688
689
690#endif
691
692// ----------------------------------------------------------------------------
693// Copyright 2015 Bloomberg Finance L.P.
694//
695// Licensed under the Apache License, Version 2.0 (the "License");
696// you may not use this file except in compliance with the License.
697// You may obtain a copy of the License at
698//
699// http://www.apache.org/licenses/LICENSE-2.0
700//
701// Unless required by applicable law or agreed to in writing, software
702// distributed under the License is distributed on an "AS IS" BASIS,
703// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
704// See the License for the specific language governing permissions and
705// limitations under the License.
706// ----------------------------- END-OF-FILE ----------------------------------
707
708/** @} */
709/** @} */
710/** @} */
Definition ball_recordattributes.h:275
void clearMessage()
Definition ball_recordattributes.h:534
bslstl::StringRef messageRef() const
RecordAttributes & operator=(const RecordAttributes &rhs)
BSLMF_NESTED_TRAIT_DECLARATION(RecordAttributes, bslma::UsesBslmaAllocator)
RecordAttributes(const RecordAttributes &original, bslma::Allocator *basicAllocator=0)
bsl::ostream & messageStream()
Definition ball_recordattributes.h:558
RecordAttributes(const bdlt::Datetime &timestamp, int processID, bsls::Types::Uint64 threadID, const bsl::string_view &fileName, int lineNumber, const bsl::string_view &category, int severity, const bsl::string_view &message, bslma::Allocator *basicAllocator=0)
int lineNumber() const
Return the line number attribute of this record attributes object.
Definition ball_recordattributes.h:625
~RecordAttributes()=default
Destroy this object.
bsls::Types::Uint64 kernelThreadID() const
Return the kernelThreadID attribute of this record attributes object.
Definition ball_recordattributes.h:649
void setProcessID(int processID)
Definition ball_recordattributes.h:582
bdlsb::MemOutStreamBuf & messageStreamBuf()
Definition ball_recordattributes.h:552
void setMessage(const bsl::string_view &message)
void setTimestamp(const bdlt::Datetime &timestamp)
Definition ball_recordattributes.h:606
void setThreadID(bsls::Types::Uint64 threadID)
Definition ball_recordattributes.h:594
const bdlt::Datetime & timestamp() const
Return the timestamp attribute of this record attributes object.
Definition ball_recordattributes.h:667
bsls::Types::Uint64 threadID() const
Return the threadID attribute of this record attributes object.
Definition ball_recordattributes.h:643
void setLineNumber(int lineNumber)
Definition ball_recordattributes.h:576
bsl::ostream & print(bsl::ostream &stream, int level=0, int spacesPerLevel=4) const
const char * category() const
Return the category attribute of this record attributes object.
Definition ball_recordattributes.h:613
int processID() const
Return the processID attribute of this record attributes object.
Definition ball_recordattributes.h:631
friend bool operator==(const RecordAttributes &, const RecordAttributes &)
void setSeverity(int severity)
Definition ball_recordattributes.h:588
const char * message() const
void setKernelThreadID(bsls::Types::Uint64 kernelThreadID)
Definition ball_recordattributes.h:600
void setFileName(const bsl::string_view &fileName)
Definition ball_recordattributes.h:570
const char * fileName() const
Return the filename attribute of this record attributes object.
Definition ball_recordattributes.h:619
int severity() const
Return the severity attribute of this record attributes object.
Definition ball_recordattributes.h:637
void setCategory(const bsl::string_view &category)
Definition ball_recordattributes.h:564
RecordAttributes(const bdlt::Datetime &timestamp, int processID, bsls::Types::Uint64 threadID, bsls::Types::Uint64 kernelThreadID, const bsl::string_view &fileName, int lineNumber, const bsl::string_view &category, int severity, const bsl::string_view &message, bslma::Allocator *basicAllocator=0)
RecordAttributes(bslma::Allocator *basicAllocator=0)
Definition bdlsb_memoutstreambuf.h:212
bsl::size_t capacity() const
Definition bdlsb_memoutstreambuf.h:407
void reset()
Definition bdlsb_memoutstreambuf.h:399
Definition bdlt_datetime.h:330
bsl::ostream & print(bsl::ostream &stream, int level=0, int spacesPerLevel=4) const
Definition bslstl_stringview.h:471
Definition bslstl_string.h:1252
const CHAR_TYPE * c_str() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_string.h:7405
Definition bslma_allocator.h:545
Definition bslstl_stringref.h:374
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_PERFORMANCEHINT_UNLIKELY_HINT
Definition bsls_performancehint.h:484
#define BSLS_PERFORMANCEHINT_PREDICT_UNLIKELY(expr)
Definition bsls_performancehint.h:452
Definition ball_administration.h:214
bsl::ostream & operator<<(bsl::ostream &output, const Attribute &attribute)
bool operator!=(const Attribute &lhs, const Attribute &rhs)
Definition bslma_usesbslmaallocator.h:344
unsigned long long Uint64
Definition bsls_types.h:139