diff --git a/include/doorkeeper/components/basemapsource.hpp b/include/doorkeeper/components/basemapsource.hpp index 1de08c4..053a04a 100644 --- a/include/doorkeeper/components/basemapsource.hpp +++ b/include/doorkeeper/components/basemapsource.hpp @@ -3,14 +3,23 @@ #include "doorkeeper/implem/maptypes.hpp" #include "doorkeeper/primitivetypes.hpp" +#include "doorkeeper/implem/coords_utils.hpp" #include #include #include +#include #include namespace dk { + namespace implem { + template ::value> + class data_fetcher; + } //namespace implem + template class BaseMapSource { + template + friend class implem::data_fetcher; public: typedef dk::Vector coords; BaseMapSource ( void ) = default; @@ -30,4 +39,6 @@ namespace dk { }; } //namespace dk +#include "doorkeeper/implem/basemapsource.inl" + #endif diff --git a/include/doorkeeper/implem/basemapsource.inl b/include/doorkeeper/implem/basemapsource.inl new file mode 100644 index 0000000..3d0bb9b --- /dev/null +++ b/include/doorkeeper/implem/basemapsource.inl @@ -0,0 +1,38 @@ +namespace dk { + namespace implem { + template + class data_fetcher { + public: + typedef typename BaseMapSource::coords coords; + static void fetch ( std::vector& parOut, const coords& parFrom, const coords& parTo, std::size_t parCount, BaseMapSource& parMapSrc ) { + parOut.resize(parCount); + parMapSrc.fetch_raw(reinterpret_cast(parOut.data()), parFrom, parTo, sizeof(T) * parCount); + } + }; + template + class data_fetcher { + public: + typedef typename BaseMapSource::coords coords; + static void fetch ( std::vector& parOut, const coords& parFrom, const coords& parTo, std::size_t parCount, BaseMapSource& parMapSrc ) { + parOut.reserve(parCount); + DK_ASSERT(false); //not implemented + (void)parOut; + (void)parFrom; + (void)parTo; + (void)parMapSrc; + } + }; + } //namespace implem + + template + template + void BaseMapSource::fetch (std::vector& parOut, const coords& parFrom, const coords& parTo) { + const auto tile_count = tile_volume(parFrom, parTo); + const std::size_t casted_tile_count = static_cast(tile_count); + DK_ASSERT(static_cast(casted_tile_count) == tile_count); + + parOut.reserve(casted_tile_count); + parOut.clear(); + implem::data_fetcher::fetch(parOut, parFrom, parTo, casted_tile_count, *this); + } +} //namespace dk diff --git a/include/doorkeeper/implem/coords_utils.hpp b/include/doorkeeper/implem/coords_utils.hpp new file mode 100644 index 0000000..f9dd44d --- /dev/null +++ b/include/doorkeeper/implem/coords_utils.hpp @@ -0,0 +1,26 @@ +#ifndef id2FC7119D67FA4704B5FE8A9FDA148F46 +#define id2FC7119D67FA4704B5FE8A9FDA148F46 + +#include "doorkeeper/primitivetypes.hpp" +#include + +namespace dk { + template + typename Vector::value_type tile_volume ( const Vector& parFrom, const Vector& parTo ) a_pure; + + template + inline + typename Vector::value_type tile_volume (const Vector& parFrom, const Vector& parTo) { + typedef typename Vector::value_type scalar_type; + + scalar_type ret_val((1)); + + for (uint32_t z = 0; z < D; ++z) { + const auto dist(parTo[z] - parFrom[z] + 1); + ret_val *= dist; + } + return ret_val; + } +} //namespace dk + +#endif