BDE 4.39.x Production Release
Loading...
Searching...
No Matches
bdlt_calendarcache.h
Go to the documentation of this file.
1/// @file bdlt_calendarcache.h
2///
3/// The content of this file has been pre-processed for Doxygen.
4///
5
6
7// bdlt_calendarcache.h -*-C++-*-
8#ifndef INCLUDED_BDLT_CALENDARCACHE
9#define INCLUDED_BDLT_CALENDARCACHE
10
11#include <bsls_ident.h>
12BSLS_IDENT("$Id: $")
13
14/// @defgroup bdlt_calendarcache bdlt_calendarcache
15/// @brief Provide an efficient cache for read-only `bdlt::Calendar` objects.
16/// @addtogroup bdl
17/// @{
18/// @addtogroup bdlt
19/// @{
20/// @addtogroup bdlt_calendarcache
21/// @{
22///
23/// <h1> Outline </h1>
24/// * <a href="#bdlt_calendarcache-purpose"> Purpose</a>
25/// * <a href="#bdlt_calendarcache-classes"> Classes </a>
26/// * <a href="#bdlt_calendarcache-description"> Description </a>
27/// * <a href="#bdlt_calendarcache-thread-safety"> Thread Safety </a>
28/// * <a href="#bdlt_calendarcache-usage"> Usage </a>
29/// * <a href="#bdlt_calendarcache-example-1-using-a-bdlt-calendarcache"> Example 1: Using a bdlt::CalendarCache </a>
30/// * <a href="#bdlt_calendarcache-example-2-a-calendar-cache-with-a-timeout"> Example 2: A Calendar Cache with a Timeout </a>
31///
32/// # Purpose {#bdlt_calendarcache-purpose}
33/// Provide an efficient cache for read-only `bdlt::Calendar` objects.
34///
35/// # Classes {#bdlt_calendarcache-classes}
36///
37/// - bdlt::CalendarCache: cache for read-only calendars that are loaded on demand
38///
39/// @see bdlt_calendar, bdlt_calendarloader
40///
41/// # Description {#bdlt_calendarcache-description}
42/// This component defines the `bdlt::CalendarCache` class, a cache
43/// for read-only `bdlt::Calendar` objects. The `bdlt::CalendarCache` class
44/// defines two methods for fetching calendars from the cache: a manipulator
45/// called `getCalendar` and an accessor called `lookupCalendar`. Calendars are
46/// identified by name using C-style strings, and both retrieval methods return
47/// a `bsl::shared_ptr<const bdlt::Calendar>`.
48///
49/// The first time a calendar is requested from the cache using the
50/// `getCalendar` manipulator, the identified calendar is loaded into the cache
51/// using the loader that was supplied upon construction of the cache (see
52/// @ref bdlt_calendarloader ); a reference to that newly-loaded calendar is then
53/// returned. Subsequent requests for the same calendar, using either the
54/// `getCalendar` or `lookupCalendar` method, are efficiently satisfied by
55/// returning references to the cached instance. The `lookupCalendar` accessor
56/// differs from the `getCalendar` manipulator in that when a request is made
57/// through the accessor for a calendar that is *not* present in the cache, the
58/// calendar is not loaded as a side-effect. In this case, an empty
59/// `bsl::shared_ptr<const bdlt::Calendar>` is returned instead, which is
60/// effectively a null pointer. Note that the calendar-naming convention in
61/// effect for a given cache is determined by the concrete loader supplied at
62/// construction of the cache.
63///
64/// Calendars stored in a cache can be explicitly invalidated; the `invalidate`
65/// method is used to invalidate a single calendar and `invalidateAll`
66/// invalidates all calendars in the cache. Invalidated calendars are removed
67/// from the cache. However, a calendar that has been invalidated in the cache
68/// remains valid to all outstanding references to it, obtained via earlier
69/// calls to the `getCalendar` and `lookupCalendar` methods, until all of those
70/// references have been destroyed. Note that a subsequent request, using the
71/// `getCalendar` manipulator, for a calendar that has been invalidated incurs
72/// the overhead of once again loading that calendar into the cache.
73///
74/// Calendars can also be invalidated on the basis of a timeout. To use this
75/// feature of `bdlt::CalendarCache`, a `bsls::TimeInterval` timeout must be
76/// supplied at construction. When a timeout is in effect for a cache, requests
77/// for a calendar from the cache using the `getCalendar` manipulator may incur
78/// the reloading of the calendar if the one in the cache has expired (i.e., the
79/// time interval defined by the timeout value has elapsed since the calendar
80/// was last loaded). In the case of the `lookupCalendar` accessor, an empty
81/// `bsl::shared_ptr<const bdlt::Calendar>` is returned if the requested
82/// calendar is found to have expired.
83///
84/// ## Thread Safety {#bdlt_calendarcache-thread-safety}
85///
86///
87/// The `bdlt::CalendarCache` class is fully thread-safe (see @ref bsldoc_glossary )
88/// provided that the allocator supplied at construction and the default
89/// allocator in effect during the lifetime of cache objects are both fully
90/// thread-safe.
91///
92/// ## Usage {#bdlt_calendarcache-usage}
93///
94///
95/// The following example illustrates how to use a `bdlt::CalendarCache`.
96///
97/// ### Example 1: Using a bdlt::CalendarCache {#bdlt_calendarcache-example-1-using-a-bdlt-calendarcache}
98///
99///
100/// This example shows basic use of a `bdlt::CalendarCache` object.
101///
102/// In this example, we assume a hypothetical calendar loader,
103/// `MyCalendarLoader`, the details of which are not important other than that
104/// it supports calendars identified by "DE", "FR", and "US", which nominally
105/// identify the major holidays in Germany, France, and the United States,
106/// respectively. Furthermore, we cite two specific dates of interest:
107/// 2011/07/04, which was a holiday in the US (Independence Day), but not in
108/// France, and 2011/07/14, which was a holiday in France (Bastille Day), but
109/// not in the US. Note that neither of these dates were holidays in Germany.
110///
111/// First, we create a calendar loader, an instance of `MyCalendarLoader`, and
112/// use it, in turn, to create a cache. For the purposes of this example, it is
113/// sufficient to let the cache use the default allocator:
114/// @code
115/// MyCalendarLoader loader;
116/// bdlt::CalendarCache cache(&loader);
117/// @endcode
118/// Next, we retrieve the calendar `usA`, identified by "US", verify that the
119/// loading of that calendar into the cache was successful (`usA.get()` is
120/// non-null), and verify that 2011/07/04 is recognized as a holiday in the "US"
121/// calendar, whereas 2011/07/14 is not:
122/// @code
123/// bsl::shared_ptr<const bdlt::Calendar> usA = cache.getCalendar("US");
124///
125/// assert( usA.get());
126/// assert( usA->isHoliday(bdlt::Date(2011, 7, 4)));
127/// assert(!usA->isHoliday(bdlt::Date(2011, 7, 14)));
128/// @endcode
129/// Then, we fetch the calendar identified by "FR", this time verifying that
130/// 2011/07/14 is recognized as a holiday in the "FR" calendar, but 2011/07/04
131/// is not:
132/// @code
133/// bsl::shared_ptr<const bdlt::Calendar> frA = cache.getCalendar("FR");
134///
135/// assert( frA.get());
136/// assert(!frA->isHoliday(bdlt::Date(2011, 7, 4)));
137/// assert( frA->isHoliday(bdlt::Date(2011, 7, 14)));
138/// @endcode
139/// Next, we retrieve the "FR" calendar again, this time via the
140/// `lookupCalendar` accessor, and note that the request is satisfied by the
141/// calendar that is already in the cache:
142/// @code
143/// const bdlt::CalendarCache& readonlyCache = cache;
144///
145/// bsl::shared_ptr<const bdlt::Calendar> frB =
146/// readonlyCache.lookupCalendar("FR");
147///
148/// assert( frA.get() == frB.get());
149/// @endcode
150/// Then, we invalidate the "US" calendar in the cache and immediately fetch it
151/// again. The call to `invalidate` removed the "US" calendar from the cache,
152/// so it had to be reloaded into the cache to satisfy the request:
153/// @code
154/// int numInvalidated = cache.invalidate("US");
155/// assert(1 == numInvalidated);
156///
157/// bsl::shared_ptr<const bdlt::Calendar> usB = cache.getCalendar("US");
158///
159/// assert( usB.get() != usA.get());
160/// assert( usB.get());
161/// assert( usB->isHoliday(bdlt::Date(2011, 7, 4)));
162/// assert(!usB->isHoliday(bdlt::Date(2011, 7, 14)));
163/// @endcode
164/// Next, all calendars in the cache are invalidated, then reloaded:
165/// @code
166/// numInvalidated = cache.invalidateAll();
167/// assert(2 == numInvalidated);
168///
169/// bsl::shared_ptr<const bdlt::Calendar> usC = cache.getCalendar("US");
170///
171/// assert( usC.get() != usA.get());
172/// assert( usC.get() != usB.get());
173/// assert( usC.get());
174/// assert( usC->isHoliday(bdlt::Date(2011, 7, 4)));
175/// assert(!usC->isHoliday(bdlt::Date(2011, 7, 14)));
176///
177/// bsl::shared_ptr<const bdlt::Calendar> frC = cache.getCalendar("FR");
178///
179/// assert( frC.get() != frA.get());
180/// assert( frC.get() != frB.get());
181/// assert( frC.get());
182/// assert(!frC->isHoliday(bdlt::Date(2011, 7, 4)));
183/// assert( frC->isHoliday(bdlt::Date(2011, 7, 14)));
184/// @endcode
185/// Now, verify that references to calendars that were invalidated in the cache
186/// are still valid for clients that obtained references to them before they
187/// were made invalid:
188/// @code
189/// assert( usA->isHoliday(bdlt::Date(2011, 7, 4)));
190/// assert(!usA->isHoliday(bdlt::Date(2011, 7, 14)));
191///
192/// assert( usB->isHoliday(bdlt::Date(2011, 7, 4)));
193/// assert(!usB->isHoliday(bdlt::Date(2011, 7, 14)));
194///
195/// assert(!frA->isHoliday(bdlt::Date(2011, 7, 4)));
196/// assert( frA->isHoliday(bdlt::Date(2011, 7, 14)));
197///
198/// assert(!frB->isHoliday(bdlt::Date(2011, 7, 4)));
199/// assert( frB->isHoliday(bdlt::Date(2011, 7, 14)));
200/// @endcode
201/// When `usA`, `usB`, `frA`, and `frB` go out of scope, the resources used by
202/// the calendars to which they refer are automatically reclaimed.
203///
204/// Finally, using the `lookupCalendar` accessor, we attempt to retrieve a
205/// calendar that has not yet been loaded into the cache, but that we *know* to
206/// be supported by the calendar loader. Since the `lookupCalendar` accessor
207/// does not load calendars into the cache as a side-effect, the request fails:
208/// @code
209/// bsl::shared_ptr<const bdlt::Calendar> de =
210/// readonlyCache.lookupCalendar("DE");
211///
212/// assert(!de.get());
213/// @endcode
214///
215/// ### Example 2: A Calendar Cache with a Timeout {#bdlt_calendarcache-example-2-a-calendar-cache-with-a-timeout}
216///
217///
218/// This second example shows the effects on a `bdlt::CalendarCache` object that
219/// is constructed to have a timeout value. Note that the following snippets of
220/// code assume a platform-independent `sleepSeconds` method that sleeps for the
221/// specified number of seconds.
222///
223/// First, we create a calendar loader and a calendar cache. The cache is
224/// constructed to have a timeout of 3 seconds. Of course, such a short timeout
225/// is inappropriate for production use, but it is necessary for illustrating
226/// the effects of a timeout in this example. As in example 1 (above), we again
227/// let the cache use the default allocator:
228/// @code
229/// MyCalendarLoader loader;
230/// bdlt::CalendarCache cache(&loader, bsls::TimeInterval(3, 0));
231/// const bdlt::CalendarCache& readonlyCache = cache;
232/// @endcode
233/// Next, we retrieve the calendar identified by "DE" from the cache:
234/// @code
235/// bsl::shared_ptr<const bdlt::Calendar> deA = cache.getCalendar("DE");
236///
237/// assert( deA.get());
238/// @endcode
239/// Next, we sleep for 2 seconds before retrieving the "FR" calendar:
240/// @code
241/// sleepSeconds(2);
242///
243/// bsl::shared_ptr<const bdlt::Calendar> frA = cache.getCalendar("FR");
244///
245/// assert( frA.get());
246/// @endcode
247/// Next, we sleep for 2 more seconds before attempting to retrieve the "DE"
248/// calendar again, this time using the `lookupCalendar` accessor. Since the
249/// cumulative sleep time exceeds the timeout value established for the cache
250/// when it was constructed, the "DE" calendar has expired; hence, it has been
251/// removed from the cache:
252/// @code
253/// sleepSeconds(2);
254///
255/// bsl::shared_ptr<const bdlt::Calendar> deB =
256/// readonlyCache.lookupCalendar("DE");
257///
258/// assert(!deB.get());
259/// @endcode
260/// Next, we verify that the "FR" calendar is still available in the cache:
261/// @code
262/// bsl::shared_ptr<const bdlt::Calendar> frB =
263/// readonlyCache.lookupCalendar("FR");
264///
265/// assert( frA.get() == frB.get());
266/// @endcode
267/// Finally, we sleep for an additional 2 seconds and verify that the "FR"
268/// calendar has also expired:
269/// @code
270/// sleepSeconds(2);
271///
272/// bsl::shared_ptr<const bdlt::Calendar> frC =
273/// readonlyCache.lookupCalendar("FR");
274///
275/// assert(!frC.get());
276/// @endcode
277/// @}
278/** @} */
279/** @} */
280
281/** @addtogroup bdl
282 * @{
283 */
284/** @addtogroup bdlt
285 * @{
286 */
287/** @addtogroup bdlt_calendarcache
288 * @{
289 */
290
291#include <bdlscm_version.h>
292
293#include <bdlt_calendar.h>
294#include <bdlt_datetime.h>
296
297#include <bslma_allocator.h>
299
301
302#include <bslmt_mutex.h>
303
304#include <bsls_timeinterval.h>
305
306#include <bsl_map.h>
307#include <bsl_memory.h> // 'bsl::shared_ptr'
308#include <bsl_string.h>
309
310#ifndef BDE_DONT_ALLOW_TRANSITIVE_INCLUDES
311#include <bslalg_typetraits.h>
313#endif // BDE_DONT_ALLOW_TRANSITIVE_INCLUDES
314
315
316namespace bdlt {
317
318class CalendarLoader;
319class CalendarCache_Entry;
320
321 // =========================
322 // class CalendarCache_Entry
323 // =========================
324
325// IMPLEMENTATION NOTE: The Sun Studio 12.3 compiler does not support 'map's
326// holding types that are incomplete at the point of declaration of a data
327// member. Other compilers allow us to complete 'CalendarCache_Entry' at a
328// later point in the code, but before any operation (such as 'insert') that
329// would require the type to be complete. If we did not have to support this
330// compiler, this whole class could be defined in the .cpp file; as it stands,
331// it *must* be defined before class 'CalendarCache'.
332
333/// This class defines the type of objects that are inserted into the
334/// calendar cache. Each entry contains a shared pointer to a read-only calendar and the time at which that calendar was loaded.
335///
336/// \note Note that an
337/// explicit allocator is *required* to create an entry object.
338///
339/// See @ref bdlt_calendarcache
341
342 // DATA
343 bsl::shared_ptr<const Calendar> d_ptr; // shared pointer to
344 // out-of-place instance
345
346 Datetime d_loadTime; // time when calendar was
347 // loaded
348
349 public:
350 // CREATORS
351
352 /// Create an empty cache entry object.
353 /// \note Note that an empty cache entry
354 /// is never actually inserted into the cache.
356
357 /// Create a cache entry object for managing the specified `calendar`
358 /// that was loaded at the specified `loadTime` using the specified `allocator`.
359 ///
360 /// \pre The behavior is undefined unless `calendar` uses
361 /// `allocator` to obtain memory.
363 const Datetime& loadTime,
364 bslma::Allocator *allocator);
365
366 /// Create a cache entry object having the value of the specified
367 /// `original` object.
369
370 /// Destroy this cache entry object.
372
373 // MANIPULATORS
374
375 /// Assign to this cache entry object the value of the specified `rhs`
376 /// object, and return a reference providing modifiable access to this
377 /// object.
379
380 // ACCESSORS
381
382 /// Return a shared pointer providing non-modifiable access to the
383 /// calendar referred to by this cache entry object.
385
386 /// Return the time at which the calendar referred to by this cache
387 /// entry object was loaded.
389};
390
391 // ===================
392 // class CalendarCache
393 // ===================
394
395/// This class implements an efficient cache of *read-only* `bdlt::Calendar`
396/// objects that are loaded into the cache, using a calendar loader supplied
397/// at construction, as a side-effect of the `getCalendar` manipulator.
398/// Calendars in the cache can be invalidated, and removed from the cache
399/// via the `invalidate` and `invalidateAll` methods. In addition,
400/// calendars in the cache can be made to expire based on a timeout that may
401/// be optionally supplied at construction. The
402/// `bsl::shared_ptr<const bdlt::Calendar>` objects returned from the
403/// `getCalendar` and `lookupCalendar` methods allow for the safe removal of
404/// calendars from the cache that may still have outstanding references to
405/// them.
406///
407/// This container is *exception* *neutral* with no guarantee of rollback:
408/// if an exception is thrown during the invocation of a method on a
409/// pre-existing instance, the container is left in a valid state, but its
410/// value is undefined. In no event is memory leaked.
411///
412/// This class is fully thread-safe (see @ref bsldoc_glossary ).
413///
414/// See @ref bdlt_calendarcache
416
417 // DATA
419 d_cache; // cache of (name, handle) pairs
420
421 CalendarLoader *d_loader_p; // calendar loader (held, not
422 // owned)
423
424 DatetimeInterval d_timeOut; // timeout value; ignored unless
425 // 'd_hasTimeOutFlag' is 'true'
426
427 bool d_hasTimeOutFlag; // 'true' if this cache has a
428 // timeout value and 'false'
429 // otherwise
430
431 mutable bslmt::Mutex d_lock; // guard access to cache
432
433 bslma::Allocator *d_allocator_p; // memory allocator (held, not
434 // owned)
435
436 private:
437 // PRIVATE TYPES
439
441 ConstCacheIterator;
442
443 private:
444 // NOT IMPLEMENTED
446 CalendarCache& operator=(const CalendarCache&);
447
448 public:
449 // CREATORS
450
451 /// Create an empty calendar cache that uses the specified `loader` to
452 /// load calendars on demand and has no timeout. Optionally specify a
453 /// `basicAllocator` used to supply memory. If `basicAllocator` is 0,
454 /// the currently installed default allocator is used. Calendars loaded
455 /// into this cache remain valid for retrieval until they have been
456 /// explicitly invalidated (via either the `invalidate` or
457 /// `invalidateAll` methods), or until this object is destroyed.
458 ///
459 /// \pre The behavior is undefined unless `loader` remains valid throughout the
460 /// lifetime of this cache.
461 explicit
463 bslma::Allocator *basicAllocator = 0);
464
465 /// Create an empty calendar cache that uses the specified `loader` to
466 /// load calendars on demand and has the specified `timeout` interval
467 /// indicating the length of time that calendars remain valid for
468 /// subsequent retrieval from the cache after they have been loaded.
469 /// Optionally specify a `basicAllocator` used to supply memory. If
470 /// `basicAllocator` is 0, the currently installed default allocator is used.
471 ///
472 /// \pre The behavior is undefined unless
473 /// `bsls::TimeInterval() <= timeout <= bsls::TimeInterval(INT_MAX, 0)`,
474 /// and `loader` remains valid throughout the lifetime of this cache.
475 ///
476 /// \note Note that a `timeout` value of 0 indicates that a calendar will be
477 /// loaded into the cache by *each* (successful) call to the
478 /// `getCalendar` method.
480 const bsls::TimeInterval& timeout,
481 bslma::Allocator *basicAllocator = 0);
482
483 /// Destroy this object.
485
486 // MANIPULATORS
487
488 /// Return a shared pointer providing non-modifiable access to the
489 /// calendar having the specified `calendarName` in this calendar cache,
490 /// loading the calendar into the cache using the loader that was
491 /// supplied at construction if the calendar is not already present in
492 /// the cache or if the calendar has expired (i.e., per a timeout
493 /// optionally supplied at construction). If the loader fails, whether
494 /// in loading a calendar for the first time or in reloading a calendar
495 /// that has expired, return an empty shared pointer.
497
498 /// Invalidate the calendar having the specified `calendarName` in this
499 /// calendar cache, and remove it from the cache. If a calendar having
500 /// `calendarName` is not present in this cache, this method has no
501 /// effect. Return the number of calendars that were invalidated.
502 ///
503 /// \note Note that a calendar that has been invalidated in the cache remains valid
504 /// to all outstanding references to it, obtained via earlier calls to
505 /// the `getCalendar` and `lookupCalendar` methods, until all of those
506 /// references have been destroyed.
507 int invalidate(const char *calendarName);
508
509 /// Invalidate all calendars in this calendar cache, and remove them
510 /// from the cache. Return the number of calendars that were invalidated.
511 ///
512 /// \note Note that a calendar that has been invalidated in the
513 /// cache remains valid to all outstanding references to it, obtained
514 /// via earlier calls to the `getCalendar` and `lookupCalendar` methods,
515 /// until all of those references have been destroyed.
517
518 // ACCESSORS
519
520 /// Return a shared pointer providing non-modifiable access to the
521 /// calendar having the specified `calendarName` in this calendar cache.
522 /// If the calendar having `calendarName` is not found in the cache, or
523 /// if the calendar has expired (i.e., per a timeout optionally supplied
524 /// at construction), return an empty shared pointer.
526 lookupCalendar(const char *calendarName) const;
527
528 /// Return the datetime, in Coordinated Universal Time (UTC), at which
529 /// the calendar having the specified `calendarName` was loaded into
530 /// this calendar cache. If the calendar having `calendarName` is not
531 /// found in the cache, or if the calendar has expired (i.e., per a
532 /// timeout optionally supplied at construction), return `Datetime()`.
533 Datetime lookupLoadTime(const char *calendarName) const;
534};
535
536// ============================================================================
537// INLINE DEFINITIONS
538// ============================================================================
539
540} // close package namespace
541
542
543// TRAITS
544
545
546namespace bslma {
547
548template <>
549struct UsesBslmaAllocator<bdlt::CalendarCache> : bsl::true_type {};
550
551} // close namespace bslma
552
553
554#endif
555
556// ----------------------------------------------------------------------------
557// Copyright 2018 Bloomberg Finance L.P.
558//
559// Licensed under the Apache License, Version 2.0 (the "License");
560// you may not use this file except in compliance with the License.
561// You may obtain a copy of the License at
562//
563// http://www.apache.org/licenses/LICENSE-2.0
564//
565// Unless required by applicable law or agreed to in writing, software
566// distributed under the License is distributed on an "AS IS" BASIS,
567// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
568// See the License for the specific language governing permissions and
569// limitations under the License.
570// ----------------------------- END-OF-FILE ----------------------------------
571
572/** @} */
573/** @} */
574/** @} */
Definition bdlt_calendarcache.h:340
CalendarCache_Entry()
CalendarCache_Entry & operator=(const CalendarCache_Entry &rhs)
CalendarCache_Entry(const CalendarCache_Entry &original)
~CalendarCache_Entry()
Destroy this cache entry object.
Datetime loadTime() const
bsl::shared_ptr< const Calendar > get() const
CalendarCache_Entry(Calendar *calendar, const Datetime &loadTime, bslma::Allocator *allocator)
Definition bdlt_calendarcache.h:415
Datetime lookupLoadTime(const char *calendarName) const
~CalendarCache()
Destroy this object.
bsl::shared_ptr< const Calendar > getCalendar(const char *calendarName)
CalendarCache(CalendarLoader *loader, bslma::Allocator *basicAllocator=0)
bsl::shared_ptr< const Calendar > lookupCalendar(const char *calendarName) const
int invalidate(const char *calendarName)
CalendarCache(CalendarLoader *loader, const bsls::TimeInterval &timeout, bslma::Allocator *basicAllocator=0)
Definition bdlt_calendarloader.h:322
Definition bdlt_calendar.h:570
Definition bdlt_datetimeinterval.h:201
Definition bdlt_datetime.h:330
Definition bslstl_map.h:653
BloombergLP::bslstl::TreeIterator< const value_type, Node, difference_type > const_iterator
Definition bslstl_map.h:758
BloombergLP::bslstl::TreeIterator< value_type, Node, difference_type > iterator
Definition bslstl_map.h:756
Definition bslstl_sharedptr.h:1838
Definition bslma_allocator.h:545
Definition bslmt_mutex.h:317
Definition bsls_timeinterval.h:307
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
Definition bbldc_basicisma30360.h:112
Definition baljsn_encoder_testtypes.h:76
Definition bslma_usesbslmaallocator.h:344