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