// // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // #ifndef COMPILER_TRANSLATOR_COMMON_H_ #define COMPILER_TRANSLATOR_COMMON_H_ #include #include #include #include #include #include #include #include "common/angleutils.h" #include "common/debug.h" #include "common/third_party/smhasher/src/PMurHash.h" #include "compiler/translator/PoolAlloc.h" namespace sh { struct TSourceLoc { int first_file; int first_line; int last_file; int last_line; }; // // Put POOL_ALLOCATOR_NEW_DELETE in base classes to make them use this scheme. // #define POOL_ALLOCATOR_NEW_DELETE() \ void *operator new(size_t s) { return GetGlobalPoolAllocator()->allocate(s); } \ void *operator new(size_t, void *_Where) { return (_Where); } \ void operator delete(void *) {} \ void operator delete(void *, void *) {} \ void *operator new[](size_t s) { return GetGlobalPoolAllocator()->allocate(s); } \ void *operator new[](size_t, void *_Where) { return (_Where); } \ void operator delete[](void *) {} \ void operator delete[](void *, void *) {} // // Pool version of string. // typedef pool_allocator TStringAllocator; typedef std::basic_string, TStringAllocator> TString; typedef std::basic_ostringstream, TStringAllocator> TStringStream; inline TString *NewPoolTString(const char *s) { void *memory = GetGlobalPoolAllocator()->allocate(sizeof(TString)); return new (memory) TString(s); } // // Persistent string memory. Should only be used for strings that survive // across compiles. // #define TPersistString std::string #define TPersistStringStream std::ostringstream // // Pool allocator versions of vectors, lists, and maps // template class TVector : public std::vector> { public: POOL_ALLOCATOR_NEW_DELETE(); typedef typename std::vector>::size_type size_type; TVector() : std::vector>() {} TVector(const pool_allocator &a) : std::vector>(a) {} TVector(size_type i) : std::vector>(i) {} }; template , class CMP = std::equal_to> class TUnorderedMap : public std::unordered_map>> { public: POOL_ALLOCATOR_NEW_DELETE(); typedef pool_allocator> tAllocator; TUnorderedMap() : std::unordered_map() {} // use correct two-stage name lookup supported in gcc 3.4 and above TUnorderedMap(const tAllocator &a) : std::unordered_map( std::unordered_map::key_compare(), a) { } }; template > class TMap : public std::map>> { public: POOL_ALLOCATOR_NEW_DELETE(); typedef pool_allocator> tAllocator; TMap() : std::map() {} // use correct two-stage name lookup supported in gcc 3.4 and above TMap(const tAllocator &a) : std::map(std::map::key_compare(), a) { } }; // Integer to TString conversion template inline TString str(T i) { ASSERT(std::numeric_limits::is_integer); char buffer[((8 * sizeof(T)) / 3) + 3]; const char *formatStr = std::numeric_limits::is_signed ? "%d" : "%u"; snprintf(buffer, sizeof(buffer), formatStr, i); return buffer; } } // namespace sh namespace std { template <> struct hash { size_t operator()(const sh::TString &s) const { return angle::PMurHash32(0, s.data(), static_cast(s.length())); } }; } // namespace std #endif // COMPILER_TRANSLATOR_COMMON_H_