147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/*
247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Copyright 2013 The WebRTC Project Authors. All rights reserved.
347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *
447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */
1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// COMPILE_ASSERT macro, borrowed from google3/base/macros.h.
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_COMPILE_ASSERT_H_
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_COMPILE_ASSERT_H_
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// The COMPILE_ASSERT macro can be used to verify that a compile time
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// expression is true. For example, you could use it to verify the
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// size of a static array:
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   COMPILE_ASSERT(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//                  content_type_names_incorrect_size);
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// or to make sure a struct is smaller than a certain size:
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large);
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// The second argument to the macro is the name of the variable. If
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// the expression is false, most compilers will issue a warning/error
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// containing the name of the variable.
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// TODO(ajm): Hack to avoid multiple definitions until the base/ of webrtc and
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// libjingle are merged.
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if !defined(COMPILE_ASSERT)
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtemplate <bool>
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstruct CompileAssert {
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define COMPILE_ASSERT(expr, msg) \
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]  // NOLINT
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif  // COMPILE_ASSERT
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Implementation details of COMPILE_ASSERT:
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// - COMPILE_ASSERT works by defining an array type that has -1
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   elements (and thus is invalid) when the expression is false.
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// - The simpler definition
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//     #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1]
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   does not work, as gcc supports variable-length arrays whose sizes
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   are determined at run-time (this is gcc's extension and not part
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   of the C++ standard).  As a result, gcc fails to reject the
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   following code with the simple definition:
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//     int foo;
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//     COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//                               // not a compile-time constant.
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// - By using the type CompileAssert<(bool(expr))>, we ensures that
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   expr is a compile-time constant.  (Template arguments must be
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   determined at compile-time.)
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// - The outer parentheses in CompileAssert<(bool(expr))> are necessary
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//     CompileAssert<bool(expr)>
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   instead, these compilers will refuse to compile
6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//     COMPILE_ASSERT(5 > 0, some_message);
7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   (They seem to think the ">" in "5 > 0" marks the end of the
7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   template argument list.)
7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// - The array size is (bool(expr) ? 1 : -1), instead of simply
7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//     ((expr) ? 1 : -1).
7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   This is to avoid running into a bug in MS VC 7.1, which
8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif  // WEBRTC_BASE_COMPILE_ASSERT_H_
83