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