#pragma once #include "compat/int-hash.hpp" #include "global-coords.hpp" #include #include namespace std { template struct hash; template<> struct hash final { constexpr std::size_t operator()(floormat::chunk_coords c) const noexcept { return floormat::int_hash((std::size_t)c.y << 16 | (std::size_t)c.x); } }; } // namespace std namespace floormat { struct chunk; struct world final { world(); std::shared_ptr operator[](chunk_coords c) noexcept; std::shared_ptr maybe_chunk(chunk_coords c) noexcept; std::shared_ptr maybe_chunk(chunk_coords c) const noexcept; bool contains(chunk_coords c) const noexcept; void clear(); void collect(); private: static constexpr std::size_t initial_capacity = 64, collect_every = 32; static constexpr float max_load_factor = .5; std::size_t _last_collection = 0; void maybe_collect(); std::unordered_map> _chunks{initial_capacity}; }; } // namespace floormat