1 | // Copyright 2008 Google Inc. All Rights Reserved. |
2 | // |
3 | // Various Google-specific macros. |
4 | // |
5 | // This code is compiled directly on many platforms, including client |
6 | // platforms like Windows, Mac, and embedded systems. Before making |
7 | // any changes here, make sure that you're not breaking any platforms. |
8 | // |
9 | |
10 | #ifndef BASE_MACROS_H_ |
11 | #define BASE_MACROS_H_ |
12 | |
13 | #include <stddef.h> // For size_t |
14 | |
15 | // We use our own local version of type traits while we're waiting |
16 | // for TR1 type traits to be standardized. Define some macros so that |
17 | // most google3 code doesn't have to work with type traits directly. |
18 | #include "base/type_traits.h" |
19 | |
20 | // The swigged version of an abstract class must be concrete if any methods |
21 | // return objects of the abstract type. We keep it abstract in C++ and |
22 | // concrete for swig. |
23 | #ifndef SWIG |
24 | #define ABSTRACT = 0 |
25 | #endif |
26 | |
27 | // The COMPILE_ASSERT macro can be used to verify that a compile time |
28 | // expression is true. For example, you could use it to verify the |
29 | // size of a static array: |
30 | // |
31 | // COMPILE_ASSERT(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES, |
32 | // content_type_names_incorrect_size); |
33 | // |
34 | // or to make sure a struct is smaller than a certain size: |
35 | // |
36 | // COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large); |
37 | // |
38 | // The second argument to the macro is the name of the variable. If |
39 | // the expression is false, most compilers will issue a warning/error |
40 | // containing the name of the variable. |
41 | |
42 | template <bool> |
43 | struct CompileAssert { |
44 | }; |
45 | |
46 | #define COMPILE_ASSERT(expr, msg) \ |
47 | typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] |
48 | |
49 | // Implementation details of COMPILE_ASSERT: |
50 | // |
51 | // - COMPILE_ASSERT works by defining an array type that has -1 |
52 | // elements (and thus is invalid) when the expression is false. |
53 | // |
54 | // - The simpler definition |
55 | // |
56 | // #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1] |
57 | // |
58 | // does not work, as gcc supports variable-length arrays whose sizes |
59 | // are determined at run-time (this is gcc's extension and not part |
60 | // of the C++ standard). As a result, gcc fails to reject the |
61 | // following code with the simple definition: |
62 | // |
63 | // int foo; |
64 | // COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is |
65 | // // not a compile-time constant. |
66 | // |
67 | // - By using the type CompileAssert<(bool(expr))>, we ensures that |
68 | // expr is a compile-time constant. (Template arguments must be |
69 | // determined at compile-time.) |
70 | // |
71 | // - The outter parentheses in CompileAssert<(bool(expr))> are necessary |
72 | // to work around a bug in gcc 3.4.4 and 4.0.1. If we had written |
73 | // |
74 | // CompileAssert<bool(expr)> |
75 | // |
76 | // instead, these compilers will refuse to compile |
77 | // |
78 | // COMPILE_ASSERT(5 > 0, some_message); |
79 | // |
80 | // (They seem to think the ">" in "5 > 0" marks the end of the |
81 | // template argument list.) |
82 | // |
83 | // - The array size is (bool(expr) ? 1 : -1), instead of simply |
84 | // |
85 | // ((expr) ? 1 : -1). |
86 | // |
87 | // This is to avoid running into a bug in MS VC 7.1, which |
88 | // causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1. |
89 | |
90 | |
91 | // A macro to disallow the copy constructor and operator= functions |
92 | // This should be used in the private: declarations for a class |
93 | // |
94 | // For disallowing only assign or copy, write the code directly, but declare |
95 | // the intend in a comment, for example: |
96 | // void operator=(const TypeName&); // DISALLOW_ASSIGN |
97 | // Note, that most uses of DISALLOW_ASSIGN and DISALLOW_COPY are broken |
98 | // semantically, one should either use disallow both or neither. Try to |
99 | // avoid these in new code. |
100 | #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ |
101 | TypeName(const TypeName&); \ |
102 | void operator=(const TypeName&) |
103 | |
104 | // An older, politically incorrect name for the above. |
105 | // Prefer DISALLOW_COPY_AND_ASSIGN for new code. |
106 | #define DISALLOW_EVIL_CONSTRUCTORS(TypeName) DISALLOW_COPY_AND_ASSIGN(TypeName) |
107 | |
108 | // A macro to disallow all the implicit constructors, namely the |
109 | // default constructor, copy constructor and operator= functions. |
110 | // |
111 | // This should be used in the private: declarations for a class |
112 | // that wants to prevent anyone from instantiating it. This is |
113 | // especially useful for classes containing only static methods. |
114 | #define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ |
115 | TypeName(); \ |
116 | DISALLOW_COPY_AND_ASSIGN(TypeName) |
117 | |
118 | // The arraysize(arr) macro returns the # of elements in an array arr. |
119 | // The expression is a compile-time constant, and therefore can be |
120 | // used in defining new arrays, for example. If you use arraysize on |
121 | // a pointer by mistake, you will get a compile-time error. |
122 | // |
123 | // One caveat is that arraysize() doesn't accept any array of an |
124 | // anonymous type or a type defined inside a function. In these rare |
125 | // cases, you have to use the unsafe ARRAYSIZE() macro below. This is |
126 | // due to a limitation in C++'s template system. The limitation might |
127 | // eventually be removed, but it hasn't happened yet. |
128 | |
129 | // This template function declaration is used in defining arraysize. |
130 | // Note that the function doesn't need an implementation, as we only |
131 | // use its type. |
132 | template <typename T, size_t N> |
133 | char (&ArraySizeHelper(T (&array)[N]))[N]; |
134 | |
135 | // That gcc wants both of these prototypes seems mysterious. VC, for |
136 | // its part, can't decide which to use (another mystery). Matching of |
137 | // template overloads: the final frontier. |
138 | #ifndef COMPILER_MSVC |
139 | template <typename T, size_t N> |
140 | char (&ArraySizeHelper(const T (&array)[N]))[N]; |
141 | #endif |
142 | |
143 | #define arraysize(array) (sizeof(ArraySizeHelper(array))) |
144 | |
145 | // ARRAYSIZE performs essentially the same calculation as arraysize, |
146 | // but can be used on anonymous types or types defined inside |
147 | // functions. It's less safe than arraysize as it accepts some |
148 | // (although not all) pointers. Therefore, you should use arraysize |
149 | // whenever possible. |
150 | // |
151 | // The expression ARRAYSIZE(a) is a compile-time constant of type |
152 | // size_t. |
153 | // |
154 | // ARRAYSIZE catches a few type errors. If you see a compiler error |
155 | // |
156 | // "warning: division by zero in ..." |
157 | // |
158 | // when using ARRAYSIZE, you are (wrongfully) giving it a pointer. |
159 | // You should only use ARRAYSIZE on statically allocated arrays. |
160 | // |
161 | // The following comments are on the implementation details, and can |
162 | // be ignored by the users. |
163 | // |
164 | // ARRAYSIZE(arr) works by inspecting sizeof(arr) (the # of bytes in |
165 | // the array) and sizeof(*(arr)) (the # of bytes in one array |
166 | // element). If the former is divisible by the latter, perhaps arr is |
167 | // indeed an array, in which case the division result is the # of |
168 | // elements in the array. Otherwise, arr cannot possibly be an array, |
169 | // and we generate a compiler error to prevent the code from |
170 | // compiling. |
171 | // |
172 | // Since the size of bool is implementation-defined, we need to cast |
173 | // !(sizeof(a) & sizeof(*(a))) to size_t in order to ensure the final |
174 | // result has type size_t. |
175 | // |
176 | // This macro is not perfect as it wrongfully accepts certain |
177 | // pointers, namely where the pointer size is divisible by the pointee |
178 | // size. Since all our code has to go through a 32-bit compiler, |
179 | // where a pointer is 4 bytes, this means all pointers to a type whose |
180 | // size is 3 or greater than 4 will be (righteously) rejected. |
181 | // |
182 | // Kudos to Jorg Brown for this simple and elegant implementation. |
183 | // |
184 | // - wan 2005-11-16 |
185 | // |
186 | // Starting with Visual C++ 2005, WinNT.h includes ARRAYSIZE. |
187 | #if !defined(COMPILER_MSVC) || (defined(_MSC_VER) && _MSC_VER < 1400) |
188 | #define ARRAYSIZE(a) \ |
189 | ((sizeof(a) / sizeof(*(a))) / \ |
190 | static_cast<size_t>(!(sizeof(a) % sizeof(*(a))))) |
191 | #endif |
192 | |
193 | // A macro to turn a symbol into a string |
194 | #define AS_STRING(x) AS_STRING_INTERNAL(x) |
195 | #define AS_STRING_INTERNAL(x) #x |
196 | |
197 | |
198 | // One of the type traits, is_pod, makes it possible to query whether |
199 | // a type is a POD type. It is impossible for type_traits.h to get |
200 | // this right without compiler support, so it fails conservatively. It |
201 | // knows that fundamental types and pointers are PODs, but it can't |
202 | // tell whether user classes are PODs. The DECLARE_POD macro is used |
203 | // to inform the type traits library that a user class is a POD. |
204 | // |
205 | // Implementation note: the typedef at the end is just to make it legal |
206 | // to put a semicolon after DECLARE_POD(foo). |
207 | // |
208 | // The only reason this matters is that a few parts of the google3 |
209 | // code base either require their template arguments to be PODs |
210 | // (e.g. compact_vector) or are able to use a more efficient code path |
211 | // when their template arguments are PODs (e.g. sparse_hash_map). You |
212 | // should use DECLARE_POD if you have written a class that you intend |
213 | // to use with one of those components, and if you know that your |
214 | // class satisfies all of the conditions to be a POD type. |
215 | // |
216 | // So what's a POD? The C++ standard (clause 9 paragraph 4) gives a |
217 | // full definition, but a good rule of thumb is that a struct is a POD |
218 | // ("plain old data") if it doesn't use any of the features that make |
219 | // C++ different from C. A POD struct can't have constructors, |
220 | // destructors, assignment operators, base classes, private or |
221 | // protected members, or virtual functions, and all of its member |
222 | // variables must themselves be PODs. |
223 | |
224 | #define DECLARE_POD(TypeName) \ |
225 | namespace base { \ |
226 | template<> struct is_pod<TypeName> : true_type { }; \ |
227 | } \ |
228 | typedef int Dummy_Type_For_DECLARE_POD \ |
229 | |
230 | // We once needed a different technique to assert that a nested class |
231 | // is a POD. This is no longer necessary, and DECLARE_NESTED_POD is |
232 | // just a synonym for DECLARE_POD. We continue to provide |
233 | // DECLARE_NESTED_POD only so we don't have to change client |
234 | // code. Regardless of whether you use DECLARE_POD or |
235 | // DECLARE_NESTED_POD: use it after the outer class. Using it within a |
236 | // class definition will give a compiler error. |
237 | #define DECLARE_NESTED_POD(TypeName) DECLARE_POD(TypeName) |
238 | |
239 | // Declare that TemplateName<T> is a POD whenever T is |
240 | #define PROPAGATE_POD_FROM_TEMPLATE_ARGUMENT(TemplateName) \ |
241 | namespace base { \ |
242 | template <typename T> struct is_pod<TemplateName<T> > : is_pod<T> { }; \ |
243 | } \ |
244 | typedef int Dummy_Type_For_PROPAGATE_POD_FROM_TEMPLATE_ARGUMENT |
245 | |
246 | // Macro that does nothing if TypeName is a POD, and gives a compiler |
247 | // error if TypeName is a non-POD. You should put a descriptive |
248 | // comment right next to the macro call so that people can tell what |
249 | // the compiler error is about. |
250 | // |
251 | // Implementation note: this works by taking the size of a type that's |
252 | // complete when TypeName is a POD and incomplete otherwise. |
253 | |
254 | template <bool IsPod> struct ERROR_TYPE_MUST_BE_POD; |
255 | template <> struct ERROR_TYPE_MUST_BE_POD<true> { }; |
256 | #define ENFORCE_POD(TypeName) \ |
257 | enum { dummy_##TypeName \ |
258 | = sizeof(ERROR_TYPE_MUST_BE_POD< \ |
259 | base::is_pod<TypeName>::value>) } |
260 | |
261 | #endif // BASE_MACROS_H_ |
262 | |