1// Protocol Buffers - Google's data interchange format
2// Copyright 2008 Google Inc. All rights reserved.
3// https://developers.google.com/protocol-buffers/
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9// * Redistributions of source code must retain the above copyright
10// notice, this list of conditions and the following disclaimer.
11// * Redistributions in binary form must reproduce the above
12// copyright notice, this list of conditions and the following disclaimer
13// in the documentation and/or other materials provided with the
14// distribution.
15// * Neither the name of Google Inc. nor the names of its
16// contributors may be used to endorse or promote products derived from
17// this software without specific prior written permission.
18//
19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31#ifndef GOOGLE_PROTOBUF_MACROS_H__
32#define GOOGLE_PROTOBUF_MACROS_H__
33
34namespace google {
35namespace protobuf {
36
37#undef GOOGLE_DISALLOW_EVIL_CONSTRUCTORS
38#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName) \
39 TypeName(const TypeName&) = delete; \
40 void operator=(const TypeName&) = delete
41
42#undef GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS
43#define GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
44 TypeName() = delete; \
45 TypeName(const TypeName&) = delete; \
46 void operator=(const TypeName&) = delete
47
48// ===================================================================
49// from google3/base/basictypes.h
50
51// The GOOGLE_ARRAYSIZE(arr) macro returns the # of elements in an array arr.
52// The expression is a compile-time constant, and therefore can be
53// used in defining new arrays, for example.
54//
55// GOOGLE_ARRAYSIZE catches a few type errors. If you see a compiler error
56//
57// "warning: division by zero in ..."
58//
59// when using GOOGLE_ARRAYSIZE, you are (wrongfully) giving it a pointer.
60// You should only use GOOGLE_ARRAYSIZE on statically allocated arrays.
61//
62// The following comments are on the implementation details, and can
63// be ignored by the users.
64//
65// ARRAYSIZE(arr) works by inspecting sizeof(arr) (the # of bytes in
66// the array) and sizeof(*(arr)) (the # of bytes in one array
67// element). If the former is divisible by the latter, perhaps arr is
68// indeed an array, in which case the division result is the # of
69// elements in the array. Otherwise, arr cannot possibly be an array,
70// and we generate a compiler error to prevent the code from
71// compiling.
72//
73// Since the size of bool is implementation-defined, we need to cast
74// !(sizeof(a) & sizeof(*(a))) to size_t in order to ensure the final
75// result has type size_t.
76//
77// This macro is not perfect as it wrongfully accepts certain
78// pointers, namely where the pointer size is divisible by the pointee
79// size. Since all our code has to go through a 32-bit compiler,
80// where a pointer is 4 bytes, this means all pointers to a type whose
81// size is 3 or greater than 4 will be (righteously) rejected.
82//
83// Kudos to Jorg Brown for this simple and elegant implementation.
84
85#undef GOOGLE_ARRAYSIZE
86#define GOOGLE_ARRAYSIZE(a) \
87 ((sizeof(a) / sizeof(*(a))) / \
88 static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
89
90} // namespace protobuf
91} // namespace google
92
93#endif // GOOGLE_PROTOBUF_MACROS_H__
94