util.h revision c94c4501fe83e3ad77ce597b55bbbfbf533c10ee
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
45c94c4501fe83e3ad77ce597b55bbbfbf533c10eePrzemyslaw Szczepaniak#if defined(_STLPORT_VERSION)
46c94c4501fe83e3ad77ce597b55bbbfbf533c10eePrzemyslaw Szczepaniak#include <unordered_set>      // using stlport
47c94c4501fe83e3ad77ce597b55bbbfbf533c10eePrzemyslaw Szczepaniak#else
48c94c4501fe83e3ad77ce597b55bbbfbf533c10eePrzemyslaw Szczepaniak#include <tr1/unordered_set>  // using gnustl
49c94c4501fe83e3ad77ce597b55bbbfbf533c10eePrzemyslaw Szczepaniak#endif
50c94c4501fe83e3ad77ce597b55bbbfbf533c10eePrzemyslaw Szczepaniak
512ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::tr1::unordered_set;
522ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
532ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#elif defined(__GNUC__) && !defined(USE_CXX0X)
542ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
552ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <tr1/unordered_set>
562ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::tr1::unordered_set;
572ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
582ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#else
592ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
602ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <unordered_set>
612ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing std::unordered_set;
622ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
632ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#endif
642ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
652ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonnamespace re2 {
662ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
672ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef int8_t int8;
682ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef uint8_t uint8;
692ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef int16_t int16;
702ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef uint16_t uint16;
712ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef int32_t int32;
722ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef uint32_t uint32;
732ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef int64_t int64;
742ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef uint64_t uint64;
752ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
762ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef unsigned long ulong;
772ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef unsigned int uint;
782ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef unsigned short ushort;
792ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
802ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// COMPILE_ASSERT causes a compile error about msg if expr is not true.
812ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontemplate<bool> struct CompileAssert {};
822ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define COMPILE_ASSERT(expr, msg) \
832ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]
842ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
852ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// DISALLOW_EVIL_CONSTRUCTORS disallows the copy and operator= functions.
862ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// It goes in the private: declarations in a class.
872ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define DISALLOW_EVIL_CONSTRUCTORS(TypeName) \
882ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  TypeName(const TypeName&);                 \
892ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  void operator=(const TypeName&)
902ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
912ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define arraysize(array) (sizeof(array)/sizeof((array)[0]))
922ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
932ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// Fake lock annotations.  For real ones, see
942ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// http://code.google.com/p/data-race-test/
952ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_PUBLISH_MEMORY_RANGE(a, b)
962ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_IGNORE_WRITES_BEGIN()
972ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_IGNORE_WRITES_END()
982ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_BENIGN_RACE(a, b)
992ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define NO_THREAD_SAFETY_ANALYSIS
1002ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_HAPPENS_BEFORE(x)
1012ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define ANNOTATE_HAPPENS_AFTER(x)
1022ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1032ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonclass StringPiece;
1042ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1052ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonstring CEscape(const StringPiece& src);
1062ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonint CEscapeString(const char* src, int src_len, char* dest, int dest_len);
1072ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1082ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonextern string StringPrintf(const char* format, ...);
1092ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonextern void SStringPrintf(string* dst, const char* format, ...);
1102ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonextern void StringAppendF(string* dst, const char* format, ...);
1112ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonextern string PrefixSuccessor(const StringPiece& prefix);
1122ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1132ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonuint32 hashword(const uint32*, size_t, uint32);
1142ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonvoid hashword2(const uint32*, size_t, uint32*, uint32*);
1152ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1162ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonstatic inline uint32 Hash32StringWithSeed(const char* s, int len, uint32 seed) {
1172ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  return hashword((uint32*)s, len/4, seed);
1182ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}
1192ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1202ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonstatic inline uint64 Hash64StringWithSeed(const char* s, int len, uint32 seed) {
1212ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  uint32 x, y;
1222ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  x = seed;
1232ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  y = 0;
1242ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  hashword2((uint32*)s, len/4, &x, &y);
1252ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  return ((uint64)x << 32) | y;
1262ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}
1272ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1282ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonint RunningOnValgrind();
1292ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1302ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}  // namespace re2
1312ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1322ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "util/arena.h"
1332ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "util/logging.h"
1342ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "util/mutex.h"
1352ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "util/utf.h"
1362ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1372ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#endif // RE2_UTIL_UTIL_H__
138