1 // 2 // Copyright (c) 2002-2014 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 // angleutils.h: Common ANGLE utilities. 8 9 #ifndef COMMON_ANGLEUTILS_H_ 10 #define COMMON_ANGLEUTILS_H_ 11 12 #include "common/platform.h" 13 14 #include <stddef.h> 15 #include <limits.h> 16 #include <string> 17 #include <set> 18 #include <sstream> 19 #include <cstdarg> 20 21 // A macro to disallow the copy constructor and operator= functions 22 // This must be used in the private: declarations for a class 23 #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ 24 TypeName(const TypeName&); \ 25 void operator=(const TypeName&) 26 27 template <typename T, size_t N> 28 inline size_t ArraySize(T(&)[N]) 29 { 30 return N; 31 } 32 33 template <typename T, unsigned int N> 34 void SafeRelease(T (&resourceBlock)[N]) 35 { 36 for (unsigned int i = 0; i < N; i++) 37 { 38 SafeRelease(resourceBlock[i]); 39 } 40 } 41 42 template <typename T> 43 void SafeRelease(T& resource) 44 { 45 if (resource) 46 { 47 resource->Release(); 48 resource = NULL; 49 } 50 } 51 52 template <typename T> 53 void SafeDelete(T*& resource) 54 { 55 delete resource; 56 resource = NULL; 57 } 58 59 template <typename T> 60 void SafeDeleteContainer(T& resource) 61 { 62 for (typename T::iterator i = resource.begin(); i != resource.end(); i++) 63 { 64 SafeDelete(*i); 65 } 66 resource.clear(); 67 } 68 69 template <typename T> 70 void SafeDeleteArray(T*& resource) 71 { 72 delete[] resource; 73 resource = NULL; 74 } 75 76 // Provide a less-than function for comparing structs 77 // Note: struct memory must be initialized to zero, because of packing gaps 78 template <typename T> 79 inline bool StructLessThan(const T &a, const T &b) 80 { 81 return (memcmp(&a, &b, sizeof(T)) < 0); 82 } 83 84 // Provide a less-than function for comparing structs 85 // Note: struct memory must be initialized to zero, because of packing gaps 86 template <typename T> 87 inline bool StructEquals(const T &a, const T &b) 88 { 89 return (memcmp(&a, &b, sizeof(T)) == 0); 90 } 91 92 template <typename T> 93 inline void StructZero(T *obj) 94 { 95 memset(obj, 0, sizeof(T)); 96 } 97 98 inline const char* MakeStaticString(const std::string &str) 99 { 100 static std::set<std::string> strings; 101 std::set<std::string>::iterator it = strings.find(str); 102 if (it != strings.end()) 103 { 104 return it->c_str(); 105 } 106 107 return strings.insert(str).first->c_str(); 108 } 109 110 inline std::string ArrayString(unsigned int i) 111 { 112 // We assume UINT_MAX and GL_INVALID_INDEX are equal 113 // See DynamicHLSL.cpp 114 if (i == UINT_MAX) 115 { 116 return ""; 117 } 118 119 std::stringstream strstr; 120 121 strstr << "["; 122 strstr << i; 123 strstr << "]"; 124 125 return strstr.str(); 126 } 127 128 inline std::string Str(int i) 129 { 130 std::stringstream strstr; 131 strstr << i; 132 return strstr.str(); 133 } 134 135 std::string FormatString(const char *fmt, va_list vararg); 136 std::string FormatString(const char *fmt, ...); 137 138 #if defined(_MSC_VER) 139 #define snprintf _snprintf 140 #endif 141 142 #define VENDOR_ID_AMD 0x1002 143 #define VENDOR_ID_INTEL 0x8086 144 #define VENDOR_ID_NVIDIA 0x10DE 145 146 #define GL_BGRA4_ANGLEX 0x6ABC 147 #define GL_BGR5_A1_ANGLEX 0x6ABD 148 #define GL_INT_64_ANGLEX 0x6ABE 149 #define GL_STRUCT_ANGLEX 0x6ABF 150 151 #endif // COMMON_ANGLEUTILS_H_ 152