1// 2// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 3// Use of this source code is governed by a BSD-style license that can be 4// found in the LICENSE file. 5// 6 7#ifndef _COMMON_INCLUDED_ 8#define _COMMON_INCLUDED_ 9 10#include <map> 11#include <sstream> 12#include <string> 13#include <vector> 14#include <limits> 15#include <stdio.h> 16 17#include "compiler/translator/PoolAlloc.h" 18#include "compiler/translator/compilerdebug.h" 19#include "common/angleutils.h" 20 21struct TSourceLoc { 22 int first_file; 23 int first_line; 24 int last_file; 25 int last_line; 26}; 27 28// 29// Put POOL_ALLOCATOR_NEW_DELETE in base classes to make them use this scheme. 30// 31#define POOL_ALLOCATOR_NEW_DELETE() \ 32 void* operator new(size_t s) { return GetGlobalPoolAllocator()->allocate(s); } \ 33 void* operator new(size_t, void *_Where) { return (_Where); } \ 34 void operator delete(void*) { } \ 35 void operator delete(void *, void *) { } \ 36 void* operator new[](size_t s) { return GetGlobalPoolAllocator()->allocate(s); } \ 37 void* operator new[](size_t, void *_Where) { return (_Where); } \ 38 void operator delete[](void*) { } \ 39 void operator delete[](void *, void *) { } 40 41// 42// Pool version of string. 43// 44typedef pool_allocator<char> TStringAllocator; 45typedef std::basic_string <char, std::char_traits<char>, TStringAllocator> TString; 46typedef std::basic_ostringstream<char, std::char_traits<char>, TStringAllocator> TStringStream; 47inline TString* NewPoolTString(const char* s) 48{ 49 void* memory = GetGlobalPoolAllocator()->allocate(sizeof(TString)); 50 return new(memory) TString(s); 51} 52 53// 54// Persistent string memory. Should only be used for strings that survive 55// across compiles. 56// 57#define TPersistString std::string 58#define TPersistStringStream std::ostringstream 59 60// 61// Pool allocator versions of vectors, lists, and maps 62// 63template <class T> class TVector : public std::vector<T, pool_allocator<T> > { 64public: 65 typedef typename std::vector<T, pool_allocator<T> >::size_type size_type; 66 TVector() : std::vector<T, pool_allocator<T> >() {} 67 TVector(const pool_allocator<T>& a) : std::vector<T, pool_allocator<T> >(a) {} 68 TVector(size_type i): std::vector<T, pool_allocator<T> >(i) {} 69}; 70 71template <class K, class D, class CMP = std::less<K> > 72class TMap : public std::map<K, D, CMP, pool_allocator<std::pair<const K, D> > > { 73public: 74 typedef pool_allocator<std::pair<const K, D> > tAllocator; 75 76 TMap() : std::map<K, D, CMP, tAllocator>() {} 77 // use correct two-stage name lookup supported in gcc 3.4 and above 78 TMap(const tAllocator& a) : std::map<K, D, CMP, tAllocator>(std::map<K, D, CMP, tAllocator>::key_compare(), a) {} 79}; 80 81// Integer to TString conversion 82template <typename T> 83inline TString str(T i) 84{ 85 ASSERT(std::numeric_limits<T>::is_integer); 86 char buffer[((8 * sizeof(T)) / 3) + 3]; 87 const char *formatStr = std::numeric_limits<T>::is_signed ? "%d" : "%u"; 88 snprintf(buffer, sizeof(buffer), formatStr, i); 89 return buffer; 90} 91 92#endif // _COMMON_INCLUDED_ 93