BDE 4.39.x Production Release
Loading...
Searching...
No Matches
bdlt_timetz.h
Go to the documentation of this file.
1/// @file bdlt_timetz.h
2///
3/// The content of this file has been pre-processed for Doxygen.
4///
5
6
7// bdlt_timetz.h -*-C++-*-
8#ifndef INCLUDED_BDLT_TIMETZ
9#define INCLUDED_BDLT_TIMETZ
10
11#include <bsls_ident.h>
12BSLS_IDENT("$Id: $")
13
14/// @defgroup bdlt_timetz bdlt_timetz
15/// @brief Provide a representation of a time with time zone offset.
16/// @addtogroup bdl
17/// @{
18/// @addtogroup bdlt
19/// @{
20/// @addtogroup bdlt_timetz
21/// @{
22///
23/// <h1> Outline </h1>
24/// * <a href="#bdlt_timetz-purpose"> Purpose</a>
25/// * <a href="#bdlt_timetz-classes"> Classes </a>
26/// * <a href="#bdlt_timetz-description"> Description </a>
27/// * <a href="#bdlt_timetz-attributes"> Attributes </a>
28/// * <a href="#bdlt_timetz-caveats-on-time-zone-support"> Caveats on Time Zone Support </a>
29/// * <a href="#bdlt_timetz-iso-standard-text-representation"> ISO Standard Text Representation </a>
30/// * <a href="#bdlt_timetz-usage"> Usage </a>
31/// * <a href="#bdlt_timetz-example-1-comparing-times-from-multiple-time-zones"> Example 1: Comparing Times from Multiple Time Zones </a>
32///
33/// # Purpose {#bdlt_timetz-purpose}
34/// Provide a representation of a time with time zone offset.
35///
36/// # Classes {#bdlt_timetz-classes}
37///
38/// - bdlt::TimeTz: local-time value with time zone offset from UTC
39///
40/// @see bdlt_time, bdlt_datetimetz, bdlt_timetzformatter, bdlt_formatdoc
41///
42/// # Description {#bdlt_timetz-description}
43/// This component provides a single, simply constrained
44/// value-semantic class, `bdlt::TimeTz`, that represents a time value in a
45/// particular time zone. Each `bdlt::TimeTz` object contains a time zone
46/// offset from UTC (in minutes) and a `bdlt::Time` value in that time zone.
47/// For logical consistency, the time value and offset should correspond to a
48/// geographically valid time zone, but such consistency is the user's
49/// responsibility. This component does not enforce logical constraints on any
50/// values.
51///
52/// The `localTime` and `utcTime` methods return `bdlt::Time` values
53/// corresponding to the local time and UTC time represented by the object,
54/// respectively. In addition, the `offset` method returns the time zone offset
55/// in minutes from UTC (i.e., `UTC + offset` equals local time).
56///
57/// ## Attributes {#bdlt_timetz-attributes}
58///
59///
60/// @code
61/// Name Type Default Simple Constraints
62/// ------------------ ----------- -------------- ------------------
63/// localTime bdlt::Time '24:00:00.000' none
64/// offset int 0 ( -1440 .. 1440 )
65/// @endcode
66/// * `localTime`: local time in the timezone described by `offset`.
67/// * `offset`: offset from UTC (in minutes) of the time zone in which
68/// `localTime` occurs.
69///
70/// ## Caveats on Time Zone Support {#bdlt_timetz-caveats-on-time-zone-support}
71///
72///
73/// A `bdlt::TimeTz` value is intended to be interpreted as a value in a local
74/// time zone, along with the offset of that value from UTC. However, there are
75/// some problems with this simple interpretation. First of all, the offset
76/// value may not correspond to any time zone that has ever existed. For
77/// example, the offset value could be set to one minute, or to 1,234 minutes.
78/// The meaning of the resulting "local time" value is always clear, but the
79/// local time might not correspond to any geographical or historical time zone.
80///
81/// For these reasons (and others), this component cannot and does not perform
82/// any validation relating to time zones or offsets. The user must take care
83/// to honor the "local time" contract of this component.
84///
85/// ## ISO Standard Text Representation {#bdlt_timetz-iso-standard-text-representation}
86///
87///
88/// A common standard text representation of a date and time value is described
89/// by ISO 8601. BDE provides the @ref bdlt_iso8601util component for conversion
90/// to and from the standard ISO8601 format.
91///
92/// ## Usage {#bdlt_timetz-usage}
93///
94///
95/// This section illustrates intended use of this component.
96///
97/// ### Example 1: Comparing Times from Multiple Time Zones {#bdlt_timetz-example-1-comparing-times-from-multiple-time-zones}
98///
99///
100/// Some legacy systems may represent points in time as a combination of a local
101/// time-of-day plus an offset from UTC, with an underlying assumption that the
102/// dates on which points in time occur can be inferred from context. Assuming
103/// that we know that two such times fall on the same (local) calendar date, we
104/// can determine whether or not the two times coincide by comparing their
105/// `bdlt::TimeTz` representations.
106///
107/// First, we define three `bdlt::TimeTz` objects representing the time in three
108/// different time zones on the same (local) date:
109/// @code
110/// bdlt::TimeTz newYorkTime(bdlt::Time(9, 30, 0, 0.0),
111/// -5 * bdlt::TimeUnitRatio::k_MINUTES_PER_HOUR);
112/// bdlt::TimeTz chicagoTime(bdlt::Time(8, 30, 0, 0.0),
113/// -6 * bdlt::TimeUnitRatio::k_MINUTES_PER_HOUR);
114/// bdlt::TimeTz phoenixTime(bdlt::Time(6, 30, 0, 0.0),
115/// -7 * bdlt::TimeUnitRatio::k_MINUTES_PER_HOUR);
116/// @endcode
117/// Then, we observe that the local times are distinct:
118/// @code
119/// assert(newYorkTime.localTime() != chicagoTime.localTime());
120/// assert(chicagoTime.localTime() != phoenixTime.localTime());
121/// assert(phoenixTime.localTime() != newYorkTime.localTime());
122/// @endcode
123/// Next, we observe that `newYorkTime` and `chicagoTime` actually represent the
124/// same point in time:
125/// @code
126/// assert(newYorkTime.utcTime() == chicagoTime.utcTime());
127/// @endcode
128/// Finally, we observe that `phoenixTime` is one hour earlier than
129/// `newYorkTime`:
130/// @code
131/// bdlt::DatetimeInterval delta =
132/// newYorkTime.utcTime() - phoenixTime.utcTime();
133///
134/// assert(0 == delta.days());
135/// assert(1 == delta.hours());
136/// assert(0 == delta.minutes());
137/// assert(0 == delta.seconds());
138/// assert(0 == delta.milliseconds());
139/// @endcode
140/// @}
141/** @} */
142/** @} */
143
144/** @addtogroup bdl
145 * @{
146 */
147/** @addtogroup bdlt
148 * @{
149 */
150/** @addtogroup bdlt_timetz
151 * @{
152 */
153
154#include <bdlscm_version.h>
155
156#include <bdlt_time.h>
157
158#include <bslh_hash.h>
159
162
163#include <bsls_annotation.h>
164#include <bsls_assert.h>
165#include <bsls_review.h>
166
167#include <bsl_iosfwd.h>
168
169
170
171namespace bdlt {
172
173 // ============
174 // class TimeTz
175 // ============
176
177/// This value-semantic class describes a time value in a particular time
178/// zone, which is indicated using an offset from UTC (in minutes). The
179/// offset is available via the `offset` method, and is defined by the
180/// relationship: `localTime() - offset() == utcTime`. The time and offset
181/// values are logically assumed to correspond to geographically valid
182/// values, however, this constraint is not enforced.
183///
184/// This class:
185/// * supports a complete set of *value-semantic* operations
186/// * supports BDEX streaming
187/// For terminology see @ref bsldoc_glossary .
188///
189/// See @ref bdlt_timetz
190class TimeTz {
191 // PRIVATE TYPES
192
193 /// This enumeration specifies the minimum and maximum time zone offset
194 /// values.
195 enum ValidOffsetRange {
196
197 k_MAX_OFFSET = 1440,
198 k_MIN_OFFSET = -1440
199 };
200
201 // DATA
202 Time d_localTime; // time value in timezone specified by `d_offset`
203 int d_offset; // offset from UTC (in minutes)
204
205 public:
206 // CLASS METHODS
207
208 /// Return `true` if the specified `localTime` and the specified time
209 /// zone `offset` represent a valid `TimeTz` value, and `false`
210 /// otherwise. A `localTime` and `offset` represent a valid `TimeTz`
211 /// value if `offset` is in the range `( -1440 .. 1440 )`, and `offset` is 0 if `localTime` has the value `24:00:00.000`.
212 ///
213 /// \note Note that a
214 /// `true` result from this function does not guarantee that `offset`
215 /// corresponds to any geographical or historical time zone. Also note
216 /// that a `true` result from this function does not guarantee that
217 /// `localTime` itself is a valid `Time` object.
218 static bool isValid(const Time& localTime, int offset);
219
220 // BDEX Streaming
221
222 /// Return the maximum valid BDEX format version, as indicated by the
223 /// specified `versionSelector`, to be passed to the `bdexStreamOut` method.
224 ///
225 /// \note Note that it is highly recommended that `versionSelector`
226 /// be formatted as "YYYYMMDD", a date representation. Also note that
227 /// `versionSelector` should be a *compile*-time-chosen value that
228 /// selects a format version supported by both externalizer and
229 /// unexternalizer. See the `bslx` package-level documentation for more
230 /// information on BDEX streaming of value-semantic types and
231 /// containers.
232 static int maxSupportedBdexVersion(int versionSelector);
233
234 // CREATORS
235
236 /// Create a `TimeTz` object having the (default) attribute values.
237 TimeTz();
238
239 /// Create a `TimeTz` object whose local time and offset attributes have
240 /// the specified `localTime` and `offset` values respectively.
241 ///
242 /// \pre The behavior is undefined unless `offset` is in the range
243 /// `( -1440 .. 1440 )`, and `offset` is 0 if `localTime` has the value `24:00:00.000`.
244 ///
245 /// \note Note that this method provides no validation, and
246 /// it is the user's responsibility to ensure that `offset` represents a
247 /// valid time zone and that `localTime` represents a valid time in that
248 /// time zone.
249 TimeTz(const Time& localTime, int offset);
250
251 /// Construct a `TimeTz` object having the same value as the specified
252 /// `original` `TimeTz` object.
253 TimeTz(const TimeTz& original);
254
255 /// Destroy this object.
256 ~TimeTz();
257
258 // MANIPULATORS
259
260 /// Assign to this object the value of the specified `rhs` object, and
261 /// return a reference providing modifiable access to this object.
262 TimeTz& operator=(const TimeTz& rhs);
263
264 /// Set the local time and time zone offset attributes of this object to
265 /// the specified `localTime` and `offset` values respectively.
266 ///
267 /// \pre The behavior is undefined unless `offset` is in the range `( -1440 .. 1440 )`.
268 ///
269 /// \note Note that this method provides no validation,
270 /// and it is the user's responsibility to assure the consistency of the
271 /// resulting value.
272 void setTimeTz(const Time& localTime, int offset);
273
274 /// Set the local time and the time zone offset of this object to the
275 /// specified `localTime` and `offset` values respectively if
276 /// `localTime` and `offset` represent a valid `TimeTz` value, and leave
277 /// the object unmodified otherwise. Return 0 on success, and a
278 /// non-zero value otherwise.
279 int setTimeTzIfValid(const Time& localTime, int offset);
280
281 // Aspects
282
283 /// Assign to this object the value read from the specified input
284 /// `stream` using the specified `version` format, and return a
285 /// reference to `stream`. If `stream` is initially invalid, this
286 /// operation has no effect. If `version` is not supported, this object
287 /// is unaltered and `stream` is invalidated, but otherwise unmodified.
288 /// If `version` is supported but `stream` becomes invalid during this
289 /// operation, this object has an undefined, but valid, state.
290 ///
291 /// \note Note that no version is read from `stream`. See the `bslx` package-level
292 /// documentation for more information on BDEX streaming of
293 /// value-semantic types and containers.
294 template <class STREAM>
295 STREAM& bdexStreamIn(STREAM& stream, int version);
296
297 // ACCESSORS
298
299 /// Return a `Time` object having the value of the local time attribute of this object.
300 ///
301 /// \note Note that the `Time` value returned is the value
302 /// stored in this object, and may be different from the local time of
303 /// the system.
304 Time localTime() const;
305
306 /// Return the time zone offset of this object in minutes from UTC.
307 int offset() const;
308
309 /// Return a `Time` object having the value of the UTC time represented by this object.
310 ///
311 /// \note Note that the returned value is equal to
312 /// `localTime() - offset()` minutes.
313 Time utcTime() const;
314
315 // Aspects
316
317 /// Write the value of this object, using the specified `version`
318 /// format, to the specified output `stream`, and return a reference to
319 /// `stream`. If `stream` is initially invalid, this operation has no
320 /// effect. If `version` is not supported, `stream` is invalidated, but otherwise unmodified.
321 ///
322 /// \note Note that `version` is not written to
323 /// `stream`. See the `bslx` package-level documentation for more
324 /// information on BDEX streaming of value-semantic types and
325 /// containers.
326 template <class STREAM>
327 STREAM& bdexStreamOut(STREAM& stream, int version) const;
328
329 /// Write the value of this object to the specified output `stream` in a
330 /// human-readable format, and return a reference to `stream`.
331 /// Optionally specify an initial indentation `level`, whose absolute
332 /// value is incremented recursively for nested objects. If `level` is
333 /// specified, optionally specify `spacesPerLevel`, whose absolute value
334 /// indicates the number of spaces per indentation level for this and
335 /// all of its nested objects. If `level` is negative, suppress
336 /// indentation of the first line. If `spacesPerLevel` is negative,
337 /// format the entire output on one line, suppressing all but the
338 /// initial indentation (as governed by `level`). If `stream` is not valid on entry, this operation has no effect.
339 ///
340 /// \note Note that the format
341 /// is not fully specified, and can change without notice.
342 bsl::ostream& print(bsl::ostream& stream,
343 int level = 0,
344 int spacesPerLevel = 4) const;
345
346#ifndef BDE_OPENSOURCE_PUBLICATION // pending deprecation
347
348 // DEPRECATED
349
350 /// Return a `Time` object having the value of the UTC time represented by this object.
351 ///
352 /// \note Note that the returned value is equal to
353 /// `localTime() - offset()` minutes.
354 ///
355 /// @deprecated replaced by `utcTime`.
356 Time gmtTime() const;
357
358 /// Return the most current BDEX streaming version number supported by
359 /// this class.
360 ///
361 /// @deprecated Use @ref maxSupportedBdexVersion(int) instead.
362 static int maxSupportedBdexVersion();
363
364 /// Set the local time and the time zone offset of this object to the
365 /// specified `localTime` and `offset` values respectively if
366 /// `localTime` and `offset` represent a valid `TimeTz` value. Return 0
367 /// on success, and a non-zero value with no effect on this object
368 /// otherwise.
369 ///
370 /// @deprecated replaced by `setTimeTzIfValid`.
371 int validateAndSetTimeTz(const Time& localTime, int offset);
372
373#endif // BDE_OPENSOURCE_PUBLICATION -- pending deprecation
374};
375
376// FREE OPERATORS
377
378/// Return `true` if the specified `lhs` and `rhs` objects have the same
379/// value, and `false` otherwise. Two `TimeTz` objects have the same value
380/// if their corresponding `localTime` and `offset` attributes have the same
381/// values.
382bool operator==(const TimeTz& lhs, const TimeTz& rhs);
383
384/// Return `true` if the specified `lhs` and `rhs` objects do not have the
385/// same value, and `false` otherwise. Two `TimeTz` objects do not have the
386/// same value if any of their corresponding `localTime` and `offset`
387/// attributes have different values.
388bool operator!=(const TimeTz& lhs, const TimeTz& rhs);
389
390/// Write the value of the specified `object` to the specified output
391/// `stream` in a single-line format, and return a reference providing
392/// modifiable access to `stream`. If `stream` is not valid on entry, this operation has no effect.
393///
394/// \note Note that this human-readable format is not
395/// fully specified and can change without notice. Also note that this
396/// method has the same behavior as `object.print(stream, 0, -1)`, but with
397/// the attribute names elided.
398bsl::ostream& operator<<(bsl::ostream& stream, const TimeTz& object);
399
400// FREE FUNCTIONS
401
402/// Pass the specified `object` to the specified `hashAlg`. This function
403/// integrates with the `bslh` modular hashing system and effectively provides a `bsl::hash` specialization for `TimeTz`.
404///
405/// \note Note that two
406/// objects which represent the same UTC time but have different offsets
407/// will not (necessarily) hash to the same value.
408template <class HASHALG>
409void hashAppend(HASHALG& hashAlg, const TimeTz& object);
410
411// ============================================================================
412// INLINE DEFINITIONS
413// ============================================================================
414
415 // ------------
416 // class TimeTz
417 // ------------
418
419// CLASS METHODS
420inline
421bool TimeTz::isValid(const Time& localTime, int offset)
422{
423 return offset > k_MIN_OFFSET
424 && offset < k_MAX_OFFSET
425 && (bdlt::Time() != localTime || 0 == offset);
426}
427
428 // Aspects
429
430inline
431int TimeTz::maxSupportedBdexVersion(int versionSelector)
432{
433 if (versionSelector >= 20170401) {
434 return 2; // RETURN
435 }
436 return 1;
437}
438
439// CREATORS
440inline
442: d_localTime()
443, d_offset(0)
444{
445}
446
447inline
448TimeTz::TimeTz(const Time& localTime, int offset)
449: d_localTime(localTime)
450, d_offset(offset)
451{
453}
454
455inline
456TimeTz::TimeTz(const TimeTz& original)
457: d_localTime(original.d_localTime)
458, d_offset(original.d_offset)
459{
460}
461
462inline
464{
465 BSLS_REVIEW(isValid(d_localTime, d_offset));
466}
467
468// MANIPULATORS
469inline
471{
472 d_localTime = rhs.d_localTime;
473 d_offset = rhs.d_offset;
474
475 return *this;
476}
477
478inline
479void TimeTz::setTimeTz(const Time& localTime, int offset)
480{
482
483 d_localTime = localTime;
484 d_offset = offset;
485}
486
487inline
488int TimeTz::setTimeTzIfValid(const Time& localTime, int offset)
489{
490 if (isValid(localTime, offset)) {
492
493 return 0; // RETURN
494 }
495 return -1;
496}
497
498 // Aspects
499
500template <class STREAM>
501STREAM& TimeTz::bdexStreamIn(STREAM& stream, int version)
502{
503 if (stream) {
504 switch (version) { // switch on the schema version
505 case 2:
507 case 1: {
508 Time time;
509 time.bdexStreamIn(stream, version);
510
511 int offset = 0;
512 stream.getInt32(offset);
513
514 if (stream && isValid(time, offset)) {
515 setTimeTz(time, offset);
516 }
517 else {
518 stream.invalidate();
519 }
520 } break;
521 default: {
522 stream.invalidate(); // unrecognized version number
523 }
524 }
525 }
526 return stream;
527}
528
529// ACCESSORS
530inline
532{
533 return d_localTime;
534}
535
536inline
537int TimeTz::offset() const
538{
539 return d_offset;
540}
541
542inline
544{
545 Time utc(d_localTime);
546
547 if (d_offset) {
548 // N.B. adding -0 minutes to a default-constructed `Time` object (with
549 // value '24:00:00.000') would convert it to a `Time` object with value
550 // '00:00:00.000'. The branch here preserves the `localTime` attribute
551 // for a default-constructed `TimeTz` object.
552
553 utc.addMinutes(-d_offset);
554 }
555
556 return utc;
557}
558
559 // Aspects
560
561template <class STREAM>
562STREAM& TimeTz::bdexStreamOut(STREAM& stream, int version) const
563{
564 if (stream) {
565 switch (version) { // switch on the schema version
566 case 2:
568 case 1: {
569 d_localTime.bdexStreamOut(stream, version);
570 stream.putInt32(d_offset);
571 } break;
572 default: {
573 stream.invalidate(); // unrecognized version number
574 }
575 }
576 }
577 return stream;
578}
579
580#ifndef BDE_OPENSOURCE_PUBLICATION // pending deprecation
581// DEPRECATED
582inline
584{
585 return utcTime();
586}
587
588inline
593
594inline
595int TimeTz::validateAndSetTimeTz(const Time& localTime, int offset)
596{
598}
599#endif // BDE_OPENSOURCE_PUBLICATION -- pending deprecation
600
601} // close package namespace
602
603// FREE OPERATORS
604inline
605bool bdlt::operator==(const TimeTz& lhs, const TimeTz& rhs)
606{
607 return lhs.localTime() == rhs.localTime()
608 && lhs.offset() == rhs.offset();
609}
610
611inline
612bool bdlt::operator!=(const TimeTz& lhs, const TimeTz& rhs)
613{
614 return lhs.localTime() != rhs.localTime()
615 || lhs.offset() != rhs.offset();
616}
617
618inline
619bsl::ostream& bdlt::operator<<(bsl::ostream& stream, const TimeTz& object)
620{
621 return object.print(stream, 0, -1);
622}
623
624// FREE FUNCTIONS
625template <class HASHALG>
626inline
627void bdlt::hashAppend(HASHALG& hashAlg, const TimeTz& object)
628{
629 using ::BloombergLP::bslh::hashAppend;
630 hashAppend(hashAlg, object.localTime());
631 hashAppend(hashAlg, object.offset());
632}
633
634namespace bslmf {
635
636// TRAITS
637
638/// This template specialization for `IsBitwiseCopyable` indicates that
639/// `bdlt::TimeTz` is a bitwise copyable type.
640template <>
641struct IsBitwiseCopyable<BloombergLP::bdlt::TimeTz> : bsl::true_type {
642};
643
644} // close namespace bslmf
645
646
647#endif
648
649// ----------------------------------------------------------------------------
650// Copyright 2014 Bloomberg Finance L.P.
651//
652// Licensed under the Apache License, Version 2.0 (the "License");
653// you may not use this file except in compliance with the License.
654// You may obtain a copy of the License at
655//
656// http://www.apache.org/licenses/LICENSE-2.0
657//
658// Unless required by applicable law or agreed to in writing, software
659// distributed under the License is distributed on an "AS IS" BASIS,
660// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
661// See the License for the specific language governing permissions and
662// limitations under the License.
663// ----------------------------- END-OF-FILE ----------------------------------
664
665/** @} */
666/** @} */
667/** @} */
Definition bdlt_timetz.h:190
Time localTime() const
Definition bdlt_timetz.h:531
void setTimeTz(const Time &localTime, int offset)
Definition bdlt_timetz.h:479
STREAM & bdexStreamOut(STREAM &stream, int version) const
Definition bdlt_timetz.h:562
bsl::ostream & print(bsl::ostream &stream, int level=0, int spacesPerLevel=4) const
TimeTz()
Create a TimeTz object having the (default) attribute values.
Definition bdlt_timetz.h:441
Time gmtTime() const
Definition bdlt_timetz.h:583
TimeTz & operator=(const TimeTz &rhs)
Definition bdlt_timetz.h:470
int validateAndSetTimeTz(const Time &localTime, int offset)
Definition bdlt_timetz.h:595
~TimeTz()
Destroy this object.
Definition bdlt_timetz.h:463
static bool isValid(const Time &localTime, int offset)
Definition bdlt_timetz.h:421
Time utcTime() const
Definition bdlt_timetz.h:543
static int maxSupportedBdexVersion()
Definition bdlt_timetz.h:589
int offset() const
Return the time zone offset of this object in minutes from UTC.
Definition bdlt_timetz.h:537
int setTimeTzIfValid(const Time &localTime, int offset)
Definition bdlt_timetz.h:488
STREAM & bdexStreamIn(STREAM &stream, int version)
Definition bdlt_timetz.h:501
Definition bdlt_time.h:195
STREAM & bdexStreamIn(STREAM &stream, int version)
Definition bdlt_time.h:886
int addMinutes(int minutes)
STREAM & bdexStreamOut(STREAM &stream, int version) const
Definition bdlt_time.h:966
#define BSLS_ANNOTATION_FALLTHROUGH
Definition bsls_annotation.h:410
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_REVIEW(X)
Definition bsls_review.h:1019
void hashAppend(HASH_ALGORITHM &hashAlgorithm, const BigEndianInt16 &object)
Definition bbldc_basicisma30360.h:112
bool operator==(const Calendar &lhs, const Calendar &rhs)
bsl::ostream & operator<<(bsl::ostream &stream, const Calendar &calendar)
void hashAppend(HASHALG &hashAlg, const Calendar &object)
bool operator!=(const Calendar &lhs, const Calendar &rhs)
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
ALLOCATOR & lhs
Definition bslstl_string.h:3917
Definition bdlbb_blob.h:579