19e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert/* 29e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert * Copyright (C) 2015 The Android Open Source Project 39e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert * 49e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert * Licensed under the Apache License, Version 2.0 (the "License"); 59e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert * you may not use this file except in compliance with the License. 69e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert * You may obtain a copy of the License at 79e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert * 89e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert * http://www.apache.org/licenses/LICENSE-2.0 99e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert * 109e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert * Unless required by applicable law or agreed to in writing, software 119e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert * distributed under the License is distributed on an "AS IS" BASIS, 129e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert * See the License for the specific language governing permissions and 149e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert * limitations under the License. 159e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert */ 169e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert 179e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#ifndef UTILS_MACROS_H 189e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#define UTILS_MACROS_H 199e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert 209e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#include <stddef.h> // for size_t 219e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#include <unistd.h> // for TEMP_FAILURE_RETRY 229e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert 239e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// bionic and glibc both have TEMP_FAILURE_RETRY, but eg Mac OS' libc doesn't. 249e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#ifndef TEMP_FAILURE_RETRY 259e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#define TEMP_FAILURE_RETRY(exp) \ 269e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert ({ \ 279e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert decltype(exp) _rc; \ 289e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert do { \ 299e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert _rc = (exp); \ 309e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert } while (_rc == -1 && errno == EINTR); \ 319e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert _rc; \ 329e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert }) 339e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#endif 349e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert 359e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// A macro to disallow the copy constructor and operator= functions 369e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// This must be placed in the private: declarations for a class. 379e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// 389e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// For disallowing only assign or copy, delete the relevant operator or 399e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// constructor, for example: 409e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// void operator=(const TypeName&) = delete; 419e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// Note, that most uses of DISALLOW_ASSIGN and DISALLOW_COPY are broken 429e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// semantically, one should either use disallow both or neither. Try to 439e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// avoid these in new code. 449e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// 459e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// When building with C++11 toolchains, just use the language support 469e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// for explicitly deleted methods. 479e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#if __cplusplus >= 201103L 489e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ 499e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert TypeName(const TypeName&) = delete; \ 509e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert void operator=(const TypeName&) = delete 519e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#else 529e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ 539e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert TypeName(const TypeName&); \ 549e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert void operator=(const TypeName&) 559e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#endif 569e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert 579e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// A macro to disallow all the implicit constructors, namely the 589e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// default constructor, copy constructor and operator= functions. 599e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// 609e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// This should be used in the private: declarations for a class 619e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// that wants to prevent anyone from instantiating it. This is 629e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// especially useful for classes containing only static methods. 639e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ 649e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert TypeName(); \ 659e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert DISALLOW_COPY_AND_ASSIGN(TypeName) 669e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert 679e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// The arraysize(arr) macro returns the # of elements in an array arr. 689e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// The expression is a compile-time constant, and therefore can be 699e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// used in defining new arrays, for example. If you use arraysize on 709e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// a pointer by mistake, you will get a compile-time error. 719e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// 729e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// One caveat is that arraysize() doesn't accept any array of an 739e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// anonymous type or a type defined inside a function. In these rare 749e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// cases, you have to use the unsafe ARRAYSIZE_UNSAFE() macro below. This is 759e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// due to a limitation in C++'s template system. The limitation might 769e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// eventually be removed, but it hasn't happened yet. 779e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert 789e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// This template function declaration is used in defining arraysize. 799e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// Note that the function doesn't need an implementation, as we only 809e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// use its type. 819e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Alberttemplate <typename T, size_t N> 829e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albertchar(&ArraySizeHelper(T(&array)[N]))[N]; // NOLINT(readability/casting) 839e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert 849e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#define arraysize(array) (sizeof(ArraySizeHelper(array))) 859e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert 869e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// ARRAYSIZE_UNSAFE performs essentially the same calculation as arraysize, 879e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// but can be used on anonymous types or types defined inside 889e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// functions. It's less safe than arraysize as it accepts some 899e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// (although not all) pointers. Therefore, you should use arraysize 909e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// whenever possible. 919e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// 929e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// The expression ARRAYSIZE_UNSAFE(a) is a compile-time constant of type 939e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// size_t. 949e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// 959e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// ARRAYSIZE_UNSAFE catches a few type errors. If you see a compiler error 969e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// 979e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// "warning: division by zero in ..." 989e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// 999e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// when using ARRAYSIZE_UNSAFE, you are (wrongfully) giving it a pointer. 1009e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// You should only use ARRAYSIZE_UNSAFE on statically allocated arrays. 1019e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// 1029e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// The following comments are on the implementation details, and can 1039e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// be ignored by the users. 1049e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// 1059e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// ARRAYSIZE_UNSAFE(arr) works by inspecting sizeof(arr) (the # of bytes in 1069e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// the array) and sizeof(*(arr)) (the # of bytes in one array 1079e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// element). If the former is divisible by the latter, perhaps arr is 1089e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// indeed an array, in which case the division result is the # of 1099e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// elements in the array. Otherwise, arr cannot possibly be an array, 1109e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// and we generate a compiler error to prevent the code from 1119e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// compiling. 1129e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// 1139e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// Since the size of bool is implementation-defined, we need to cast 1149e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// !(sizeof(a) & sizeof(*(a))) to size_t in order to ensure the final 1159e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// result has type size_t. 1169e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// 1179e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// This macro is not perfect as it wrongfully accepts certain 1189e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// pointers, namely where the pointer size is divisible by the pointee 1199e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// size. Since all our code has to go through a 32-bit compiler, 1209e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// where a pointer is 4 bytes, this means all pointers to a type whose 1219e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// size is 3 or greater than 4 will be (righteously) rejected. 1229e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#define ARRAYSIZE_UNSAFE(a) \ 1239e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert ((sizeof(a) / sizeof(*(a))) / \ 1249e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert static_cast<size_t>(!(sizeof(a) % sizeof(*(a))))) 1259e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert 1269e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#define LIKELY(x) __builtin_expect((x), true) 1279e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#define UNLIKELY(x) __builtin_expect((x), false) 1289e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert 1299e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#define WARN_UNUSED __attribute__((warn_unused_result)) 1309e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert 1319e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// A deprecated function to call to create a false use of the parameter, for 1329e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// example: 1339e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// int foo(int x) { UNUSED(x); return 10; } 1349e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// to avoid compiler warnings. Going forward we prefer ATTRIBUTE_UNUSED. 1359e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Alberttemplate <typename... T> 1369e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albertvoid UNUSED(const T&...) { 1379e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert} 1389e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert 1399e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// An attribute to place on a parameter to a function, for example: 1409e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// int foo(int x ATTRIBUTE_UNUSED) { return 10; } 1419e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// to avoid compiler warnings. 1429e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#define ATTRIBUTE_UNUSED __attribute__((__unused__)) 1439e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert 1449e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// The FALLTHROUGH_INTENDED macro can be used to annotate implicit fall-through 1459e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// between switch labels: 1469e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// switch (x) { 1479e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// case 40: 1489e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// case 41: 1499e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// if (truth_is_out_there) { 1509e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// ++x; 1519e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// FALLTHROUGH_INTENDED; // Use instead of/along with annotations in 1529e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// // comments. 1539e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// } else { 1549e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// return x; 1559e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// } 1569e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// case 42: 1579e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// ... 1589e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// 1599e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// As shown in the example above, the FALLTHROUGH_INTENDED macro should be 1609e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// followed by a semicolon. It is designed to mimic control-flow statements 1619e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// like 'break;', so it can be placed in most places where 'break;' can, but 1629e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// only if there are no statements on the execution path between it and the 1639e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// next switch label. 1649e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// 1659e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// When compiled with clang in C++11 mode, the FALLTHROUGH_INTENDED macro is 1669e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// expanded to [[clang::fallthrough]] attribute, which is analysed when 1679e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// performing switch labels fall-through diagnostic ('-Wimplicit-fallthrough'). 1689e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// See clang documentation on language extensions for details: 1699e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// http://clang.llvm.org/docs/LanguageExtensions.html#clang__fallthrough 1709e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// 1719e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// When used with unsupported compilers, the FALLTHROUGH_INTENDED macro has no 1729e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// effect on diagnostics. 1739e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// 1749e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// In either case this macro has no effect on runtime behavior and performance 1759e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert// of code. 1769e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#if defined(__clang__) && __cplusplus >= 201103L && defined(__has_warning) 1779e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough") 1789e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#define FALLTHROUGH_INTENDED [[clang::fallthrough]] // NOLINT 1799e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#endif 1809e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#endif 1819e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert 1829e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#ifndef FALLTHROUGH_INTENDED 1839e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#define FALLTHROUGH_INTENDED \ 1849e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert do { \ 1859e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert } while (0) 1869e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#endif 1879e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert 1889e159a8f220edef310b5676b2bb3fd088a7d0e41Dan Albert#endif // UTILS_MACROS_H 189