namespace dk { namespace implem { ///--------------------------------------------------------------------- ///Only enabled if Device::MapDimensions is defined and is the same ///as D. The function's name is set to give a hint to the user as to ///why the error has occurred (they are trying to construct a ///TileMapData with a set dimension that is different from the one ///hardcoded in the device being passed in). The actual name could be ///something like get_device_dimensions(). ///--------------------------------------------------------------------- template inline typename std::enable_if::type err_mismatching_dimension (const Device*) noexcept { return Device::MapDimensions; } ///--------------------------------------------------------------------- ///Only enabled if Device::MapDimensions is not defined. The function's ///name is set to give a hint to the user as to why the error has ///occurred (they are trying to construct a TileMapData with a set ///dimension that is different from the one hardcoded in the device ///being passed in). The actual name could be something like ///get_device_dimensions(). ///--------------------------------------------------------------------- template inline typename std::enable_if::result == false, uint32_t>::type err_mismatching_dimension (const Device*) noexcept { return 0; } ///--------------------------------------------------------------------- ///--------------------------------------------------------------------- template inline typename std::enable_if>::type retrieve_map_size_from_device (Device* parDevice) { return parDevice->mapSize(); } ///--------------------------------------------------------------------- ///--------------------------------------------------------------------- template inline typename std::enable_if::result == false, Vector>::type retrieve_map_size_from_device (Device* parDevice) { return get_map_size_from_device(parDevice); } } //namespace implem ///------------------------------------------------------------------------- ///------------------------------------------------------------------------- template template MapStreamRaw::MapStreamRaw (Device& parDevice) : MapStreamBase(implem::retrieve_map_size_from_device(&parDevice)), m_istream(&parDevice), m_deviceHasDim(D == implem::err_mismatching_dimension(&parDevice)) { } ///------------------------------------------------------------------------- ///------------------------------------------------------------------------- template std::size_t MapStreamRaw::dataBlockRequested (char* parOut, std::size_t parOutSize, const coords& parFrom, const coords& parTo) { DK_ASSERT(parOut); const std::size_t totalBlocks = implem::area(parTo - parFrom); const std::size_t storableBlocks = parOutSize / sizeof(T); const std::size_t readMem = sizeof(T) * std::min(storableBlocks, totalBlocks); const std::streamoff readPos = static_cast(implem::area(parFrom)); m_istream.seekg(readPos, std::ios_base::beg); m_istream.read(parOut, readMem); return readMem; } } //namespace dk