OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // This file contains cross-platform basic type definitions | 5 // TODO(thakis): Change all files that include this file to instead include the |
| 6 // base files below directly and remove this file. |
6 | 7 |
7 #ifndef GPU_COMMAND_BUFFER_COMMON_TYPES_H_ | 8 #ifndef GPU_COMMAND_BUFFER_COMMON_TYPES_H_ |
8 #define GPU_COMMAND_BUFFER_COMMON_TYPES_H_ | 9 #define GPU_COMMAND_BUFFER_COMMON_TYPES_H_ |
9 | 10 |
10 #if !defined(_MSC_VER) | 11 #include "base/basictypes.h" |
11 #include <stdint.h> | 12 #include "base/macros.h" |
12 #endif | |
13 #include <cstddef> | |
14 #include <string> | |
15 | |
16 typedef signed char schar; | |
17 typedef signed char int8; | |
18 // TODO(mbelshe) Remove these type guards. These are | |
19 // temporary to avoid conflicts with npapi.h. | |
20 #ifndef _INT16 | |
21 #define _INT16 | |
22 typedef short int16; | |
23 #endif | |
24 #ifndef _INT32 | |
25 #define _INT32 | |
26 typedef int int32; | |
27 #endif | |
28 | |
29 // The NSPR system headers define 64-bit as |long| when possible. In order to | |
30 // not have typedef mismatches, we do the same on LP64. | |
31 #if defined(__LP64__) && !defined(__APPLE__) && !defined(__OpenBSD__) | |
32 typedef long int64; | |
33 #else | |
34 typedef long long int64; | |
35 #endif | |
36 | |
37 // NOTE: unsigned types are DANGEROUS in loops and other arithmetical | |
38 // places. Use the signed types unless your variable represents a bit | |
39 // pattern (eg a hash value) or you really need the extra bit. Do NOT | |
40 // use 'unsigned' to express "this value should always be positive"; | |
41 // use assertions for this. | |
42 | |
43 typedef unsigned char uint8; | |
44 // TODO(mbelshe) Remove these type guards. These are | |
45 // temporary to avoid conflicts with npapi.h. | |
46 #ifndef _UINT16 | |
47 #define _UINT16 | |
48 typedef unsigned short uint16; | |
49 #endif | |
50 #ifndef _UINT32 | |
51 #define _UINT32 | |
52 typedef unsigned int uint32; | |
53 #endif | |
54 | |
55 // See the comment above about NSPR and 64-bit. | |
56 #if defined(__LP64__) && !defined(__APPLE__) && !defined(__OpenBSD__) | |
57 typedef unsigned long uint64; | |
58 #else | |
59 typedef unsigned long long uint64; | |
60 #endif | |
61 | |
62 // A macro to disallow the copy constructor and operator= functions | |
63 // This should be used in the private: declarations for a class | |
64 #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ | |
65 TypeName(const TypeName&); \ | |
66 void operator=(const TypeName&) | |
67 | |
68 // A macro to disallow all the implicit constructors, namely the | |
69 // default constructor, copy constructor and operator= functions. | |
70 // | |
71 // This should be used in the private: declarations for a class | |
72 // that wants to prevent anyone from instantiating it. This is | |
73 // especially useful for classes containing only static methods. | |
74 #define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ | |
75 TypeName(); \ | |
76 DISALLOW_COPY_AND_ASSIGN(TypeName) | |
77 | |
78 // The arraysize(arr) macro returns the # of elements in an array arr. | |
79 // The expression is a compile-time constant, and therefore can be | |
80 // used in defining new arrays, for example. If you use arraysize on | |
81 // a pointer by mistake, you will get a compile-time error. | |
82 // | |
83 // One caveat is that arraysize() doesn't accept any array of an | |
84 // anonymous type or a type defined inside a function. In these rare | |
85 // cases, you have to use the unsafe ARRAYSIZE_UNSAFE() macro below. This is | |
86 // due to a limitation in C++'s template system. The limitation might | |
87 // eventually be removed, but it hasn't happened yet. | |
88 | |
89 // This template function declaration is used in defining arraysize. | |
90 // Note that the function doesn't need an implementation, as we only | |
91 // use its type. | |
92 template <typename T, size_t N> | |
93 char (&ArraySizeHelper(T (&array)[N]))[N]; | |
94 | |
95 // That gcc wants both of these prototypes seems mysterious. VC, for | |
96 // its part, can't decide which to use (another mystery). Matching of | |
97 // template overloads: the final frontier. | |
98 #if !defined(_MSC_VER) | |
99 template <typename T, size_t N> | |
100 char (&ArraySizeHelper(const T (&array)[N]))[N]; | |
101 #endif | |
102 | |
103 #define arraysize(array) (sizeof(ArraySizeHelper(array))) | |
104 | |
105 // The COMPILE_ASSERT macro can be used to verify that a compile time | |
106 // expression is true. For example, you could use it to verify the | |
107 // size of a static array: | |
108 // | |
109 // COMPILE_ASSERT(ARRAYSIZE_UNSAFE(content_type_names) == CONTENT_NUM_TYPES, | |
110 // content_type_names_incorrect_size); | |
111 // | |
112 // or to make sure a struct is smaller than a certain size: | |
113 // | |
114 // COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large); | |
115 // | |
116 // The second argument to the macro is the name of the variable. If | |
117 // the expression is false, most compilers will issue a warning/error | |
118 // containing the name of the variable. | |
119 | |
120 template <bool> | |
121 struct GpuCompileAssert { | |
122 }; | |
123 | |
124 #undef COMPILE_ASSERT | |
125 #define COMPILE_ASSERT(expr, msg) \ | |
126 typedef GpuCompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] | |
127 | |
128 // Implementation details of COMPILE_ASSERT: | |
129 // | |
130 // - COMPILE_ASSERT works by defining an array type that has -1 | |
131 // elements (and thus is invalid) when the expression is false. | |
132 // | |
133 // - The simpler definition | |
134 // | |
135 // #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1] | |
136 // | |
137 // does not work, as gcc supports variable-length arrays whose sizes | |
138 // are determined at run-time (this is gcc's extension and not part | |
139 // of the C++ standard). As a result, gcc fails to reject the | |
140 // following code with the simple definition: | |
141 // | |
142 // int foo; | |
143 // COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is | |
144 // // not a compile-time constant. | |
145 // | |
146 // - By using the type CompileAssert<(bool(expr))>, we ensures that | |
147 // expr is a compile-time constant. (Template arguments must be | |
148 // determined at compile-time.) | |
149 // | |
150 // - The outter parentheses in CompileAssert<(bool(expr))> are necessary | |
151 // to work around a bug in gcc 3.4.4 and 4.0.1. If we had written | |
152 // | |
153 // CompileAssert<bool(expr)> | |
154 // | |
155 // instead, these compilers will refuse to compile | |
156 // | |
157 // COMPILE_ASSERT(5 > 0, some_message); | |
158 // | |
159 // (They seem to think the ">" in "5 > 0" marks the end of the | |
160 // template argument list.) | |
161 // | |
162 // - The array size is (bool(expr) ? 1 : -1), instead of simply | |
163 // | |
164 // ((expr) ? 1 : -1). | |
165 // | |
166 // This is to avoid running into a bug in MS VC 7.1, which | |
167 // causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1. | |
168 | |
169 namespace gpu { | |
170 #if defined(_MSC_VER) | |
171 typedef short Int16; | |
172 typedef unsigned short Uint16; | |
173 typedef int Int32; | |
174 typedef unsigned int Uint32; | |
175 #else | |
176 typedef int16_t Int16; | |
177 typedef uint16_t Uint16; | |
178 typedef int32_t Int32; | |
179 typedef uint32_t Uint32; | |
180 #endif | |
181 | |
182 typedef std::string String; | |
183 | |
184 } // namespace gpu | |
185 | 13 |
186 #endif // GPU_COMMAND_BUFFER_COMMON_TYPES_H_ | 14 #endif // GPU_COMMAND_BUFFER_COMMON_TYPES_H_ |
OLD | NEW |