BDE 4.14.0 Production release
Loading...
Searching...
No Matches
bslma_usesbslmaallocator.h
Go to the documentation of this file.
1/// @file bslma_usesbslmaallocator.h
2///
3/// The content of this file has been pre-processed for Doxygen.
4///
5
6
7// bslma_usesbslmaallocator.h -*-C++-*-
8#ifndef INCLUDED_BSLMA_USESBSLMAALLOCATOR
9#define INCLUDED_BSLMA_USESBSLMAALLOCATOR
10
11#include <bsls_ident.h>
12BSLS_IDENT("$Id: $")
13
14/// @defgroup bslma_usesbslmaallocator bslma_usesbslmaallocator
15/// @brief Provide a metafunction to indicate the use of `bslma` allocators.
16/// @addtogroup bsl
17/// @{
18/// @addtogroup bslma
19/// @{
20/// @addtogroup bslma_usesbslmaallocator
21/// @{
22///
23/// <h1> Outline </h1>
24/// * <a href="#bslma_usesbslmaallocator-purpose"> Purpose</a>
25/// * <a href="#bslma_usesbslmaallocator-classes"> Classes </a>
26/// * <a href="#bslma_usesbslmaallocator-description"> Description </a>
27/// * <a href="#bslma_usesbslmaallocator-trait-description"> Trait Description </a>
28/// * <a href="#bslma_usesbslmaallocator-properties-of-types-declaring-the-usesbslmaallocator-trait"> Properties of Types Declaring the UsesBslmaAllocator Trait </a>
29/// * <a href="#bslma_usesbslmaallocator-compiler-enforced-requirements-of-types-declaring-usesbslmaallocator"> Compiler-Enforced Requirements of Types Declaring UsesBslmaAllocator </a>
30/// * <a href="#bslma_usesbslmaallocator-expected-properties-of-types-declaring-the-usesbslmaallocator-trait"> Expected Properties of Types Declaring the UsesBslmaAllocator Trait </a>
31/// * <a href="#bslma_usesbslmaallocator-usage"> Usage </a>
32/// * <a href="#bslma_usesbslmaallocator-example-1-associating-the-bslma-allocator-trait-with-a-type"> Example 1: Associating the bslma Allocator Trait with a Type </a>
33/// * <a href="#bslma_usesbslmaallocator-example-2-testing-whether-a-type-uses-a-bslma-allocator"> Example 2: Testing Whether a Type Uses a bslma Allocator </a>
34///
35/// # Purpose {#bslma_usesbslmaallocator-purpose}
36/// Provide a metafunction to indicate the use of `bslma` allocators.
37///
38/// # Classes {#bslma_usesbslmaallocator-classes}
39///
40/// - bslma::UsesBslmaAllocator: trait detection metafunction for `bslma` use
41///
42/// @see bslalg_typetraitusesblsmaallocator
43///
44/// # Description {#bslma_usesbslmaallocator-description}
45/// This component defines a metafunction,
46/// `bslma::UsesBslmaAllocator`, that may be used to associate a type with the
47/// uses-`bslma`-allocator trait (i.e., declare that a type uses a `bslma`
48/// allocator), and also to detect whether a type has been associated with that
49/// trait (i.e., to test whether a type uses a `bslma` allocator, and follows
50/// the `bslma` allocator model).
51///
52/// ## Trait Description {#bslma_usesbslmaallocator-trait-description}
53///
54///
55/// `bslma::UsesBslmaAllocator<TYPE>` derives from `bsl::true_type` if `TYPE` is
56/// a complete object type and one or more of the following are true:
57///
58/// * `bslma::UsesBslmaAllocator<TYPE>` is explicitly specialized to derive
59/// from `bsl::true_type`.
60/// * `TYPE` has a 'BSLMF_NESTED_TRAIT_DECLARATION(TYPE,
61/// bslma::UsesBslmaAllocator);' declaration.
62/// * There exists a nested `TYPE::allocator_type` that is convertible from
63/// `bslma::Allocator *`. Note that inheriting from a class that defines
64/// `allocator_type` will implicitly make `UsesBslmaAllocator` true for the
65/// derived class. To suppress this behavior, create a nested typedef
66/// `allocator_type` in the derived class that aliases `void`.
67/// * `bslma::Allocator *` is implicitly convertible to `TYPE` but other,
68/// arbitrary, pointers are NOT implicitly convertible to `TYPE`. Note that
69/// this use is DEPRECATED and that such an implicit conversion will be
70/// discouraged (ideally via a compiler warning).
71///
72/// Otherwise, `bslma::UsesBslmaAllocator<TYPE>` derives from `bsl::false_type`.
73/// Note that top-level cv qualifiers are ignored when applying the above tests.
74/// If `TYPE` is a reference type, then `bslma::UsesBslmaAllocator<TYPE>` always
75/// derives from `bsl::false_type`, even if the reference type is AA.
76///
77/// ### Properties of Types Declaring the UsesBslmaAllocator Trait {#bslma_usesbslmaallocator-properties-of-types-declaring-the-usesbslmaallocator-trait}
78///
79///
80/// Types that declare the `UsesBslmaAllocator` trait must meet some minimal
81/// requirements in order for that type to be usable with code that tests for
82/// the `UsesBslmaAllocator` trait (e.g., `bsl` containers). In addition, types
83/// that use allocators must have certain properties with respect to memory
84/// allocation, which are not enforced by the compiler (such a type is described
85/// as following the `bslma` allocator model).
86///
87/// #### Compiler-Enforced Requirements of Types Declaring UsesBslmaAllocator {#bslma_usesbslmaallocator-compiler-enforced-requirements-of-types-declaring-usesbslmaallocator}
88///
89///
90/// Types declaring the `UsesBslmaAllocator` trait must provide a constructor
91/// variant that accepts a `bslma::Allocator *` as the last argument (typically
92/// this is an optional argument). If such a type provides a copy constructor,
93/// it must similarly provide a variant that takes a (optional)
94/// `bslma::Allocator *` as the last argument. If such a type provides a move
95/// constructor, it must similarly provide a variant that takes a
96/// `bslma::Allocator *` as the last argument.
97///
98/// Template types (such as `bsl` containers), where the template parameter
99/// `TYPE` represents some element type encapsulated by the class template,
100/// often use the `UsesBslmaAllocator` trait to test if `TYPE` uses `bslma`
101/// allocators and, if so, to create `TYPE` objects using the constructor
102/// variant taking an allocator. In this context, compilation will fail if a
103/// type declares the `UsesBslmaAllocator` trait, but does not provide the
104/// expected constructor variant accepting a `bslma::Allocator *` as the last
105/// argument.
106///
107/// #### Expected Properties of Types Declaring the UsesBslmaAllocator Trait {#bslma_usesbslmaallocator-expected-properties-of-types-declaring-the-usesbslmaallocator-trait}
108///
109///
110/// Types declaring the `UsesBslmaAllocator` trait are expected to have certain
111/// properties with respect to memory allocation. These properties are not
112/// enforced by the compiler, but are necessary to ensure consistent and
113/// comprehensible allocation behavior.
114///
115/// * The allocator supplied at construction of an object will be used for
116/// non-transient memory allocation during the object's lifetime. This
117/// particularly includes allocations performed by sub-objects that
118/// themselves support the `bslma` allocator model (i.e., the type will
119/// provide the supplied allocator to any data members that themselves accept
120/// an allocator).
121/// * If the type defines a move constructor *with* an allocator parameter:
122/// 1. If another move constructor *without* an allocator parameter that is
123/// `noexcept` exists, then if the allocators match, the behavior of those
124/// two move constructors will be identical.
125/// 2. If the type defines a copy constructor, then the behavior of this
126/// move constructor when allocators don't match will be the same as the
127/// behavior of the copy constructor.
128/// * The allocator used by an object is not changed after construction (e.g.,
129/// the assignment operator does not change the allocator used by an object).
130/// * Transient memory allocations -- i.e., allocations performed within the
131/// scope of a function where the resulting memory is deallocated before
132/// that function returns -- are generally *not* performed using the object's
133/// allocator. Although clients may choose whichever allocator suits the
134/// specific context, most often transient memory allocations are performed
135/// using the currently installed default allocator. For example, a
136/// temporary `bsl::string` that is destroyed within the scope of a method
137/// need not be explicitly supplied an allocator, since it is a transient
138/// allocation, and `bsl::string` will use the default allocator by default.
139/// * The allocator used by an object is not part of an object's value (e.g.,
140/// it is not tested by the equality-comparison operator `operator==`).
141/// * If an allocator is not supplied at construction, then the currently
142/// installed default allocator will typically be used (see @ref bslma_default ).
143/// * If a move constructor is called with no allocator argument, the allocator
144/// used by the new object will be the same as the allocator used by the
145/// source object.
146/// * Singleton objects, when necessary, allocate memory from the global
147/// allocator (see @ref bslma_default ).
148///
149/// ## Usage {#bslma_usesbslmaallocator-usage}
150///
151///
152/// This section illustrates intended usage of this component.
153///
154/// ### Example 1: Associating the bslma Allocator Trait with a Type {#bslma_usesbslmaallocator-example-1-associating-the-bslma-allocator-trait-with-a-type}
155///
156///
157/// Suppose we want to declare two types that make use of a `bslma` allocator,
158/// and need to associate the `UsesBslmaAllocator` trait with those types (so
159/// that they behave correctly when inserted into a `bsl` container, for
160/// example). In this example we will demonstrate two different mechanisms by
161/// which a trait may be associated with a type.
162///
163/// First, we define a type `UsesAllocatorType1` and use the
164/// `BSLMF_NESTED_TRAIT_DECLARATION` macro to associate the type with the
165/// `UsesBslmaAllocator` trait:
166/// @code
167/// namespace xyz {
168///
169/// class UsesAllocatorType1 {
170/// // ...
171///
172/// public:
173/// // TRAITS
174/// BSLMF_NESTED_TRAIT_DECLARATION(UsesAllocatorType1,
175/// bslma::UsesBslmaAllocator);
176/// // CREATORS
177/// explicit UsesAllocatorType1(bslma::Allocator *basicAllocator = 0);
178/// // ...
179///
180/// UsesAllocatorType1(const UsesAllocatorType1& original,
181/// bslma::Allocator *basicAllocator = 0);
182/// // ...
183/// };
184/// @endcode
185/// Note that the macro declaration must appear within the scope of the class
186/// declaration and must have `public` access.
187///
188/// Next, we define a type `UsesAllocatorType2` and define a specialization of
189/// the `UsesBslmaAllocator` trait for `UsesAllocatorType2` that associates the
190/// `UsesBslmaAllocator` trait with the type (sometimes referred to as a
191/// "C++11-style" trait declaration, because it is more in keeping with the
192/// style of trait declarations found in the C++11 Standard). Note that the
193/// specialization must be performed in the `BloombergLP::bslma` namespace:
194/// @code
195/// class UsesAllocatorType2 {
196/// // ...
197///
198/// public:
199/// // CREATORS
200/// explicit UsesAllocatorType2(bslma::Allocator *basicAllocator = 0);
201/// // ...
202///
203/// UsesAllocatorType2(const UsesAllocatorType2& original,
204/// bslma::Allocator *basicAllocator = 0);
205/// // ...
206/// };
207///
208/// } // close namespace xyz
209///
210/// // TRAITS
211/// namespace BloombergLP {
212/// namespace bslma {
213///
214/// template <>
215/// struct UsesBslmaAllocator<xyz::UsesAllocatorType2> : bsl::true_type
216/// {};
217///
218/// } // close package namespace
219/// } // close enterprise namespace
220/// @endcode
221/// Next, we define a type `BslAAClass`, which provides a bsl-AA interface
222/// based on `bsl::allocator`:
223/// @code
224/// namespace xyz {
225///
226/// class BslAAClass {
227/// // ...
228///
229/// public:
230/// // TYPES
231/// typedef bsl::allocator<char> allocator_type;
232///
233/// // CREATORS
234/// explicit BslAAClass(const allocator_type& alloc = allocator_type());
235///
236/// BslAAClass(const BslAAClass& other,
237/// const allocator_type& alloc = allocator_type());
238/// };
239/// @endcode
240/// Finally, we define a type `NonAAClass`, which is derived from `BslAAClass`
241/// but is not AA itself. Because it inherits `allocator_type`, this class
242/// explicitly says it is *not* AA by overiding `allocator_type` with `void`:
243/// @code
244/// class NonAAClass : public BslAAClass {
245/// // ...
246///
247/// public:
248/// // TYPES
249/// typedef void allocator_type; // Not an AA class
250///
251/// // CREATORS
252/// NonAAClass();
253///
254/// NonAAClass(const NonAAClass& other);
255/// };
256/// } // close namespace xyz
257/// @endcode
258///
259/// ### Example 2: Testing Whether a Type Uses a bslma Allocator {#bslma_usesbslmaallocator-example-2-testing-whether-a-type-uses-a-bslma-allocator}
260///
261///
262/// Suppose we want to test whether each of a set of different types uses a
263/// `bslma` allocator.
264///
265/// First, we define a class that is not AA, for control purposes:
266/// @code
267/// namespace xyz {
268///
269/// class DoesNotUseAnAllocatorType { };
270///
271/// } // close namespace xyz
272/// @endcode
273/// Now, we use the `UsesBslmaAllocator` template to test whether this type, and
274/// any of the other types in Example 1 use bslma allocators:
275/// @code
276/// int main()
277/// {
278/// using namespace xyz;
279///
280/// assert(! bslma::UsesBslmaAllocator<DoesNotUseAnAllocatorType>::value);
281/// assert(bslma::UsesBslmaAllocator<UsesAllocatorType1>::value);
282/// assert(bslma::UsesBslmaAllocator<UsesAllocatorType2>::value);
283/// assert(bslma::UsesBslmaAllocator<BslAAClass>::value);
284/// assert(!bslma::UsesBslmaAllocator<NonAAClass>::value);
285/// }
286/// @endcode
287/// Finally, we demonstrate that the trait can be tested at compilation time by
288/// testing the trait within the context of a compile-time `BSLMF_ASSERT`:
289/// @code
290/// BSLMF_ASSERT(
291/// !bslma::UsesBslmaAllocator<xyz::DoesNotUseAnAllocatorType>::value);
292/// BSLMF_ASSERT(bslma::UsesBslmaAllocator<xyz::UsesAllocatorType1>::value);
293/// BSLMF_ASSERT(bslma::UsesBslmaAllocator<xyz::UsesAllocatorType2>::value);
294/// BSLMF_ASSERT(bslma::UsesBslmaAllocator<xyz::BslAAClass>::value);
295/// BSLMF_ASSERT(!bslma::UsesBslmaAllocator<xyz::NonAAClass>::value);
296/// @endcode
297/// @}
298/** @} */
299/** @} */
300
301/** @addtogroup bsl
302 * @{
303 */
304/** @addtogroup bslma
305 * @{
306 */
307/** @addtogroup bslma_usesbslmaallocator
308 * @{
309 */
310
311#include <bslscm_version.h>
312
313#include <bslma_allocator.h>
314
317#include <bslmf_isconvertible.h>
318#include <bslmf_usesallocator.h>
319
320#include <bsls_annotation.h>
322
323
324namespace bslma {
325
326// FORWARD DECLARATION
327template <class TYPE>
328struct UsesBslmaAllocator_Imp;
329
330 // ========================
331 // class UsesBslmaAllocator
332 // ========================
333
334/// This metafunction is derived from `true_type` if `TYPE` adheres to the
335/// `bslma` allocator usage idiom and `false_type` otherwise. Note that
336/// this trait must be explicitly associated with a type in order for this
337/// metafunction to return true; simply having a constructor that implicitly
338/// converts `bslma::Allocator *` to `TYPE` is deprecated as a means of
339/// indicating that a type follows the `bslma` allocator usage idiom.
340template <class TYPE>
342 : bsl::integral_constant<bool, UsesBslmaAllocator_Imp<TYPE>::value>
343{
344};
345
346/// Partial specialization that prevents any pointer from being considered
347/// an allocator-aware (AA) type, including pointers that are convertible to
348/// `bslma::Allocator *`.
349template <class TYPE>
351{
352};
353
354/// Partial specialization that prevents any lvalue reference from being
355/// considered an allocator-aware (AA) type.
356template <class TYPE>
358{
359};
360
361#ifdef BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES
362/// Partial specialization that prevents any rvalue reference from being
363/// considered an allocator-aware (AA) type.
364template <class TYPE>
365struct UsesBslmaAllocator<TYPE&&> : bsl::false_type
366{
367};
368#endif
369
370/// Partial specialization that associates the same trait with `const TYPE`
371/// as with unqualified `TYPE`.
372template <class TYPE>
373struct UsesBslmaAllocator<const TYPE> : UsesBslmaAllocator<TYPE>::type
374{
375};
376
377/// Partial specialization that associates the same trait with 'volatile
378/// TYPE' as with unqualified `TYPE`.
379template <class TYPE>
380struct UsesBslmaAllocator<volatile TYPE> : UsesBslmaAllocator<TYPE>::type
381{
382};
383
384/// Partial specialization that associates the same trait with 'const
385/// volatile TYPE' as with unqualified `TYPE`.
386template <class TYPE>
387struct UsesBslmaAllocator<const volatile TYPE> : UsesBslmaAllocator<TYPE>::type
388{
389};
390
391// ============================================================================
392// TEMPLATE AND INLINE FUNCTION IMPLEMENTATIONS
393// ============================================================================
394
395 // =====================================
396 // class UsesBslmaAllocator_DeprecatedIf
397 // =====================================
398
399/// For compilers that support a deprecation annotation, this empty `struct`
400/// has a static `check` function that yields a deprecation warning when
401/// called (including within an unevaluated context) if this class is
402/// instantiated with a `true` argument, but not if instantiated with a
403/// `false` argument.
404template <bool>
406
407 // CLASS METHODS
408
409 /// Ignore the specified `message` and return a `char`. Declared but
410 /// not defined; for metaprogramming only.
411 static char check(const char *message);
412};
413
414/// Using this specialization of `UsesBslmaAllocator_DeprecatedIf` yields a
415/// deprecation warning on compilers that support a deprecation annotation.
416template <>
418
419 // CLASS METHODS
420
421 /// Ignore the specified `message` and return a `char`. Declared but
422 /// not defined; for metaprogramming only. Note that, on platforms that
423 /// support a deprecation attribute, use of this function, even in an
424 /// unevaluated context, will yield a deprecation warning.
425 BSLS_ANNOTATION_DEPRECATED static char check(const char *message);
426};
427
428#define BSLMA_USESBSLMAALLOCATOR_CAT(X, Y) \
429 BSLMA_USESBSLMAALLOCATOR_CAT_IMP1(X, Y)
430#define BSLMA_USESBSLMAALLOCATOR_CAT_IMP1(X, Y) \
431 BSLMA_USESBSLMAALLOCATOR_CAT_IMP2(X, Y)
432/// Component-local macros for concatenating tokens.
433#define BSLMA_USESBSLMAALLOCATOR_CAT_IMP2(X, Y) X##Y
434
435/// On platforms that support a deprecation attribute, produce a deprecation
436/// warning if the specified `COND` is true, otherwise do nothing. The
437/// specified `MSG` is ignored, but must be a string literal and should
438/// describe why the condition (if true) is undesirable.
439#define BSLMA_USESBSLMAALLOCATOR_DEPRECATE_IF(COND, MSG) enum { \
440 BSLMA_USESBSLMAALLOCATOR_CAT(e_bslma_UsesBslmaAllocator_DeprecateIf_, \
441 __LINE__) \
442 = sizeof(UsesBslmaAllocator_DeprecatedIf<!!(COND)>::check(MSG)) }
443
444 // ==============================================
445 // class SuppressesImplicitConvertibilityWarnings
446 // ==============================================
447
448/// This `struct` template implements a meta-function to determine whether a
449/// deprecation warning emitted for allocator-aware types that have an
450/// implicit conversion constructor from `Allocator*`, should be suppressed
451/// for (template parameter) `t_TYPE`. This `struct` derives from
452/// `bsl::true_type` if the warning should be suppressed and from
453/// `bsl::false_type` otherwise. Note that this meta-function is used for
454/// testing to disable the warnings generated by this component when
455/// deliberately testing the deprecated feature.
456template <class t_TYPE>
460
461 // ==============================
462 // class UsesBslmaAllocator_Sniff
463 // ==============================
464
465/// This class has a constant `value` that is `true` if the specified
466/// `TYPE` is implicitly convertible from `bslma::Allocator *`. It thus
467/// "sniffs" whether `UsesBslmaAllocator<TYPE>::value` should be `true`.
468/// If the specified `BYPASS` parameter is `true`, the conversion check is
469/// skipped and `value` is hard-coded to `true`. The bypass is needed
470/// because the xlC compiler will sometimes instantiate the copy
471/// constructor for `TYPE`, leading to compilation errors if `TYPE` is not
472/// copy constructible. This automatic sniffing is deprecated; having a
473/// type implicitly convertible from an allocator pointer is discouraged.
474template <class TYPE, bool BYPASS>
476
477 private:
478 // PRIVATE TYPES
479
480 /// A class convertible from `UniqueType *` can be deduced to be
481 /// convertible from EVERY pointer type, either because it has a
482 /// non-explicit constructor taking a single argument of type `void *`
483 /// or because it has a non-explicit constructor template taking a
484 /// single template argument that matches any pointer.
485 struct UniqueType {
486 };
487
488 enum {
489 // If a pointer to 'Allocator' is convertible to 'T', then 'T' has a
490 // non-explicit constructor taking an allocator.
492
493 // If a pointer to 'UniqueType' is convertible to 'T', it can only mean
494 // that ANY POINTER is convertible to 'T'.
496
497 // User can explicitly suppress deprecation warnings.
498 k_SUPPRESS_DEPRECATION_WARNINGS =
500
501 // We can "sniff" out a class that uses 'bslma::Allocator *' if it is
502 // convertible from 'bslma::Allocator *', but that conversion is
503 // *specific* to 'Allocator' pointers, not to arbitrary pointers.
504 // Note that "Sniffing" the trait is this way is deprecated.
505 k_VALUE = k_BSLMA_POINTER_CTOR && !k_ANY_POINTER_CTOR,
506 };
507
509 k_VALUE && !k_SUPPRESS_DEPRECATION_WARNINGS,
510 "Declaring an allocator-aware type by supplying an implicit "
511 "conversion constructor from 'Allocator*' is deprecated.");
512
513 public:
514 // TYPES
515 enum { value = k_VALUE };
516};
517
518/// Specialization of `UsesBslmaAllocator_Sniff` for which `BYPASS`
519/// is `true`.
520template <class TYPE>
521struct UsesBslmaAllocator_Sniff<TYPE, true> {
522
523 enum { value = true };
524};
525
526
527 // ============================
528 // class UsesBslmaAllocator_Imp
529 // ============================
530
531/// Implementation of `UsesBslmaAllocator`. This class has a constant,
532/// `value`, that is `true` if ANY of the following is true:
533///
534/// * `TYPE` has a 'BSLMF_NESTED_TRAIT_DECLARATION(TYPE,
535/// bslma::UsesBslmaAllocator);' declaration.
536/// * `TYPE` has a nested `allocator_type` and `bslma::Allocator *` is
537/// implicitly convertible to `TYPE::allocator_type`.
538/// * `bslma::Allocator *` is implicitly convertible to `TYPE` but other,
539/// arbitrary pointers are NOT implicitly convertible to `TYPE`.
540///
541/// Otherwise, `value` is `false`.
542template <class TYPE>
544
545 private:
546 // PRIVATE TYPES
547 enum {
548 k_NESTED_TRAIT = bslmf::DetectNestedTrait<TYPE,
550
551 // Check if 'T' has a nested type, 'allocator_type', and
552 // 'bslma::Allocator *' is convertible to 'T::allocator_type'.
553 k_COMPATIBLE_ALLOC_TYPE = bsl::uses_allocator<TYPE,Allocator *>::value,
554
555 // If either of the previous two constants is 'true', it is not
556 // necessary to "sniff" further for this trait.
557 k_BYPASS_SNIFFING = k_NESTED_TRAIT || k_COMPATIBLE_ALLOC_TYPE
558 };
559
560 public:
561 // TYPES
563};
564
565} // close package namespace
566
567
568#endif
569
570// ----------------------------------------------------------------------------
571// Copyright 2013 Bloomberg Finance L.P.
572//
573// Licensed under the Apache License, Version 2.0 (the "License");
574// you may not use this file except in compliance with the License.
575// You may obtain a copy of the License at
576//
577// http://www.apache.org/licenses/LICENSE-2.0
578//
579// Unless required by applicable law or agreed to in writing, software
580// distributed under the License is distributed on an "AS IS" BASIS,
581// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
582// See the License for the specific language governing permissions and
583// limitations under the License.
584// ----------------------------- END-OF-FILE ----------------------------------
585
586/** @} */
587/** @} */
588/** @} */
#define BSLMA_USESBSLMAALLOCATOR_DEPRECATE_IF(COND, MSG)
Definition bslma_usesbslmaallocator.h:439
#define BSLS_ANNOTATION_DEPRECATED
Definition bsls_annotation.h:324
#define BSLS_IDENT(str)
Definition bsls_ident.h:195
Definition balxml_encoderoptions.h:68
Definition bslmf_integralconstant.h:244
Definition bslmf_isconvertible.h:867
Definition bslmf_usesallocator.h:165
Definition bslma_usesbslmaallocator.h:458
static BSLS_ANNOTATION_DEPRECATED char check(const char *message)
Definition bslma_usesbslmaallocator.h:405
static char check(const char *message)
Definition bslma_usesbslmaallocator.h:543
@ value
Definition bslma_usesbslmaallocator.h:562
Definition bslma_usesbslmaallocator.h:475
@ value
Definition bslma_usesbslmaallocator.h:515
Definition bslma_usesbslmaallocator.h:343
Definition bslmf_detectnestedtrait.h:464