Home | History | Annotate | Download | only in base
      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 namespace rtc {
    115   template<class T> inline T _min(T a, T b) { return (a > b) ? b : a; }
    116   template<class T> inline T _max(T a, T b) { return (a < b) ? b : a; }
    117 
    118   // For wait functions that take a number of milliseconds, kForever indicates
    119   // unlimited time.
    120   const int kForever = -1;
    121 }
    122 
    123 #define ALIGNP(p, t) \
    124     (reinterpret_cast<uint8*>(((reinterpret_cast<uintptr_t>(p) + \
    125     ((t) - 1)) & ~((t) - 1))))
    126 #define RTC_IS_ALIGNED(p, a) (!((uintptr_t)(p) & ((a) - 1)))
    127 
    128 // Use these to declare and define a static local variable (static T;) so that
    129 // it is leaked so that its destructors are not called at exit.
    130 #define LIBJINGLE_DEFINE_STATIC_LOCAL(type, name, arguments) \
    131   static type& name = *new type arguments
    132 
    133 #endif  // __cplusplus
    134 #endif  // WEBRTC_BASE_BASICTYPES_H_
    135