1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/* 2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * 4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */ 10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#ifndef WEBRTC_BASE_COMMON_H_ // NOLINT 12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define WEBRTC_BASE_COMMON_H_ 13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/basictypes.h" 15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/constructormagic.h" 16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(_MSC_VER) 18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// warning C4355: 'this' : used in base member initializer list 19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#pragma warning(disable:4355) 20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org////////////////////////////////////////////////////////////////////// 23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// General Utilities 24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org////////////////////////////////////////////////////////////////////// 25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 2614abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org#ifndef RTC_UNUSED 2714abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org#define RTC_UNUSED(x) RtcUnused(static_cast<const void*>(&x)) 2814abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org#define RTC_UNUSED2(x, y) RtcUnused(static_cast<const void*>(&x)); \ 2914abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org RtcUnused(static_cast<const void*>(&y)) 3014abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org#define RTC_UNUSED3(x, y, z) RtcUnused(static_cast<const void*>(&x)); \ 3114abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org RtcUnused(static_cast<const void*>(&y)); \ 3214abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org RtcUnused(static_cast<const void*>(&z)) 3314abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org#define RTC_UNUSED4(x, y, z, a) RtcUnused(static_cast<const void*>(&x)); \ 3414abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org RtcUnused(static_cast<const void*>(&y)); \ 3514abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org RtcUnused(static_cast<const void*>(&z)); \ 3614abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org RtcUnused(static_cast<const void*>(&a)) 3714abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org#define RTC_UNUSED5(x, y, z, a, b) RtcUnused(static_cast<const void*>(&x)); \ 3814abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org RtcUnused(static_cast<const void*>(&y)); \ 3914abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org RtcUnused(static_cast<const void*>(&z)); \ 4014abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org RtcUnused(static_cast<const void*>(&a)); \ 4114abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org RtcUnused(static_cast<const void*>(&b)) 4214abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.orginline void RtcUnused(const void*) {} 4314abcc73227223def23a3eb06b47285c3a55a5b5henrike@webrtc.org#endif // RTC_UNUSED 44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 45f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if !defined(WEBRTC_WIN) 46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 47f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#ifndef strnicmp 48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define strnicmp(x, y, n) strncasecmp(x, y, n) 49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#ifndef stricmp 52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define stricmp(x, y) strcasecmp(x, y) 53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 55ff689be3c0c59c1be29aaa0697aa0f762566d6c6andresp@webrtc.org#endif // !defined(WEBRTC_WIN) 56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org///////////////////////////////////////////////////////////////////////////// 58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Assertions 59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org///////////////////////////////////////////////////////////////////////////// 60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#ifndef ENABLE_DEBUG 62e502bbe138599a10fe530cb789e3f715a56fd461Tommi#if !defined(NDEBUG) 63e502bbe138599a10fe530cb789e3f715a56fd461Tommi#define ENABLE_DEBUG 1 64e502bbe138599a10fe530cb789e3f715a56fd461Tommi#else 65e502bbe138599a10fe530cb789e3f715a56fd461Tommi#define ENABLE_DEBUG 0 66e502bbe138599a10fe530cb789e3f715a56fd461Tommi#endif 67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif // !defined(ENABLE_DEBUG) 68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 69f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Even for release builds, allow for the override of LogAssert. Though no 70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// macro is provided, this can still be used for explicit runtime asserts 71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// and allow applications to override the assert behavior. 72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc { 74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 75f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 76f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// If a debugger is attached, triggers a debugger breakpoint. If a debugger is 77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// not attached, forces program termination. 78f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Break(); 79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// LogAssert writes information about an assertion to the log. It's called by 81f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Assert (and from the ASSERT macro in debug mode) before any other action 82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// is taken (e.g. breaking the debugger, abort()ing, etc.). 83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid LogAssert(const char* function, const char* file, int line, 84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char* expression); 85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtypedef void (*AssertLogger)(const char* function, 87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char* file, 88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int line, 89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char* expression); 90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 91f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Sets a custom assert logger to be used instead of the default LogAssert 92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// behavior. To clear the custom assert logger, pass NULL for |logger| and the 93f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// default behavior will be restored. Only one custom assert logger can be set 94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// at a time, so this should generally be set during application startup and 95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// only by one component. 96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid SetCustomAssertLogger(AssertLogger logger); 97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 98c00ca627fd2c7a7b98ac42ad1d9a8b004c19b55ahenrike@webrtc.orgbool IsOdd(int n); 99c00ca627fd2c7a7b98ac42ad1d9a8b004c19b55ahenrike@webrtc.org 100c00ca627fd2c7a7b98ac42ad1d9a8b004c19b55ahenrike@webrtc.orgbool IsEven(int n); 101c00ca627fd2c7a7b98ac42ad1d9a8b004c19b55ahenrike@webrtc.org 102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} // namespace rtc 103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 104f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if ENABLE_DEBUG 105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc { 107f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orginline bool Assert(bool result, const char* function, const char* file, 109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int line, const char* expression) { 110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!result) { 111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LogAssert(function, file, line, expression); 112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Break(); 113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 114b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org return result; 115b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org} 116b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org 117b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org// Same as Assert above, but does not call Break(). Used in assert macros 118b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org// that implement their own breaking. 119b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.orginline bool AssertNoBreak(bool result, const char* function, const char* file, 120b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org int line, const char* expression) { 121b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org if (!result) 122b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org LogAssert(function, file, line, expression); 123b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org return result; 124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} // namespace rtc 127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 128f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(_MSC_VER) && _MSC_VER < 1300 129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define __FUNCTION__ "" 130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#ifndef ASSERT 133b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org#if defined(WIN32) 134b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org// Using debugbreak() inline on Windows directly in the ASSERT macro, has the 135b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org// benefit of breaking exactly where the failing expression is and not two 136b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org// calls up the stack. 137b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org#define ASSERT(x) \ 138b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org (rtc::AssertNoBreak((x), __FUNCTION__, __FILE__, __LINE__, #x) ? \ 139b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org (void)(1) : __debugbreak()) 140b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org#else 141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define ASSERT(x) \ 142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org (void)rtc::Assert((x), __FUNCTION__, __FILE__, __LINE__, #x) 143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 144b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org#endif 145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 146f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#ifndef VERIFY 147b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org#if defined(WIN32) 148b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org#define VERIFY(x) \ 149b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org (rtc::AssertNoBreak((x), __FUNCTION__, __FILE__, __LINE__, #x) ? \ 150b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org true : (__debugbreak(), false)) 151b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org#else 152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define VERIFY(x) rtc::Assert((x), __FUNCTION__, __FILE__, __LINE__, #x) 153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 154b614d0626f3116d80b932482ed56bf669ca19107henrike@webrtc.org#endif 155f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#else // !ENABLE_DEBUG 157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc { 159f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 160f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orginline bool ImplicitCastToBool(bool result) { return result; } 161f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 162f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} // namespace rtc 163f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 164f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#ifndef ASSERT 165f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define ASSERT(x) (void)0 166f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 167f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 168f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#ifndef VERIFY 169f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define VERIFY(x) rtc::ImplicitCastToBool(x) 170f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 171f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 172f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif // !ENABLE_DEBUG 173f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 174f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define COMPILE_TIME_ASSERT(expr) char CTA_UNIQUE_NAME[expr] 175f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define CTA_UNIQUE_NAME CTA_MAKE_NAME(__LINE__) 176f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define CTA_MAKE_NAME(line) CTA_MAKE_NAME2(line) 177f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define CTA_MAKE_NAME2(line) constraint_ ## line 178f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 179f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Forces compiler to inline, even against its better judgement. Use wisely. 180f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(__GNUC__) 181b71b4f0c7af57ef5b676c6ed70bf945282c90e3akjellander#define FORCE_INLINE __attribute__ ((__always_inline__)) 182f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#elif defined(WEBRTC_WIN) 183f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FORCE_INLINE __forceinline 184f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#else 185f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define FORCE_INLINE 186f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 187f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 188f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Annotate a function indicating the caller must examine the return value. 189f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Use like: 190f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// int foo() WARN_UNUSED_RESULT; 191f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// To explicitly ignore a result, see |ignore_result()| in <base/basictypes.h>. 192f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// TODO(ajm): Hack to avoid multiple definitions until the base/ of webrtc and 193f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// libjingle are merged. 194f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if !defined(WARN_UNUSED_RESULT) 1953402bcda563ae445d8f0dc9afbc17d32254e5d2edcheng#if defined(__GNUC__) || defined(__clang__) 196b71b4f0c7af57ef5b676c6ed70bf945282c90e3akjellander#define WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__)) 197f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#else 198f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define WARN_UNUSED_RESULT 199f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 200f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif // WARN_UNUSED_RESULT 201f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 202f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif // WEBRTC_BASE_COMMON_H_ // NOLINT 203