// // 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; // // 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; } // Allocate a char array in the global memory pool. str must be a null terminated string. strLength // is the length without the null terminator. inline const char *AllocatePoolCharArray(const char *str, size_t strLength) { size_t requiredSize = strLength + 1; char *buffer = static_cast(GetGlobalPoolAllocator()->allocate(requiredSize)); memcpy(buffer, str, requiredSize); ASSERT(buffer[strLength] == '\0'); return buffer; } // Initialize a new stream which must be imbued with the classic locale template T InitializeStream() { T stream; stream.imbue(std::locale::classic()); return stream; } } // 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_