util.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2009 The RE2 Authors. All Rights Reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// license that can be found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef RE2_UTIL_UTIL_H__ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define RE2_UTIL_UTIL_H__ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// C 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdint.h> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stddef.h> // For size_t 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <assert.h> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdarg.h> 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef WIN32 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/time.h> 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <time.h> 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <ctype.h> // For isdigit, isalpha. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// C++ 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <iosfwd> 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stack> 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ostream> 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility> 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/third_party/dynamic_annotations/dynamic_annotations.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use std names. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::set; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::pair; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::vector; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::string; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::min; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::max; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::ostream; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::map; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::stack; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::sort; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::swap; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::make_pair; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(__GNUC__) && !defined(USE_CXX0X) && !defined(OS_ANDROID) && \ 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !defined(_LIBCPP_ABI_VERSION) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <tr1/unordered_set> 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::tr1::unordered_set; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unordered_set> 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32) || defined(OS_ANDROID) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::tr1::unordered_set; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::unordered_set; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace re2 { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int8_t int8; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint8_t uint8; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int16_t int16; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint16_t uint16; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int32_t int32; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint32_t uint32; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64_t int64; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint64_t uint64; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned long ulong; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned int uint; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned short ushort; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// COMPILE_ASSERT causes a compile error about msg if expr is not true. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<bool> struct CompileAssert {}; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define COMPILE_ASSERT(expr, msg) \ 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DISALLOW_EVIL_CONSTRUCTORS disallows the copy and operator= functions. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It goes in the private: declarations in a class. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DISALLOW_EVIL_CONSTRUCTORS(TypeName) \ 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypeName(const TypeName&); \ 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void operator=(const TypeName&) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define arraysize(array) (sizeof(array)/sizeof((array)[0])) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fake lock annotations. For real ones, see 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://code.google.com/p/data-race-test/ 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef ANNOTATE_PUBLISH_MEMORY_RANGE 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define ANNOTATE_PUBLISH_MEMORY_RANGE(a, b) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define ANNOTATE_IGNORE_WRITES_BEGIN() 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define ANNOTATE_IGNORE_WRITES_END() 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define ANNOTATE_BENIGN_RACE(a, b) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define NO_THREAD_SAFETY_ANALYSIS 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define ANNOTATE_HAPPENS_BEFORE(x) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define ANNOTATE_HAPPENS_AFTER(x) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define ANNOTATE_UNPROTECTED_READ(x) (x) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StringPiece; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string CEscape(const StringPiece& src); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int CEscapeString(const char* src, int src_len, char* dest, int dest_len); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern string StringPrintf(const char* format, ...); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern void SStringPrintf(string* dst, const char* format, ...); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern void StringAppendF(string* dst, const char* format, ...); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern string PrefixSuccessor(const StringPiece& prefix); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 hashword(const uint32*, size_t, uint32); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void hashword2(const uint32*, size_t, uint32*, uint32*); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline uint32 Hash32StringWithSeed(const char* s, int len, uint32 seed) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hashword((uint32*)s, len/4, seed); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline uint64 Hash64StringWithSeed(const char* s, int len, uint32 seed) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 x, y; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = seed; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) y = 0; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hashword2((uint32*)s, len/4, &x, &y); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ((uint64)x << 32) | y; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)inline bool RunningOnValgrindOrMemorySanitizer() { 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(MEMORY_SANITIZER) 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return RunningOnValgrind(); 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace re2 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/arena.h" 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/logging.h" 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/mutex.h" 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/utf.h" 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // RE2_UTIL_UTIL_H__ 148