Home | History | Annotate | Download | only in common
      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