13 #ifndef hifi_render_Stage_h
14 #define hifi_render_Stage_h
18 #include <unordered_map>
21 #include "IndexedContainer.h"
25 using ElementIndices = std::vector<indexed_container::Index>;
32 using Name = std::string;
33 using Index = indexed_container::Index;
34 static const Index INVALID_INDEX;
35 using IDList = indexed_container::Indices;
37 static bool isIndexInvalid(Index index) {
return index == INVALID_INDEX; }
40 using StagePointer = std::shared_ptr<Stage>;
41 using StageMap = std::map<const Stage::Name, StagePointer>;
44 class TypedStage :
public Stage {
47 virtual ~TypedStage() {}
49 static const Name& getName() {
return _name; }
51 bool checkId(Index index)
const {
return _elements.checkIndex(index); }
53 const T& getElement(Index
id)
const {
return _elements.get(
id); }
54 T& editElement(Index
id) {
return _elements.edit(
id); }
55 Index addElement(
const T& element) {
56 Index
id = _elements.newElement(element);
57 _activeElementIDs.push_back(
id);
61 void removeElement(Index index) {
62 IDList::iterator idIterator = std::find(_activeElementIDs.begin(), _activeElementIDs.end(), index);
63 if (idIterator != _activeElementIDs.end()) {
64 _activeElementIDs.erase(idIterator);
66 if (!_elements.isElementFreed(index)) {
67 _elements.freeElement(index);
71 IDList::iterator begin() {
return _activeElementIDs.begin(); }
72 IDList::iterator end() {
return _activeElementIDs.end(); }
76 indexed_container::IndexedVector<T> _elements;
77 IDList _activeElementIDs;
84 using Index = indexed_container::Index;
86 void clear() { _elements.clear(); }
87 void pushElement(Index index) { _elements.emplace_back(index); }
89 ElementIndices _elements;
92 template<
typename T,
typename P,
typename F = Frame>
93 class PointerStage :
public Stage {
96 virtual ~PointerStage() {}
98 static const Name& getName() {
return _name; }
100 bool checkId(Index index)
const {
return _elements.checkIndex(index); }
102 Index getNumElements()
const {
return _elements.getNumElements(); }
103 Index getNumFreeElements()
const {
return _elements.getNumFreeIndices(); }
104 Index getNumAllocatedElements()
const {
return _elements.getNumAllocatedIndices(); }
106 P getElement(Index
id)
const {
return _elements.get(
id); }
108 Index findElement(
const P& element)
const {
109 auto found = _elementMap.find(element);
110 if (found != _elementMap.end()) {
111 return INVALID_INDEX;
113 return (*found).second;
117 virtual Index addElement(
const P& element) {
118 auto found = _elementMap.find(element);
119 if (found == _elementMap.end()) {
120 auto id = _elements.newElement(element);
122 if (
id != INVALID_INDEX) {
124 _elementMap[element] = id;
128 return (*found).second;
132 virtual P removeElement(Index index) {
133 P removed = _elements.freeElement(index);
136 _elementMap.erase(removed);
142 using FramePointer = std::shared_ptr<F>;
148 indexed_container::IndexedPointerVector<T> _elements;
149 std::unordered_map<P, Index> _elementMap;