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
27template <typename T, size_t N>
28inline size_t ArraySize(T(&)[N])
29{
30    return N;
31}
32
33template <typename T, unsigned int N>
34void SafeRelease(T (&resourceBlock)[N])
35{
36    for (unsigned int i = 0; i < N; i++)
37    {
38        SafeRelease(resourceBlock[i]);
39    }
40}
41
42template <typename T>
43void SafeRelease(T& resource)
44{
45    if (resource)
46    {
47        resource->Release();
48        resource = NULL;
49    }
50}
51
52template <typename T>
53void SafeDelete(T*& resource)
54{
55    delete resource;
56    resource = NULL;
57}
58
59template <typename T>
60void 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
69template <typename T>
70void 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
78template <typename T>
79inline 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
86template <typename T>
87inline bool StructEquals(const T &a, const T &b)
88{
89    return (memcmp(&a, &b, sizeof(T)) == 0);
90}
91
92template <typename T>
93inline void StructZero(T *obj)
94{
95    memset(obj, 0, sizeof(T));
96}
97
98inline 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
110inline 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
128inline std::string Str(int i)
129{
130    std::stringstream strstr;
131    strstr << i;
132    return strstr.str();
133}
134
135std::string FormatString(const char *fmt, va_list vararg);
136std::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