1 /*
2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef WEBRTC_BASE_BASICTYPES_H_
12 #define WEBRTC_BASE_BASICTYPES_H_
13 
14 #include <stddef.h>  // for NULL, size_t
15 
16 #if !(defined(_MSC_VER) && (_MSC_VER < 1600))
17 #include <stdint.h>  // for uintptr_t
18 #endif
19 
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"  // NOLINT
22 #endif
23 
24 #include "webrtc/base/constructormagic.h"
25 
26 #if !defined(INT_TYPES_DEFINED)
27 #define INT_TYPES_DEFINED
28 #ifdef COMPILER_MSVC
29 typedef unsigned __int64 uint64;
30 typedef __int64 int64;
31 #ifndef INT64_C
32 #define INT64_C(x) x ## I64
33 #endif
34 #ifndef UINT64_C
35 #define UINT64_C(x) x ## UI64
36 #endif
37 #define INT64_F "I64"
38 #else  // COMPILER_MSVC
39 // On Mac OS X, cssmconfig.h defines uint64 as uint64_t
40 // TODO(fbarchard): Use long long for compatibility with chromium on BSD/OSX.
41 #if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
42 typedef uint64_t uint64;
43 typedef int64_t int64;
44 #ifndef INT64_C
45 #define INT64_C(x) x ## LL
46 #endif
47 #ifndef UINT64_C
48 #define UINT64_C(x) x ## ULL
49 #endif
50 #define INT64_F "l"
51 #elif defined(__LP64__)
52 typedef unsigned long uint64;  // NOLINT
53 typedef long int64;  // NOLINT
54 #ifndef INT64_C
55 #define INT64_C(x) x ## L
56 #endif
57 #ifndef UINT64_C
58 #define UINT64_C(x) x ## UL
59 #endif
60 #define INT64_F "l"
61 #else  // __LP64__
62 typedef unsigned long long uint64;  // NOLINT
63 typedef long long int64;  // NOLINT
64 #ifndef INT64_C
65 #define INT64_C(x) x ## LL
66 #endif
67 #ifndef UINT64_C
68 #define UINT64_C(x) x ## ULL
69 #endif
70 #define INT64_F "ll"
71 #endif  // __LP64__
72 #endif  // COMPILER_MSVC
73 typedef unsigned int uint32;
74 typedef int int32;
75 typedef unsigned short uint16;  // NOLINT
76 typedef short int16;  // NOLINT
77 typedef unsigned char uint8;
78 typedef signed char int8;
79 #endif  // INT_TYPES_DEFINED
80 
81 // Detect compiler is for x86 or x64.
82 #if defined(__x86_64__) || defined(_M_X64) || \
83     defined(__i386__) || defined(_M_IX86)
84 #define CPU_X86 1
85 #endif
86 // Detect compiler is for arm.
87 #if defined(__arm__) || defined(_M_ARM)
88 #define CPU_ARM 1
89 #endif
90 #if defined(CPU_X86) && defined(CPU_ARM)
91 #error CPU_X86 and CPU_ARM both defined.
92 #endif
93 #if !defined(ARCH_CPU_BIG_ENDIAN) && !defined(ARCH_CPU_LITTLE_ENDIAN)
94 // x86, arm or GCC provided __BYTE_ORDER__ macros
95 #if CPU_X86 || CPU_ARM ||  \
96   (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
97 #define ARCH_CPU_LITTLE_ENDIAN
98 #elif defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
99 #define ARCH_CPU_BIG_ENDIAN
100 #else
101 #error ARCH_CPU_BIG_ENDIAN or ARCH_CPU_LITTLE_ENDIAN should be defined.
102 #endif
103 #endif
104 #if defined(ARCH_CPU_BIG_ENDIAN) && defined(ARCH_CPU_LITTLE_ENDIAN)
105 #error ARCH_CPU_BIG_ENDIAN and ARCH_CPU_LITTLE_ENDIAN both defined.
106 #endif
107 
108 #if defined(WEBRTC_WIN)
109 typedef int socklen_t;
110 #endif
111 
112 // The following only works for C++
113 #ifdef __cplusplus
114 #define ALIGNP(p, t) \
115     (reinterpret_cast<uint8*>(((reinterpret_cast<uintptr_t>(p) + \
116     ((t) - 1)) & ~((t) - 1))))
117 #define RTC_IS_ALIGNED(p, a) (!((uintptr_t)(p) & ((a) - 1)))
118 
119 // Use these to declare and define a static local variable (static T;) so that
120 // it is leaked so that its destructors are not called at exit.
121 #define LIBJINGLE_DEFINE_STATIC_LOCAL(type, name, arguments) \
122   static type& name = *new type arguments
123 
124 #endif  // __cplusplus
125 #endif  // WEBRTC_BASE_BASICTYPES_H_
126