| /* Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| /** | |
| * Defines the common macros such as assert, inline, ... | |
| */ | |
| #inline c | |
| /* | |
| * @addtogroup PP | |
| * @{ | |
| */ | |
| /* Use PP_INLINE to tell the compiler to inline functions. The main purpose of | |
| * inline functions in ppapi is to allow us to define convenience functions in | |
| * the ppapi header files, without requiring clients or implementers to link a | |
| * PPAPI C library. The "inline" keyword is not supported by pre-C99 C | |
| * compilers (such as MS Visual Studio 2008 and older versions of GCC). MSVS | |
| * supports __forceinline and GCC supports __inline__. Use of the static | |
| * keyword ensures (in C) that the function is not compiled on its own, which | |
| * could cause multiple definition errors. | |
| * http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx | |
| * http://gcc.gnu.org/onlinedocs/gcc/Inline.html | |
| */ | |
| #if defined(__cplusplus) | |
| /* The inline keyword is part of C++ and guarantees we won't get multiple | |
| * definition errors. | |
| */ | |
| # define PP_INLINE inline | |
| #else | |
| # if defined(_MSC_VER) | |
| # define PP_INLINE static __forceinline | |
| # else | |
| # define PP_INLINE static __inline__ | |
| # endif | |
| #endif | |
| /* This is a compile-time assertion useful for ensuring that a given type is | |
| a given number of bytes wide. The size of the array is designed to be 1 | |
| (which should always be valid) if the enum's size is SIZE, and otherwise the | |
| size of the array will be -1 (which all/most compilers should flag as an | |
| error). This is wrapped inside a struct, because if it is a simple global | |
| we get multiple definition errors at link time. | |
| NAME is the name of the type without any spaces or the struct or enum | |
| keywords. | |
| CTYPENAME is the typename required by C. I.e., for a struct or enum, the | |
| appropriate keyword must be included. | |
| SIZE is the expected size in bytes. | |
| */ | |
| #define PP_COMPILE_ASSERT_SIZE_IN_BYTES_IMPL(NAME, CTYPENAME, SIZE) \ | |
| struct PP_Dummy_Struct_For_##NAME { \ | |
| char _COMPILE_ASSERT_FAILED_The_type_named_ \ | |
| ## NAME ## _is_not_ ## SIZE ## \ | |
| _bytes_wide[(sizeof(CTYPENAME) == SIZE) ? 1 : -1]; } | |
| /* PP_COMPILE_ASSERT_SIZE_IN_BYTES is for typenames that contain no spaces. | |
| E.g.: | |
| PP_COMPILE_ASSERT_SIZE_IN_BYTES(int, 4); | |
| typedef struct { int a; } Foo; | |
| PP_COMPILE_ASSERT_SIZE_IN_BYTES(Foo, 4); | |
| */ | |
| #define PP_COMPILE_ASSERT_SIZE_IN_BYTES(NAME, SIZE) \ | |
| PP_COMPILE_ASSERT_SIZE_IN_BYTES_IMPL(NAME, NAME, SIZE) | |
| /* PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES is for typenames that contain 'struct' | |
| in C. That is, struct names that are not typedefs. | |
| E.g.: | |
| struct Foo { int a; }; | |
| PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(Foo, 4); | |
| */ | |
| #define PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(NAME, SIZE) \ | |
| PP_COMPILE_ASSERT_SIZE_IN_BYTES_IMPL(NAME, struct NAME, SIZE) | |
| /* PP_COMPILE_ASSERT_ENUM_SIZE_IN_BYTES is for typenames that contain 'enum' | |
| in C. That is, enum names that are not typedefs. | |
| E.g.: | |
| enum Bar { A = 0, B = 1 }; | |
| PP_COMPILE_ASSERT_ENUM_SIZE_IN_BYTES(Foo, 4); | |
| */ | |
| #define PP_COMPILE_ASSERT_ENUM_SIZE_IN_BYTES(NAME, SIZE) \ | |
| PP_COMPILE_ASSERT_SIZE_IN_BYTES_IMPL(NAME, enum NAME, SIZE) | |
| /** | |
| * @} | |
| * End of addtogroup PP | |
| */ | |
| #endinl |