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