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