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 RE2_UTIL_UTIL_H__ 6#define RE2_UTIL_UTIL_H__ 7 8// C 9#include <stdio.h> 10#include <string.h> 11#include <stdint.h> 12#include <stddef.h> // For size_t 13#include <assert.h> 14#include <stdarg.h> 15#ifndef WIN32 16#include <sys/time.h> 17#endif 18#include <time.h> 19#include <ctype.h> // For isdigit, isalpha. 20 21// C++ 22#include <vector> 23#include <string> 24#include <algorithm> 25#include <iosfwd> 26#include <map> 27#include <stack> 28#include <ostream> 29#include <utility> 30#include <set> 31 32#include "build/build_config.h" 33#include "base/third_party/dynamic_annotations/dynamic_annotations.h" 34 35// Use std names. 36using std::set; 37using std::pair; 38using std::vector; 39using std::string; 40using std::min; 41using std::max; 42using std::ostream; 43using std::map; 44using std::stack; 45using std::sort; 46using std::swap; 47using std::make_pair; 48 49#if defined(__GNUC__) && !defined(USE_CXX0X) && !defined(OS_ANDROID) && \ 50 !defined(_LIBCPP_ABI_VERSION) 51 52#include <tr1/unordered_set> 53using std::tr1::unordered_set; 54 55#else 56 57#include <unordered_set> 58#if defined(WIN32) || defined(OS_ANDROID) 59using std::tr1::unordered_set; 60#else 61using std::unordered_set; 62#endif 63 64#endif 65 66namespace re2 { 67 68typedef int8_t int8; 69typedef uint8_t uint8; 70typedef int16_t int16; 71typedef uint16_t uint16; 72typedef int32_t int32; 73typedef uint32_t uint32; 74typedef int64_t int64; 75typedef uint64_t uint64; 76 77typedef unsigned long ulong; 78typedef unsigned int uint; 79typedef unsigned short ushort; 80 81// COMPILE_ASSERT causes a compile error about msg if expr is not true. 82template<bool> struct CompileAssert {}; 83#define COMPILE_ASSERT(expr, msg) \ 84 typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] 85 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&) 91 92#define arraysize(array) (sizeof(array)/sizeof((array)[0])) 93 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) 105#endif 106 107class StringPiece; 108 109string CEscape(const StringPiece& src); 110int CEscapeString(const char* src, int src_len, char* dest, int dest_len); 111 112extern string StringPrintf(const char* format, ...); 113extern void SStringPrintf(string* dst, const char* format, ...); 114extern void StringAppendF(string* dst, const char* format, ...); 115extern string PrefixSuccessor(const StringPiece& prefix); 116 117uint32 hashword(const uint32*, size_t, uint32); 118void hashword2(const uint32*, size_t, uint32*, uint32*); 119 120static inline uint32 Hash32StringWithSeed(const char* s, int len, uint32 seed) { 121 return hashword((uint32*)s, len/4, seed); 122} 123 124static inline uint64 Hash64StringWithSeed(const char* s, int len, uint32 seed) { 125 uint32 x, y; 126 x = seed; 127 y = 0; 128 hashword2((uint32*)s, len/4, &x, &y); 129 return ((uint64)x << 32) | y; 130} 131 132inline bool RunningOnValgrindOrMemorySanitizer() { 133#if defined(MEMORY_SANITIZER) 134 return true; 135#else 136 return RunningOnValgrind(); 137#endif 138} 139 140} // namespace re2 141 142#include "util/arena.h" 143#include "util/logging.h" 144#include "util/mutex.h" 145#include "util/utf.h" 146 147#endif // RE2_UTIL_UTIL_H__ 148