WoW Model Viewer
Your premiere tool for viewing, equipping and animating World of Warcraft models.
Loading...
Searching...
No Matches
manager.h
Go to the documentation of this file.
1#pragma once
2
3#include <map>
4#include <string>
5#include <glad/gl.h>
6// ReSharper disable once CppUnusedIncludeDirective
7#include "GameFile.h"
8#include "Logger.h"
9
15{
17 std::string m_itemName;
18
19public:
20 ManagedItem(std::string n): m_refcount(0), m_itemName(std::move(n))
21 {
22 }
23
24 virtual ~ManagedItem()
25 {
26 }
27
28 void addref()
29 {
30 ++m_refcount;
31 }
32
33 bool delref()
34 {
35 return --m_refcount == 0;
36 }
37
38 void setItemName(std::string name) { m_itemName = std::move(name); }
39 const std::string& itemName() const { return m_itemName; }
40 int refCount() { return m_refcount; }
41};
42
45template <class IDTYPE>
47{
48public:
49 std::map<std::string, IDTYPE> names;
50 std::map<IDTYPE, ManagedItem*> items;
51
52 Manager() = default;
53
55 {
56 names.clear();
57 items.clear();
58 }
59
60 virtual IDTYPE add(GameFile*) = 0;
61
62 virtual void del(IDTYPE id)
63 {
64 if (items.find(id) == items.end())
65 {
66 doDelete(id);
67 return; // if we can't find the item id, delete the texture
68 }
69
70 if (items[id]->delref())
71 {
72 ManagedItem* i = items[id];
73
74 if (!i)
75 return;
76
77 doDelete(id);
78
79 auto it = names.find(i->itemName());
80 if (it != names.end()) // Ensure the iterator is valid before erasing
81 {
82 names.erase(it);
83 }
84
85 items.erase(items.find(id));
86 delete i;
87 }
88 }
89
90 void delbyname(const std::string& name)
91 {
92 if (has(name))
93 del(get(name));
94 }
95
96 virtual void doDelete(IDTYPE)
97 {
98 }
99
100 bool has(const std::string& name)
101 {
102 return (names.find(name) != names.end());
103 }
104
105 IDTYPE get(const std::string& name)
106 {
107 auto it = names.find(name);
108 if (it != names.end())
109 return it->second;
110
111 return 0;
112 }
113
114 std::string get(IDTYPE id)
115 {
116 std::string result;
117 for (auto const& it : names)
118 {
119 if (it.second == id)
120 {
121 result = it.first;
122 break;
123 }
124 }
125 return result;
126 }
127
128 void clear()
129 {
130 for (size_t i = 0; i < 50; i++)
131 {
132 if (items.find(static_cast<const unsigned int>(i)) != items.end())
133 {
134 del((GLuint)i);
135 }
136 }
137
138 names.clear();
139 items.clear();
140 }
141
142 void dump()
143 {
144 for (auto it : items)
145 LOG_INFO << it.first << "->" << it.second->itemName() << "(" << it.second->refCount() << ")";
146 }
147
148protected:
149 void do_add(const std::string& name, IDTYPE id, ManagedItem* item)
150 {
151 names[name] = id;
152 item->addref();
153 items[id] = item;
154 }
155};
156
157class SimpleManager : public Manager<int>
158{
160
161public:
163 {
164 }
165
166protected:
167 int nextID()
168 {
169 return baseid++;
170 }
171};
#define LOG_INFO
Definition Logger.h:10
Abstract base class representing a file within the game data archive.
Definition GameFile.h:12
Reference-counted item stored in a Manager.
Definition manager.h:15
ManagedItem(std::string n)
Definition manager.h:20
std::string m_itemName
Definition manager.h:17
bool delref()
Definition manager.h:33
int m_refcount
Definition manager.h:16
void setItemName(std::string name)
Definition manager.h:38
void addref()
Definition manager.h:28
const std::string & itemName() const
Definition manager.h:39
virtual ~ManagedItem()
Definition manager.h:24
int refCount()
Definition manager.h:40
Generic name-to-ID resource manager with reference-counted items.
Definition manager.h:47
virtual IDTYPE add(GameFile *)=0
bool has(const std::string &name)
Definition manager.h:100
virtual void del(IDTYPE id)
Definition manager.h:62
void delbyname(const std::string &name)
Definition manager.h:90
Manager()=default
std::string get(IDTYPE id)
Definition manager.h:114
std::map< IDTYPE, ManagedItem * > items
Definition manager.h:50
virtual void doDelete(IDTYPE)
Definition manager.h:96
void clear()
Definition manager.h:128
void dump()
Definition manager.h:142
~Manager()
Definition manager.h:54
std::map< std::string, IDTYPE > names
Definition manager.h:49
IDTYPE get(const std::string &name)
Definition manager.h:105
void do_add(const std::string &name, IDTYPE id, ManagedItem *item)
Definition manager.h:149
int nextID()
Definition manager.h:167