1 #ifndef _RIVE_IMPORT_STACK_HPP_
2 #define _RIVE_IMPORT_STACK_HPP_
3 #include "status_code.hpp"
5 #include <unordered_map>
11 class ImportStackObject
14 virtual ~ImportStackObject() {}
15 virtual StatusCode resolve() { return StatusCode::Ok; }
16 virtual bool readNullObject() { return false; }
22 std::unordered_map<uint16_t, ImportStackObject*> m_Latests;
23 std::vector<ImportStackObject*> m_LastAdded;
26 template <typename T = ImportStackObject> T* latest(uint16_t coreType)
28 auto itr = m_Latests.find(coreType);
29 if (itr == m_Latests.end())
33 return reinterpret_cast<T*>(itr->second);
36 StatusCode makeLatest(uint16_t coreType, ImportStackObject* object)
38 // Clean up the old object in the stack.
39 auto itr = m_Latests.find(coreType);
40 if (itr != m_Latests.end())
42 auto stackObject = itr->second;
44 // Remove it from latests.
46 m_LastAdded.begin(), m_LastAdded.end(), stackObject);
47 if (itr != m_LastAdded.end())
49 m_LastAdded.erase(itr);
52 StatusCode code = stackObject->resolve();
54 if (code != StatusCode::Ok)
56 m_Latests.erase(coreType);
62 if (object == nullptr)
64 m_Latests.erase(coreType);
68 m_Latests[coreType] = object;
69 m_LastAdded.push_back(object);
71 return StatusCode::Ok;
76 for (auto& pair : m_Latests)
78 StatusCode code = pair.second->resolve();
79 if (code != StatusCode::Ok)
84 return StatusCode::Ok;
89 for (auto& pair : m_Latests)
97 for (auto itr = m_LastAdded.rbegin(); itr != m_LastAdded.rend();
100 if ((*itr)->readNullObject())