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_BASICTYPES_H_ 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_BASICTYPES_H_ 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <stddef.h> // for NULL, size_t 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if !(defined(_MSC_VER) && (_MSC_VER < 1600)) 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <stdint.h> // for uintptr_t 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifdef HAVE_CONFIG_H 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "config.h" // NOLINT 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/constructormagic.h" 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if !defined(INT_TYPES_DEFINED) 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define INT_TYPES_DEFINED 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifdef COMPILER_MSVC 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef unsigned __int64 uint64; 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef __int64 int64; 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef INT64_C 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define INT64_C(x) x ## I64 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef UINT64_C 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define UINT64_C(x) x ## UI64 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define INT64_F "I64" 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else // COMPILER_MSVC 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// On Mac OS X, cssmconfig.h defines uint64 as uint64_t 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// TODO(fbarchard): Use long long for compatibility with chromium on BSD/OSX. 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS) 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef uint64_t uint64; 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef int64_t int64; 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef INT64_C 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define INT64_C(x) x ## LL 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef UINT64_C 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define UINT64_C(x) x ## ULL 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define INT64_F "l" 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#elif defined(__LP64__) 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef unsigned long uint64; // NOLINT 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef long int64; // NOLINT 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef INT64_C 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define INT64_C(x) x ## L 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef UINT64_C 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define UINT64_C(x) x ## UL 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define INT64_F "l" 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else // __LP64__ 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef unsigned long long uint64; // NOLINT 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef long long int64; // NOLINT 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef INT64_C 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define INT64_C(x) x ## LL 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef UINT64_C 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define UINT64_C(x) x ## ULL 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define INT64_F "ll" 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // __LP64__ 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // COMPILER_MSVC 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef unsigned int uint32; 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef int int32; 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef unsigned short uint16; // NOLINT 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef short int16; // NOLINT 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef unsigned char uint8; 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef signed char int8; 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // INT_TYPES_DEFINED 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Detect compiler is for x86 or x64. 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(__x86_64__) || defined(_M_X64) || \ 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org defined(__i386__) || defined(_M_IX86) 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define CPU_X86 1 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Detect compiler is for arm. 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(__arm__) || defined(_M_ARM) 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define CPU_ARM 1 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(CPU_X86) && defined(CPU_ARM) 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#error CPU_X86 and CPU_ARM both defined. 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if !defined(ARCH_CPU_BIG_ENDIAN) && !defined(ARCH_CPU_LITTLE_ENDIAN) 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// x86, arm or GCC provided __BYTE_ORDER__ macros 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if CPU_X86 || CPU_ARM || \ 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ARCH_CPU_LITTLE_ENDIAN 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#elif defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ARCH_CPU_BIG_ENDIAN 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#error ARCH_CPU_BIG_ENDIAN or ARCH_CPU_LITTLE_ENDIAN should be defined. 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(ARCH_CPU_BIG_ENDIAN) && defined(ARCH_CPU_LITTLE_ENDIAN) 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#error ARCH_CPU_BIG_ENDIAN and ARCH_CPU_LITTLE_ENDIAN both defined. 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN) 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef int socklen_t; 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// The following only works for C++ 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifdef __cplusplus 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org template<class T> inline T _min(T a, T b) { return (a > b) ? b : a; } 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org template<class T> inline T _max(T a, T b) { return (a < b) ? b : a; } 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // For wait functions that take a number of milliseconds, kForever indicates 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // unlimited time. 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const int kForever = -1; 12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ALIGNP(p, t) \ 12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org (reinterpret_cast<uint8*>(((reinterpret_cast<uintptr_t>(p) + \ 12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ((t) - 1)) & ~((t) - 1)))) 126f85a9afbbb9b91c7712bc6fe5775b57f47e642c6henrike@webrtc.org#define RTC_IS_ALIGNED(p, a) (!((uintptr_t)(p) & ((a) - 1))) 12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Use these to declare and define a static local variable (static T;) so that 12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// it is leaked so that its destructors are not called at exit. 13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LIBJINGLE_DEFINE_STATIC_LOCAL(type, name, arguments) \ 13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static type& name = *new type arguments 13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // __cplusplus 13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_BASE_BASICTYPES_H_ 135