147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2004 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#ifndef WEBRTC_BASE_COMMON_H_ // NOLINT 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_COMMON_H_ 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/basictypes.h" 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/constructormagic.h" 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(_MSC_VER) 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// warning C4355: 'this' : used in base member initializer list 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#pragma warning(disable:4355) 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org////////////////////////////////////////////////////////////////////// 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// General Utilities 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org////////////////////////////////////////////////////////////////////// 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 265199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org#ifndef RTC_UNUSED 275199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org#define RTC_UNUSED(x) RtcUnused(static_cast<const void*>(&x)) 285199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org#define RTC_UNUSED2(x, y) RtcUnused(static_cast<const void*>(&x)); \ 295199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org RtcUnused(static_cast<const void*>(&y)) 305199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org#define RTC_UNUSED3(x, y, z) RtcUnused(static_cast<const void*>(&x)); \ 315199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org RtcUnused(static_cast<const void*>(&y)); \ 325199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org RtcUnused(static_cast<const void*>(&z)) 335199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org#define RTC_UNUSED4(x, y, z, a) RtcUnused(static_cast<const void*>(&x)); \ 345199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org RtcUnused(static_cast<const void*>(&y)); \ 355199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org RtcUnused(static_cast<const void*>(&z)); \ 365199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org RtcUnused(static_cast<const void*>(&a)) 375199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org#define RTC_UNUSED5(x, y, z, a, b) RtcUnused(static_cast<const void*>(&x)); \ 385199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org RtcUnused(static_cast<const void*>(&y)); \ 395199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org RtcUnused(static_cast<const void*>(&z)); \ 405199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org RtcUnused(static_cast<const void*>(&a)); \ 415199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org RtcUnused(static_cast<const void*>(&b)) 425199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.orginline void RtcUnused(const void*) {} 435199d1ddc1a2d8bb9feeadc5bc684f8a1fd6b76bhenrike@webrtc.org#endif // RTC_UNUSED 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if !defined(WEBRTC_WIN) 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef strnicmp 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define strnicmp(x, y, n) strncasecmp(x, y, n) 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef stricmp 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define stricmp(x, y) strcasecmp(x, y) 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// TODO(fbarchard): Remove this. std::max should be used everywhere in the code. 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// NOMINMAX must be defined where we include <windows.h>. 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define stdmax(x, y) std::max(x, y) 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define stdmax(x, y) rtc::_max(x, y) 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ARRAY_SIZE(x) (static_cast<int>(sizeof(x) / sizeof(x[0]))) 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org///////////////////////////////////////////////////////////////////////////// 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Assertions 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org///////////////////////////////////////////////////////////////////////////// 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef ENABLE_DEBUG 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ENABLE_DEBUG _DEBUG 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // !defined(ENABLE_DEBUG) 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Even for release builds, allow for the override of LogAssert. Though no 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// macro is provided, this can still be used for explicit runtime asserts 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// and allow applications to override the assert behavior. 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// If a debugger is attached, triggers a debugger breakpoint. If a debugger is 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// not attached, forces program termination. 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Break(); 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LogAssert writes information about an assertion to the log. It's called by 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Assert (and from the ASSERT macro in debug mode) before any other action 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// is taken (e.g. breaking the debugger, abort()ing, etc.). 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid LogAssert(const char* function, const char* file, int line, 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const char* expression); 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef void (*AssertLogger)(const char* function, 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const char* file, 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int line, 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const char* expression); 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Sets a custom assert logger to be used instead of the default LogAssert 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// behavior. To clear the custom assert logger, pass NULL for |logger| and the 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// default behavior will be restored. Only one custom assert logger can be set 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// at a time, so this should generally be set during application startup and 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// only by one component. 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid SetCustomAssertLogger(AssertLogger logger); 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 101ba4cfb1140b5da3bbd1fa83660b3f0595b17ac40henrike@webrtc.orgbool IsOdd(int n); 102ba4cfb1140b5da3bbd1fa83660b3f0595b17ac40henrike@webrtc.org 103ba4cfb1140b5da3bbd1fa83660b3f0595b17ac40henrike@webrtc.orgbool IsEven(int n); 104ba4cfb1140b5da3bbd1fa83660b3f0595b17ac40henrike@webrtc.org 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if ENABLE_DEBUG 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline bool Assert(bool result, const char* function, const char* file, 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int line, const char* expression) { 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!result) { 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LogAssert(function, file, line, expression); 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Break(); 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 117c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org return result; 118c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org} 119c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org 120c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org// Same as Assert above, but does not call Break(). Used in assert macros 121c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org// that implement their own breaking. 122c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.orginline bool AssertNoBreak(bool result, const char* function, const char* file, 123c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org int line, const char* expression) { 124c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org if (!result) 125c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org LogAssert(function, file, line, expression); 126c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org return result; 12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(_MSC_VER) && _MSC_VER < 1300 13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define __FUNCTION__ "" 13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef ASSERT 136c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org#if defined(WIN32) 137c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org// Using debugbreak() inline on Windows directly in the ASSERT macro, has the 138c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org// benefit of breaking exactly where the failing expression is and not two 139c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org// calls up the stack. 140c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org#define ASSERT(x) \ 141c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org (rtc::AssertNoBreak((x), __FUNCTION__, __FILE__, __LINE__, #x) ? \ 142c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org (void)(1) : __debugbreak()) 143c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org#else 14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ASSERT(x) \ 14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org (void)rtc::Assert((x), __FUNCTION__, __FILE__, __LINE__, #x) 14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 147c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org#endif 14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef VERIFY 150c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org#if defined(WIN32) 151c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org#define VERIFY(x) \ 152c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org (rtc::AssertNoBreak((x), __FUNCTION__, __FILE__, __LINE__, #x) ? \ 153c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org true : (__debugbreak(), false)) 154c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org#else 15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define VERIFY(x) rtc::Assert((x), __FUNCTION__, __FILE__, __LINE__, #x) 15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 157c4b828d1b37c297978031b1a6871a03cc2522c3ahenrike@webrtc.org#endif 15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else // !ENABLE_DEBUG 16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline bool ImplicitCastToBool(bool result) { return result; } 16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef ASSERT 16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ASSERT(x) (void)0 16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef VERIFY 17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define VERIFY(x) rtc::ImplicitCastToBool(x) 17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // !ENABLE_DEBUG 17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define COMPILE_TIME_ASSERT(expr) char CTA_UNIQUE_NAME[expr] 17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define CTA_UNIQUE_NAME CTA_MAKE_NAME(__LINE__) 17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define CTA_MAKE_NAME(line) CTA_MAKE_NAME2(line) 18047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define CTA_MAKE_NAME2(line) constraint_ ## line 18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Forces compiler to inline, even against its better judgement. Use wisely. 18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(__GNUC__) 18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define FORCE_INLINE __attribute__((always_inline)) 18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#elif defined(WEBRTC_WIN) 18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define FORCE_INLINE __forceinline 18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else 18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define FORCE_INLINE 18947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 19047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 19147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Borrowed from Chromium's base/compiler_specific.h. 19247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Annotate a virtual method indicating it must be overriding a virtual 19347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// method in the parent class. 19447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Use like: 19547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// virtual void foo() OVERRIDE; 19647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN) 19747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define OVERRIDE override 19847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#elif defined(__clang__) 19947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Clang defaults to C++03 and warns about using override. Squelch that. 20047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Intentionally no push/pop here so all users of OVERRIDE ignore the warning 20147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// too. This is like passing -Wno-c++11-extensions, except that GCC won't die 20247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// (because it won't see this pragma). 20347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#pragma clang diagnostic ignored "-Wc++11-extensions" 20447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define OVERRIDE override 20547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#elif defined(__GNUC__) && __cplusplus >= 201103 && \ 20647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org (__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= 40700 20747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// GCC 4.7 supports explicit virtual overrides when C++11 support is enabled. 20847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define OVERRIDE override 20947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else 21047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define OVERRIDE 21147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 21247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 21347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Annotate a function indicating the caller must examine the return value. 21447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Use like: 21547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// int foo() WARN_UNUSED_RESULT; 21647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// To explicitly ignore a result, see |ignore_result()| in <base/basictypes.h>. 21747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// TODO(ajm): Hack to avoid multiple definitions until the base/ of webrtc and 21847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// libjingle are merged. 21947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if !defined(WARN_UNUSED_RESULT) 22047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(__GNUC__) 22147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) 22247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else 22347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WARN_UNUSED_RESULT 22447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 22547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WARN_UNUSED_RESULT 22647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 22747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_BASE_COMMON_H_ // NOLINT 228