BDE 4.39.x 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.
336///
337/// \note Note that this trait must be explicitly associated with a type in order for this
338/// metafunction to return true; simply having a constructor that implicitly
339/// converts `bslma::Allocator *` to `TYPE` is deprecated as a means of
340/// indicating that a type follows the `bslma` allocator usage idiom.
341template <class TYPE>
343 : bsl::integral_constant<bool, UsesBslmaAllocator_Imp<TYPE>::value>
344{
345};
346
347/// Partial specialization that prevents any pointer from being considered
348/// an allocator-aware (AA) type, including pointers that are convertible to
349/// `bslma::Allocator *`.
350template <class TYPE>
352{
353};
354
355/// Partial specialization that prevents any lvalue reference from being
356/// considered an allocator-aware (AA) type.
357template <class TYPE>
359{
360};
361
362#ifdef BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES
363/// Partial specialization that prevents any rvalue reference from being
364/// considered an allocator-aware (AA) type.
365template <class TYPE>
366struct UsesBslmaAllocator<TYPE&&> : bsl::false_type
367{
368};
369#endif
370
371/// Partial specialization that associates the same trait with `const TYPE`
372/// as with unqualified `TYPE`.
373template <class TYPE>
374struct UsesBslmaAllocator<const TYPE> : UsesBslmaAllocator<TYPE>::type
375{
376};
377
378/// Partial specialization that associates the same trait with 'volatile
379/// TYPE' as with unqualified `TYPE`.
380template <class TYPE>
381struct UsesBslmaAllocator<volatile TYPE> : UsesBslmaAllocator<TYPE>::type
382{
383};
384
385/// Partial specialization that associates the same trait with 'const
386/// volatile TYPE' as with unqualified `TYPE`.
387template <class TYPE>
388struct UsesBslmaAllocator<const volatile TYPE> : UsesBslmaAllocator<TYPE>::type
389{
390};
391
392// ============================================================================
393// TEMPLATE AND INLINE FUNCTION IMPLEMENTATIONS
394// ============================================================================
395
396 // =====================================
397 // class UsesBslmaAllocator_DeprecatedIf
398 // =====================================
399
400/// For compilers that support a deprecation annotation, this empty `struct`
401/// has a static `check` function that yields a deprecation warning when
402/// called (including within an unevaluated context) if this class is
403/// instantiated with a `true` argument, but not if instantiated with a
404/// `false` argument.
405///
406/// See @ref bslma_usesbslmaallocator
407template <bool>
409
410 // CLASS METHODS
411
412 /// Ignore the specified `message` and return a `char`. Declared but
413 /// not defined; for metaprogramming only.
414 static char check(const char *message);
415};
416
417/// Using this specialization of `UsesBslmaAllocator_DeprecatedIf` yields a
418/// deprecation warning on compilers that support a deprecation annotation.
419template <>
421
422 // CLASS METHODS
423
424 /// Ignore the specified `message` and return a `char`. Declared but not defined; for metaprogramming only.
425 ///
426 /// \note Note that, on platforms that
427 /// support a deprecation attribute, use of this function, even in an
428 /// unevaluated context, will yield a deprecation warning.
429 BSLS_ANNOTATION_DEPRECATED static char check(const char *message);
430};
431
432#define BSLMA_USESBSLMAALLOCATOR_CAT(X, Y) \
433 BSLMA_USESBSLMAALLOCATOR_CAT_IMP1(X, Y)
434#define BSLMA_USESBSLMAALLOCATOR_CAT_IMP1(X, Y) \
435 BSLMA_USESBSLMAALLOCATOR_CAT_IMP2(X, Y)
436/// Component-local macros for concatenating tokens.
437#define BSLMA_USESBSLMAALLOCATOR_CAT_IMP2(X, Y) X##Y
438
439/// On platforms that support a deprecation attribute, produce a deprecation
440/// warning if the specified `COND` is true, otherwise do nothing. The
441/// specified `MSG` is ignored, but must be a string literal and should
442/// describe why the condition (if true) is undesirable.
443#define BSLMA_USESBSLMAALLOCATOR_DEPRECATE_IF(COND, MSG) enum { \
444 BSLMA_USESBSLMAALLOCATOR_CAT(e_bslma_UsesBslmaAllocator_DeprecateIf_, \
445 __LINE__) \
446 = sizeof(UsesBslmaAllocator_DeprecatedIf<!!(COND)>::check(MSG)) }
447
448 // ==============================================
449 // class SuppressesImplicitConvertibilityWarnings
450 // ==============================================
451
452/// This `struct` template implements a meta-function to determine whether a
453/// deprecation warning emitted for allocator-aware types that have an
454/// implicit conversion constructor from `Allocator*`, should be suppressed
455/// for (template parameter) `t_TYPE`. This `struct` derives from
456/// `bsl::true_type` if the warning should be suppressed and from `bsl::false_type` otherwise.
457///
458/// \note Note that this meta-function is used for
459/// testing to disable the warnings generated by this component when
460/// deliberately testing the deprecated feature.
461template <class t_TYPE>
465
466 // ==============================
467 // class UsesBslmaAllocator_Sniff
468 // ==============================
469
470/// This class has a constant `value` that is `true` if the specified
471/// `TYPE` is implicitly convertible from `bslma::Allocator *`. It thus
472/// "sniffs" whether `UsesBslmaAllocator<TYPE>::value` should be `true`.
473/// If the specified `BYPASS` parameter is `true`, the conversion check is
474/// skipped and `value` is hard-coded to `true`. The bypass is needed
475/// because the xlC compiler will sometimes instantiate the copy
476/// constructor for `TYPE`, leading to compilation errors if `TYPE` is not
477/// copy constructible. This automatic sniffing is deprecated; having a
478/// type implicitly convertible from an allocator pointer is discouraged.
479///
480/// See @ref bslma_usesbslmaallocator
481template <class TYPE, bool BYPASS>
483
484 private:
485 // PRIVATE TYPES
486
487 /// A class convertible from `UniqueType *` can be deduced to be
488 /// convertible from EVERY pointer type, either because it has a
489 /// non-explicit constructor taking a single argument of type `void *`
490 /// or because it has a non-explicit constructor template taking a
491 /// single template argument that matches any pointer.
492 ///
493 /// See @ref bslma_usesbslmaallocator
494 struct UniqueType {
495 };
496
497 enum {
498 // If a pointer to 'Allocator' is convertible to 'T', then 'T' has a
499 // non-explicit constructor taking an allocator.
501
502 // If a pointer to 'UniqueType' is convertible to 'T', it can only mean
503 // that ANY POINTER is convertible to 'T'.
505
506 // User can explicitly suppress deprecation warnings.
507 k_SUPPRESS_DEPRECATION_WARNINGS =
509
510 // We can "sniff" out a class that uses 'bslma::Allocator *' if it is
511 // convertible from 'bslma::Allocator *', but that conversion is
512 // *specific* to 'Allocator' pointers, not to arbitrary pointers.
513 // Note that "Sniffing" the trait is this way is deprecated.
514 k_VALUE = k_BSLMA_POINTER_CTOR && !k_ANY_POINTER_CTOR,
515 };
516
518 k_VALUE && !k_SUPPRESS_DEPRECATION_WARNINGS,
519 "Declaring an allocator-aware type by supplying an implicit "
520 "conversion constructor from 'Allocator*' is deprecated.");
521
522 public:
523 // TYPES
524 enum { value = k_VALUE };
525};
526
527/// Specialization of `UsesBslmaAllocator_Sniff` for which `BYPASS`
528/// is `true`.
529template <class TYPE>
530struct UsesBslmaAllocator_Sniff<TYPE, true> {
531
532 enum { value = true };
533};
534
535
536 // ============================
537 // class UsesBslmaAllocator_Imp
538 // ============================
539
540/// Implementation of `UsesBslmaAllocator`. This class has a constant,
541/// `value`, that is `true` if ANY of the following is true:
542///
543/// * `TYPE` has a 'BSLMF_NESTED_TRAIT_DECLARATION(TYPE,
544/// bslma::UsesBslmaAllocator);' declaration.
545/// * `TYPE` has a nested `allocator_type` and `bslma::Allocator *` is
546/// implicitly convertible to `TYPE::allocator_type`.
547/// * `bslma::Allocator *` is implicitly convertible to `TYPE` but other,
548/// arbitrary pointers are NOT implicitly convertible to `TYPE`.
549///
550/// Otherwise, `value` is `false`.
551///
552/// See @ref bslma_usesbslmaallocator
553template <class TYPE>
555
556 private:
557 // PRIVATE TYPES
558 enum {
559 k_NESTED_TRAIT = bslmf::DetectNestedTrait<TYPE,
561
562 // Check if 'T' has a nested type, 'allocator_type', and
563 // 'bslma::Allocator *' is convertible to 'T::allocator_type'.
564 k_COMPATIBLE_ALLOC_TYPE = bsl::uses_allocator<TYPE,Allocator *>::value,
565
566 // If either of the previous two constants is 'true', it is not
567 // necessary to "sniff" further for this trait.
568 k_BYPASS_SNIFFING = k_NESTED_TRAIT || k_COMPATIBLE_ALLOC_TYPE
569 };
570
571 public:
572 // TYPES
574};
575
576} // close package namespace
577
578
579#endif
580
581// ----------------------------------------------------------------------------
582// Copyright 2013 Bloomberg Finance L.P.
583//
584// Licensed under the Apache License, Version 2.0 (the "License");
585// you may not use this file except in compliance with the License.
586// You may obtain a copy of the License at
587//
588// http://www.apache.org/licenses/LICENSE-2.0
589//
590// Unless required by applicable law or agreed to in writing, software
591// distributed under the License is distributed on an "AS IS" BASIS,
592// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
593// See the License for the specific language governing permissions and
594// limitations under the License.
595// ----------------------------- END-OF-FILE ----------------------------------
596
597/** @} */
598/** @} */
599/** @} */
#define BSLMA_USESBSLMAALLOCATOR_DEPRECATE_IF(COND, MSG)
Definition bslma_usesbslmaallocator.h:443
#define BSLS_ANNOTATION_DEPRECATED
Definition bsls_annotation.h:324
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
Definition baljsn_encoder_testtypes.h:76
Definition bslmf_integralconstant.h:261
Definition bslmf_isconvertible.h:875
Definition bslmf_usesallocator.h:165
Definition bslma_usesbslmaallocator.h:463
static BSLS_ANNOTATION_DEPRECATED char check(const char *message)
Definition bslma_usesbslmaallocator.h:408
static char check(const char *message)
Definition bslma_usesbslmaallocator.h:554
@ value
Definition bslma_usesbslmaallocator.h:573
Definition bslma_usesbslmaallocator.h:482
@ value
Definition bslma_usesbslmaallocator.h:524
Definition bslma_usesbslmaallocator.h:344
Definition bslmf_detectnestedtrait.h:467