12ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// Copyright 2009 The RE2 Authors. All Rights Reserved. 22ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// Use of this source code is governed by a BSD-style 32ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// license that can be found in the LICENSE file. 42ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 52ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#ifndef RE2_UTIL_UTIL_H__ 62ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define RE2_UTIL_UTIL_H__ 72ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 82ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// C 92ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <stdio.h> 102ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <string.h> 112ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <stdint.h> 122ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <stddef.h> // For size_t 132ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <assert.h> 142ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <stdarg.h> 152ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <sys/time.h> 162ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <time.h> 172ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 182ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// C++ 192ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <vector> 202ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <string> 212ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <algorithm> 222ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <iosfwd> 232ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <map> 242ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <stack> 252ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <iostream> 262ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <utility> 272ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <set> 282ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 292ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// Use std names. 302ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::set; 312ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::pair; 322ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::vector; 332ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::string; 342ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::min; 352ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::max; 362ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::ostream; 372ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::map; 382ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::stack; 392ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::sort; 402ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::swap; 412ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::make_pair; 422ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 432ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#if defined(ANDROID) 442ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 452ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <unordered_set> 462ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::tr1::unordered_set; 472ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 482ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#elif defined(__GNUC__) && !defined(USE_CXX0X) 492ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 502ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <tr1/unordered_set> 512ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::tr1::unordered_set; 522ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 532ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#else 542ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 552ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <unordered_set> 562ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::unordered_set; 572ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 582ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#endif 592ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 602ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonnamespace re2 { 612ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 622ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef int8_t int8; 632ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef uint8_t uint8; 642ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef int16_t int16; 652ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef uint16_t uint16; 662ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef int32_t int32; 672ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef uint32_t uint32; 682ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef int64_t int64; 692ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef uint64_t uint64; 702ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 712ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef unsigned long ulong; 722ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef unsigned int uint; 732ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef unsigned short ushort; 742ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 752ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// COMPILE_ASSERT causes a compile error about msg if expr is not true. 762ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontemplate<bool> struct CompileAssert {}; 772ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define COMPILE_ASSERT(expr, msg) \ 782ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] 792ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 802ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// DISALLOW_EVIL_CONSTRUCTORS disallows the copy and operator= functions. 812ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// It goes in the private: declarations in a class. 822ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define DISALLOW_EVIL_CONSTRUCTORS(TypeName) \ 832ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson TypeName(const TypeName&); \ 842ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson void operator=(const TypeName&) 852ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 862ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define arraysize(array) (sizeof(array)/sizeof((array)[0])) 872ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 882ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// Fake lock annotations. For real ones, see 892ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// http://code.google.com/p/data-race-test/ 902ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_PUBLISH_MEMORY_RANGE(a, b) 912ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_IGNORE_WRITES_BEGIN() 922ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_IGNORE_WRITES_END() 932ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_BENIGN_RACE(a, b) 942ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define NO_THREAD_SAFETY_ANALYSIS 952ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_HAPPENS_BEFORE(x) 962ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_HAPPENS_AFTER(x) 972ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 982ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonclass StringPiece; 992ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 1002ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonstring CEscape(const StringPiece& src); 1012ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonint CEscapeString(const char* src, int src_len, char* dest, int dest_len); 1022ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 1032ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonextern string StringPrintf(const char* format, ...); 1042ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonextern void SStringPrintf(string* dst, const char* format, ...); 1052ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonextern void StringAppendF(string* dst, const char* format, ...); 1062ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonextern string PrefixSuccessor(const StringPiece& prefix); 1072ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 1082ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonuint32 hashword(const uint32*, size_t, uint32); 1092ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonvoid hashword2(const uint32*, size_t, uint32*, uint32*); 1102ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 1112ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonstatic inline uint32 Hash32StringWithSeed(const char* s, int len, uint32 seed) { 1122ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return hashword((uint32*)s, len/4, seed); 1132ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson} 1142ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 1152ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonstatic inline uint64 Hash64StringWithSeed(const char* s, int len, uint32 seed) { 1162ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson uint32 x, y; 1172ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson x = seed; 1182ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson y = 0; 1192ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson hashword2((uint32*)s, len/4, &x, &y); 1202ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return ((uint64)x << 32) | y; 1212ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson} 1222ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 1232ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonint RunningOnValgrind(); 1242ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 1252ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson} // namespace re2 1262ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 1272ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "util/arena.h" 1282ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "util/logging.h" 1292ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "util/mutex.h" 1302ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "util/utf.h" 1312ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 1322ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#endif // RE2_UTIL_UTIL_H__ 133