1 // Copyright 2009 The RE2 Authors. All Rights Reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 #ifndef UTIL_UTIL_H_ 6 #define UTIL_UTIL_H_ 7 8 #define arraysize(array) (sizeof(array)/sizeof((array)[0])) 9 10 #ifndef ATTRIBUTE_NORETURN 11 #if defined(__GNUC__) 12 #define ATTRIBUTE_NORETURN __attribute__((noreturn)) 13 #elif defined(_MSC_VER) 14 #define ATTRIBUTE_NORETURN __declspec(noreturn) 15 #else 16 #define ATTRIBUTE_NORETURN 17 #endif 18 #endif 19 20 #ifndef ATTRIBUTE_UNUSED 21 #if defined(__GNUC__) 22 #define ATTRIBUTE_UNUSED __attribute__((unused)) 23 #else 24 #define ATTRIBUTE_UNUSED 25 #endif 26 #endif 27 28 #ifndef FALLTHROUGH_INTENDED 29 #if defined(__clang__) 30 #define FALLTHROUGH_INTENDED [[clang::fallthrough]] 31 #elif defined(__GNUC__) && __GNUC__ >= 7 32 #define FALLTHROUGH_INTENDED [[gnu::fallthrough]] 33 #else 34 #define FALLTHROUGH_INTENDED do {} while (0) 35 #endif 36 #endif 37 38 #ifndef NO_THREAD_SAFETY_ANALYSIS 39 #define NO_THREAD_SAFETY_ANALYSIS 40 #endif 41 42 #endif // UTIL_UTIL_H_ 43