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.
5 #ifndef RE2_UTIL_UTIL_H__
6 #define RE2_UTIL_UTIL_H__
12 #include <stddef.h> // For size_t
19 #include <ctype.h> // For isdigit, isalpha.
32 #include "build/build_config.h"
33 #include "base/third_party/dynamic_annotations/dynamic_annotations.h"
49 #if defined(__GNUC__) && !defined(USE_CXX0X) && !defined(OS_ANDROID) && \
50 !defined(_LIBCPP_ABI_VERSION)
52 #include <tr1/unordered_set>
53 using std::tr1::unordered_set
;
57 #include <unordered_set>
58 #if defined(WIN32) || defined(OS_ANDROID)
59 using std::tr1::unordered_set
;
61 using std::unordered_set
;
69 typedef uint8_t uint8
;
70 typedef int16_t int16
;
71 typedef uint16_t uint16
;
72 typedef int32_t int32
;
73 typedef uint32_t uint32
;
74 typedef int64_t int64
;
75 typedef uint64_t uint64
;
77 typedef unsigned long ulong
;
78 typedef unsigned int uint
;
79 typedef unsigned short ushort
;
81 // COMPILE_ASSERT causes a compile error about msg if expr is not true.
82 template<bool> struct CompileAssert
{};
83 #define COMPILE_ASSERT(expr, msg) \
84 typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]
86 // DISALLOW_EVIL_CONSTRUCTORS disallows the copy and operator= functions.
87 // It goes in the private: declarations in a class.
88 #define DISALLOW_EVIL_CONSTRUCTORS(TypeName) \
89 TypeName(const TypeName&); \
90 void operator=(const TypeName&)
92 #define arraysize(array) (sizeof(array)/sizeof((array)[0]))
94 // Fake lock annotations. For real ones, see
95 // http://code.google.com/p/data-race-test/
96 #ifndef ANNOTATE_PUBLISH_MEMORY_RANGE
97 #define ANNOTATE_PUBLISH_MEMORY_RANGE(a, b)
98 #define ANNOTATE_IGNORE_WRITES_BEGIN()
99 #define ANNOTATE_IGNORE_WRITES_END()
100 #define ANNOTATE_BENIGN_RACE(a, b)
101 #define NO_THREAD_SAFETY_ANALYSIS
102 #define ANNOTATE_HAPPENS_BEFORE(x)
103 #define ANNOTATE_HAPPENS_AFTER(x)
104 #define ANNOTATE_UNPROTECTED_READ(x) (x)
109 string
CEscape(const StringPiece
& src
);
110 int CEscapeString(const char* src
, int src_len
, char* dest
, int dest_len
);
112 extern string
StringPrintf(const char* format
, ...);
113 extern void SStringPrintf(string
* dst
, const char* format
, ...);
114 extern void StringAppendF(string
* dst
, const char* format
, ...);
115 extern string
PrefixSuccessor(const StringPiece
& prefix
);
117 uint32
hashword(const uint32
*, size_t, uint32
);
118 void hashword2(const uint32
*, size_t, uint32
*, uint32
*);
120 static inline uint32
Hash32StringWithSeed(const char* s
, int len
, uint32 seed
) {
121 return hashword((uint32
*)s
, len
/4, seed
);
124 static inline uint64
Hash64StringWithSeed(const char* s
, int len
, uint32 seed
) {
128 hashword2((uint32
*)s
, len
/4, &x
, &y
);
129 return ((uint64
)x
<< 32) | y
;
132 inline bool RunningOnValgrindOrMemorySanitizer() {
133 #if defined(MEMORY_SANITIZER)
136 return RunningOnValgrind();
142 #include "util/arena.h"
143 #include "util/logging.h"
144 #include "util/mutex.h"
145 #include "util/utf.h"
147 #endif // RE2_UTIL_UTIL_H__