Basic type definition in webrtc, which can be used as a library in the future

Source: Internet
Author: User
/** Libjingle * Copyright 2004 Google Inc. ** Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: ** 1. redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclawing. * 2. redistributions in binary form must reproduce the above copyright not Ice, * this list of conditions and the following disclawing in the documentation * and/or other materials provided with the distribution. * 3. the name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. ** this software is provided by the author ''as is'' and any express or implied * WARRANTIES, INCLUDING, BUT NOT L Imited to, the implied warranties of * merchantability and fitness for a particle purpose are disclaimed. in no * event shall the author be liable for any direct, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, or consequential damages (INCLUDING, but not limited, * procurement of substitute goods or services; loss of use, DATA, or profits; * or business interruption) HOWEVER CAUSED AND ON ANY TH Eory of liability, * whether in contract, strict liability, or tort (including negligence or * OTHERWISE) arising in any way out of the use of this software, even if * advised of the possibility of such damage. */# ifndef TALK_BASE_BASICTYPES_H _ # define TALK_BASE_BASICTYPES_H _ # include <stddef. h> // for NULL, size_t # if! (Defined (_ MSC_VER) & (_ MSC_VER <1600) # include <stdint. h> // for uintptr_t # endif # ifdef HAVE_CONFIG_H # include "config. h "// NOLINT # endif # include" talk/base/constructormagic. h "# if! Defined (INT_TYPES_DEFINED) # define INT_TYPES_DEFINED # ifdef COMPILER_MSVC // this entire section is the typedef unsigned _ int64 uint64; typedef _ int64 int64; # ifndef INT64_C # define INT64_C (x) x # I64 # endif # ifndef UINT64_C # define UINT64_C (x) x # UI64 # endif # define INT64_F "I64" # else // COMPILER_MSVC // On Mac OS X, cssmconfig. h defines uint64 as uint64_t // TODO (fbarchard): Use long for compatibility wi Th chromium on BSD/OSX. # if defined (OSX) typedef uint64_t uint64; typedef int64_t int64; # ifndef INT64_C # define INT64_C (x) x ## LL # endif # ifndef # define UINT64_C (x) x # ULL # endif # define INT64_F "l" # elif defined (_ LP64 _) typedef unsigned long uint64; // NOLINTtypedef long int64; // NOLINT # ifndef INT64_C # define INT64_C (x) x # L # endif # ifndef UINT64_C # define UINT64_C (x) x # UL # endif # define INT64 _ F "l" # else // _ LP64 _ typedef unsigned long uint64; // NOLINTtypedef long int64; // NOLINT # ifndef INT64_C # define INT64_C (x) x # LL # endif # ifndef UINT64_C # define UINT64_C (x) x # ULL # endif # define INT64_F "ll" # endif/_ LP64 __# endif // COMPILER_MSVC // the entire section above serves 64, typedef unsigned int uint32; typedef int int32; typedef unsigned short uint16; // NOLINTtypedef short int16; // NOLINTtypedef Unsigned char uint8; typedef signed char int8; # endif // INT_TYPES_DEFINED // Detect compiler is for x86 or x64. # if defined (_ x86_64 _) | defined (_ M_X64) | \ defined (_ i386 _) | defined (_ M_IX86) # define CPU_X86 1 # endif // Detect compiler is for arm. # if defined (_ arm _) | defined (_ M_ARM) # define CPU_ARM 1 # endif # if defined (CPU_X86) & defined (CPU_ARM) # error CPU_X86 and CPU_ARM both defined. # endif // The above One module serves both x86 and arm architectures. Only one architecture can be provided. # if! Defined (ARCH_CPU_BIG_ENDIAN )&&! Defined (ARCH_CPU_LITTLE_ENDIAN) // x86, arm or GCC provided _ BYTE_ORDER _ macros # if CPU_X86 | CPU_ARM | \ (defined (_ BYTE_ORDER __) & _ BYTE_ORDER _ = _ ORDER_LITTLE_ENDIAN _) # define ARCH_CPU_LITTLE_ENDIAN # elif defined (_ BYTE_ORDER __) & _ BYTE_ORDER _ = _ ORDER_BIG_ENDIAN __# define ARCH_CPU_BIG_ENDIAN # else # error ARCH_CPU_BIG_ENDIAN or ARCH_CPU_LITTLE_ENDIAN shocould be defined. # endif # if def Ined (ARCH_CPU_BIG_ENDIAN) & defined (ARCH_CPU_LITTLE_ENDIAN) # error ARCH_CPU_BIG_ENDIAN and ARCH_CPU_LITTLE_ENDIAN both defined. # endif // whether the above part serves high bytes or low bytes # ifdef WIN32typedef int socklen_t; # endif // for socket // The following only works for C ++ # ifdef _ cplusplusnamespace talk_base {template <class T> inline T _ min (T a, T B) {return (a> B )? B: a;} template <class T> inline T _ max (T a, T B) {return (a <B )? B: a;} // For wait functions that take a number of milliseconds, kForever indicates // unlimited time. const int kForever =-1 ;}# define ALIGNP (p, t) \ (reinterpret_cast <uint8 *> (reinterpret_cast <uintptr_t> (p) + \ (t) -1 ))&~ (T)-1) # define IS_ALIGNED (p, )(! (Uintptr_t) (p) & (a)-1) // Note: UNUSED is also defined in common. h # ifndef UNUSED # define UNUSED (x) Unused (static_cast <const void *> (& x) # define UNUSED2 (x, y) unused (static_cast <const void *> (& x); \ Unused (static_cast <const void *> (& y) # define UNUSED3 (x, y, z) unused (static_cast <const void *> (& x); \ Unused (static_cast <const void *> (& y )); \ Unused (static_cast <const void *> (& z) # define UNUSED4 (x, y, z, a) Unused (static_cast <const void *> (& x )); \ Unused (static_cast <const void *> (& y); \ Unused (static_cast <const void *> (& z )); \ Unused (static_cast <const void *> (& a) # define UNUSED5 (x, y, z, a, B) unused (static_cast <const void *> (& x); \ Unused (static_cast <const void *> (& y )); \ Unused (static_cast <const void *> (& z); \ Unused (static_cast <const void *> (& )); \ Unused (static_cast <const void *> (& B) inline void Unused (const void *) {}# endif // UNUSED // Use these to declare and define a static local variable (static T ;) so that // it is leaked so that its destructors are not called at exit. # define LIBJINGLE_DEFINE_STATIC_LOCAL (type, name, arguments) \ static type & name = * new type arguments # endif // _ cplusplus # endif/TALK_BASE_BASICTYPES_H _
 

The above Code defines the basic types, as well as the hardware architecture, in byte order. It will be used directly after code writing. It will not be difficult to switch to int, short, or long, using int64 directly, uint32 is not easier to read and convenient.
This library code is a crash platform. We can see that many webrtc have a unit test case, so I also wrote a simple pattern for them, in order to gradually cultivate the thinking of unit testing:

#include "talk/base/basictypes.h"#include <stdio.h>#include <assert.h>void Test(){//assert the lenghtassert(sizeof(int8) == 1);assert(sizeof(uint8) == 1);assert(sizeof(int16) == 2);assert(sizeof(uint16) == 2);assert(sizeof(int32) == 4);assert(sizeof(int32) == 4);assert(sizeof(int64) == 8);assert(sizeof(uint64) == 8);//assert signed and unsignedint8 i8 = -1;assert(i8 == -1);uint8 ui8 = -1;assert(ui8 > 0);int16 i16 = -1;assert(i16 == -1);uint16 ui16 = -1;assert(ui16 > 0);int32 i32 = -1;assert(i32 == -1);uint32 ui32 = -1;assert(ui32 > 0);int64 i64 = -1;assert(i64 == -1);uint64 ui64 = -1;assert(ui64 > 0);//assert cpu archassert(CPU_X86);//X86//assert little_endian#ifdef ARCH_CPU_LITTLE_ENDIAN//little_endianassert(1);#elseassert(0);#endif//assert static varLIBJINGLE_DEFINE_STATIC_LOCAL(int, testname, ());//declare a static vartestname = 100;assert(testname == 100);//assert _max, _min#ifdef __cplusplusassert(talk_base::_max(10, 5) == 10);assert(talk_base::_max(10, 50)== 50);assert(talk_base::_max(10, -50)== 10);assert(talk_base::_min(10, 5) == 5);assert(talk_base::_min(10, 50) == 10);assert(talk_base::_min(10, -50) == -50);printf("Assert Success!\n");#endif }int main(){Test();return 0;}

Step by step, get the basic code program and use it as your own library ....

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.