1// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// NameSpace.h: Defines the NameSpace class, which is used to
16// allocate GL object names.
17
18#ifndef gl_NameSpace_hpp
19#define gl_NameSpace_hpp
20
21#include "Object.hpp"
22#include "debug.h"
23
24#include <map>
25
26namespace gl
27{
28
29template<class ObjectType, GLuint baseName = 1>
30class NameSpace
31{
32public:
33 NameSpace() : freeName(baseName)
34 {
35 }
36
37 ~NameSpace()
38 {
39 ASSERT(empty());
40 }
41
42 bool empty()
43 {
44 return map.empty();
45 }
46
47 GLuint firstName()
48 {
49 return map.begin()->first;
50 }
51
52 GLuint lastName()
53 {
54 return map.rbegin()->first;
55 }
56
57 GLuint allocate(ObjectType *object = nullptr)
58 {
59 GLuint name = freeName;
60
61 while(isReserved(name))
62 {
63 name++;
64 }
65
66 map.insert({name, object});
67 freeName = name + 1;
68
69 return name;
70 }
71
72 bool isReserved(GLuint name) const
73 {
74 return map.find(name) != map.end();
75 }
76
77 void insert(GLuint name, ObjectType *object)
78 {
79 map[name] = object;
80
81 if(name == freeName)
82 {
83 freeName++;
84 }
85 }
86
87 ObjectType *remove(GLuint name)
88 {
89 auto element = map.find(name);
90
91 if(element != map.end())
92 {
93 ObjectType *object = element->second;
94 map.erase(element);
95
96 if(name < freeName)
97 {
98 freeName = name;
99 }
100
101 return object;
102 }
103
104 return nullptr;
105 }
106
107 ObjectType *find(GLuint name) const
108 {
109 auto element = map.find(name);
110
111 if(element == map.end())
112 {
113 return nullptr;
114 }
115
116 return element->second;
117 }
118
119private:
120 typedef std::map<GLuint, ObjectType*> Map;
121 Map map;
122
123 GLuint freeName; // Lowest known potentially free name
124};
125
126}
127
128#endif // gl_NameSpace_hpp
129