BDE 4.14.0 Production release
Loading...
Searching...
No Matches
bslmf_assert

Classes

struct  BSLMF_COMPILE_TIME_ASSERTION_FAILURE< IS_VALID >
 
struct  BSLMF_COMPILE_TIME_ASSERTION_FAILURE< true >
 

Macros

#define BSLMF_ASSERT_CAT(X, Y)   BSLMF_ASSERT_CAT_IMP1(X, Y)
 
#define BSLMF_ASSERT_CAT_IMP1(X, Y)   BSLMF_ASSERT_CAT_IMP2(X, Y)
 
#define BSLMF_ASSERT_CAT_IMP2(X, Y)   X##Y
 
#define BSLMF_ASSERT(expr)
 

Detailed Description

Outline

Purpose

Provide a compile-time assertion facility.

Classes

Macros

Description

This component defines a macro that will generate a compile-time error if its constant integral expression argument evaluates to false (i.e., a value of 0). The BSLMF_ASSERT macro is similar to the standard run-time assert macro, except that its argument is evaluated at compile-time, it produces no executable code, and it can be used safely in header files.

BSLMF_ASSERT(sizeof(int) >= sizeof(char)); // OK
BSLMF_ASSERT(sizeof(double) < sizeof(char)); // COMPILE ERROR!
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:229

The second line will result in a compile error with a message stating that the type BSLMF_COMPILE_TIME_ASSERTION_FAILURE is incomplete, usually preceded by the file and line number where the macro was used. The following error message is typical of most compilers:

$ CC -g myfile.cpp
"myfile.cpp", line 86: Error: The type
"BSLMF_COMPILE_TIME_ASSERTION_FAILURE<0>" is incomplete.
1 Error(s) detected.

If the macro argument is true, the macro will generate an innocuous typedef with a name that is the concatenation of the symbol bslmf::Assert, and the value of __LINE__ (which will be the line number in the file where the macro was called). For example, the first line from the example above might result in the following statement:

typedef bslmf::AssertTest<1> bslmf_Assert_85;
Definition bslmf_assert.h:196

Note that these generated typedefs are implementation details of the compile-time checking facility and are not intended to be used directly outside of this component.

Attempting to invoke BSLMF_ASSERT on a non-compile-time value will typically result in a compilation error.

BSLMF_ASSERT can be used at namespace, class, and function scope to assert compile-time conditions. !WARNING:! a compiler bug on certain platforms produces an error when the BSLMF_ASSERT macro is used more than once on the same line in class scope.

+---------------------------------------------
| // mytype.h
| #ifndef INCLUDED_BSLMF_ASSERT
| #include <bslmf_assert.h>
| #endif
|
| class MyType {
| BSLMF_ASSERT(sizeof(int) >= sizeof(char)); // OK
| BSLMF_ASSERT(sizeof(int) >= sizeof(char)); // OK
| BSLMF_ASSERT(1 == 1); // OK
| BSLMF_ASSERT(1 == 1); BSLMF_ASSERT(1 == 1); // SAME LINE - MIGHT
| // CAUSE ERROR!
|
| int d_data;
| ...
| void foo();
| ...
| };
+---------------------------------------------
| // mytype.cpp
| #include <mytype.h>
| #include <bslmf_assert.h>
|
| BSLMF_ASSERT(sizeof(int) >= sizeof(char));
|
| void MyType::foo()
| {
| BSLMF_ASSERT(sizeof(int) >= sizeof(char));
| ...
| }

Macro Definition Documentation

◆ BSLMF_ASSERT

#define BSLMF_ASSERT (   expr)
Value:
BSLA_MAYBE_UNUSED typedef BloombergLP::bslmf::AssertTest< \
sizeof(BloombergLP::BSLMF_COMPILE_TIME_ASSERTION_FAILURE<!!(expr)>)> \
BSLMF_ASSERT_CAT(bslmf_Assert_, __LINE__)
#define BSLA_MAYBE_UNUSED
Definition bsla_maybeunused.h:239

◆ BSLMF_ASSERT_CAT

#define BSLMF_ASSERT_CAT (   X,
 
)    BSLMF_ASSERT_CAT_IMP1(X, Y)

◆ BSLMF_ASSERT_CAT_IMP1

#define BSLMF_ASSERT_CAT_IMP1 (   X,
 
)    BSLMF_ASSERT_CAT_IMP2(X, Y)

◆ BSLMF_ASSERT_CAT_IMP2

#define BSLMF_ASSERT_CAT_IMP2 (   X,
 
)    X##Y