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#include <stdint.h>  // for uintptr_t and (u)int_t types.
16
17#ifdef HAVE_CONFIG_H
18#include "config.h"  // NOLINT
19#endif
20
21// Detect compiler is for x86 or x64.
22#if defined(__x86_64__) || defined(_M_X64) || \
23    defined(__i386__) || defined(_M_IX86)
24#define CPU_X86 1
25#endif
26
27// Detect compiler is for arm.
28#if defined(__arm__) || defined(_M_ARM)
29#define CPU_ARM 1
30#endif
31
32#if defined(CPU_X86) && defined(CPU_ARM)
33#error CPU_X86 and CPU_ARM both defined.
34#endif
35
36#if !defined(RTC_ARCH_CPU_BIG_ENDIAN) && !defined(RTC_ARCH_CPU_LITTLE_ENDIAN)
37// x86, arm or GCC provided __BYTE_ORDER__ macros
38#if CPU_X86 || CPU_ARM ||  \
39  (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
40#define RTC_ARCH_CPU_LITTLE_ENDIAN
41#elif defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
42#define RTC_ARCH_CPU_BIG_ENDIAN
43#else
44#error RTC_ARCH_CPU_BIG_ENDIAN or RTC_ARCH_CPU_LITTLE_ENDIAN should be defined.
45#endif
46#endif
47
48#if defined(RTC_ARCH_CPU_BIG_ENDIAN) && defined(RTC_ARCH_CPU_LITTLE_ENDIAN)
49#error RTC_ARCH_CPU_BIG_ENDIAN and RTC_ARCH_CPU_LITTLE_ENDIAN both defined.
50#endif
51
52#if defined(WEBRTC_WIN)
53typedef int socklen_t;
54#endif
55
56// The following only works for C++
57#ifdef __cplusplus
58
59#ifndef ALIGNP
60#define ALIGNP(p, t)                                             \
61  (reinterpret_cast<uint8_t*>(((reinterpret_cast<uintptr_t>(p) + \
62  ((t) - 1)) & ~((t) - 1))))
63#endif
64
65#define RTC_IS_ALIGNED(p, a) (!((uintptr_t)(p) & ((a) - 1)))
66
67// Use these to declare and define a static local variable that gets leaked so
68// that its destructors are not called at exit.
69#define RTC_DEFINE_STATIC_LOCAL(type, name, arguments) \
70  static type& name = *new type arguments
71
72#endif  // __cplusplus
73
74#endif  // WEBRTC_BASE_BASICTYPES_H_
75