100 lines
3.9 KiB
C
100 lines
3.9 KiB
C
|
/*
|
||
|
* libjingle
|
||
|
* Copyright 2013, Google Inc.
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without
|
||
|
* modification, are permitted provided that the following conditions are met:
|
||
|
*
|
||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||
|
* this list of conditions and the following disclaimer.
|
||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||
|
* this list of conditions and the following disclaimer in the documentation
|
||
|
* and/or other materials provided with the distribution.
|
||
|
* 3. The name of the author may not be used to endorse or promote products
|
||
|
* derived from this software without specific prior written permission.
|
||
|
*
|
||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
*/
|
||
|
|
||
|
// COMPILE_ASSERT macro, borrowed from google3/base/macros.h.
|
||
|
#ifndef TALK_BASE_COMPILE_ASSERT_H_
|
||
|
#define TALK_BASE_COMPILE_ASSERT_H_
|
||
|
|
||
|
// The COMPILE_ASSERT macro can be used to verify that a compile time
|
||
|
// expression is true. For example, you could use it to verify the
|
||
|
// size of a static array:
|
||
|
//
|
||
|
// COMPILE_ASSERT(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
|
||
|
// content_type_names_incorrect_size);
|
||
|
//
|
||
|
// or to make sure a struct is smaller than a certain size:
|
||
|
//
|
||
|
// COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large);
|
||
|
//
|
||
|
// The second argument to the macro is the name of the variable. If
|
||
|
// the expression is false, most compilers will issue a warning/error
|
||
|
// containing the name of the variable.
|
||
|
|
||
|
// TODO(ajm): Hack to avoid multiple definitions until the base/ of webrtc and
|
||
|
// libjingle are merged.
|
||
|
#if !defined(COMPILE_ASSERT)
|
||
|
template <bool>
|
||
|
struct CompileAssert {
|
||
|
};
|
||
|
|
||
|
#define COMPILE_ASSERT(expr, msg) \
|
||
|
typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] // NOLINT
|
||
|
#endif // COMPILE_ASSERT
|
||
|
|
||
|
// Implementation details of COMPILE_ASSERT:
|
||
|
//
|
||
|
// - COMPILE_ASSERT works by defining an array type that has -1
|
||
|
// elements (and thus is invalid) when the expression is false.
|
||
|
//
|
||
|
// - The simpler definition
|
||
|
//
|
||
|
// #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1]
|
||
|
//
|
||
|
// does not work, as gcc supports variable-length arrays whose sizes
|
||
|
// are determined at run-time (this is gcc's extension and not part
|
||
|
// of the C++ standard). As a result, gcc fails to reject the
|
||
|
// following code with the simple definition:
|
||
|
//
|
||
|
// int foo;
|
||
|
// COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is
|
||
|
// // not a compile-time constant.
|
||
|
//
|
||
|
// - By using the type CompileAssert<(bool(expr))>, we ensures that
|
||
|
// expr is a compile-time constant. (Template arguments must be
|
||
|
// determined at compile-time.)
|
||
|
//
|
||
|
// - The outer parentheses in CompileAssert<(bool(expr))> are necessary
|
||
|
// to work around a bug in gcc 3.4.4 and 4.0.1. If we had written
|
||
|
//
|
||
|
// CompileAssert<bool(expr)>
|
||
|
//
|
||
|
// instead, these compilers will refuse to compile
|
||
|
//
|
||
|
// COMPILE_ASSERT(5 > 0, some_message);
|
||
|
//
|
||
|
// (They seem to think the ">" in "5 > 0" marks the end of the
|
||
|
// template argument list.)
|
||
|
//
|
||
|
// - The array size is (bool(expr) ? 1 : -1), instead of simply
|
||
|
//
|
||
|
// ((expr) ? 1 : -1).
|
||
|
//
|
||
|
// This is to avoid running into a bug in MS VC 7.1, which
|
||
|
// causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
|
||
|
|
||
|
#endif // TALK_BASE_COMPILE_ASSERT_H_
|