60 lines
2 KiB
Text
60 lines
2 KiB
Text
|
namespace dkh {
|
||
|
template <typename T, uint32_t D, typename C>
|
||
|
dk::Tyler<D> map_load (C& parFileOpener, const std::string& parOpen) {
|
||
|
dk::BaseMapSource<T, D>* reader = parFileOpener(parOpen);
|
||
|
dk::Tyler<D> tyler(reader->tileSize());
|
||
|
tyler.push_layer(reader);
|
||
|
std::vector<std::string> submaps;
|
||
|
reader->chainedMaps(submaps);
|
||
|
for (const auto& name : submaps) {
|
||
|
map_load<T, D, C>(tyler, parFileOpener, name);
|
||
|
}
|
||
|
return std::move(tyler);
|
||
|
}
|
||
|
|
||
|
template <typename T, uint32_t D, typename C>
|
||
|
dk::Tyler<D>& map_load (dk::Tyler<D>& parTyler, C& parFileOpener, const std::string& parOpen) {
|
||
|
std::stack<std::string, std::vector<std::string>> name_stack;
|
||
|
std::vector<std::string> submaps;
|
||
|
name_stack.push(parOpen);
|
||
|
|
||
|
do {
|
||
|
dk::BaseMapSource<T, D>* reader = parFileOpener(name_stack.top());
|
||
|
name_stack.pop();
|
||
|
|
||
|
submaps.clear();
|
||
|
reader->chainedMaps(submaps);
|
||
|
for (auto&& curr_name : submaps) {
|
||
|
name_stack.emplace(std::move(curr_name));
|
||
|
}
|
||
|
|
||
|
parTyler.push_layer(reader);
|
||
|
} while (not name_stack.empty());
|
||
|
return parTyler;
|
||
|
}
|
||
|
|
||
|
template <typename T, uint32_t D, typename C>
|
||
|
dk::BaseMapSource<T, D>* MapLoaderPool<T, D, C>::operator() (const std::string& parName) {
|
||
|
auto it_found = pool.find(parName);
|
||
|
if (pool.end() != it_found) {
|
||
|
return it_found->second.get();
|
||
|
}
|
||
|
else {
|
||
|
std::pair<typename PoolMapType::iterator, bool> new_item = pool.insert(std::make_pair(parName, BaseMapSourceUPtr(nullptr)));
|
||
|
DK_ASSERT(new_item.second);
|
||
|
new_item.first->second.reset(opener(parName));
|
||
|
return new_item.first->second.get();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
template <typename M>
|
||
|
dk::Tyler<M::dimensions> call_map_load (M& parFileOpener, const std::string& parOpen) {
|
||
|
return map_load<typename M::tile_type, M::dimensions, M>(parFileOpener, parOpen);
|
||
|
}
|
||
|
|
||
|
template <typename M>
|
||
|
dk::Tyler<M::dimensions> call_map_load (dk::Tyler<M::dimensions>& parTyler, M& parFileOpener, const std::string& parOpen) {
|
||
|
return map_load<typename M::tile_type, M::dimensions, M>(parTyler, parFileOpener, parOpen);
|
||
|
}
|
||
|
} //namespace dkh
|