From 7b84cb0b1f94fef64dc7b6f97cbfe0a80d12af61 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 10 Mar 2021 14:12:29 +0300 Subject: [PATCH] Support non-modifying chunked_map::at --- libs/pcg/include/psemek/pcg/chunked_map.hpp | 22 ++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/libs/pcg/include/psemek/pcg/chunked_map.hpp b/libs/pcg/include/psemek/pcg/chunked_map.hpp index d5312c8f..c1695567 100644 --- a/libs/pcg/include/psemek/pcg/chunked_map.hpp +++ b/libs/pcg/include/psemek/pcg/chunked_map.hpp @@ -5,6 +5,7 @@ #include #include +#include namespace psemek::pcg { @@ -19,7 +20,7 @@ namespace psemek::pcg , generator_(std::move(generator)) {} - T const & operator()(geom::vector p) + T & operator()(geom::point p) { geom::vector ip; for (std::size_t i = 0; i < N; ++i) @@ -45,6 +46,25 @@ namespace psemek::pcg return it->second(t); } + std::optional at(geom::point p) const + { + geom::vector ip; + for (std::size_t i = 0; i < N; ++i) + { + ip[i] = (p[i] >= 0) ? (p[i] / chunk_size_) : -((- p[i] + chunk_size_ - 1) / chunk_size_); + } + + auto it = chunks_.find(ip); + if (it == chunks_.end()) + return std::nullopt; + + std::array t; + for (std::size_t i = 0; i < N; ++i) + t[i] = p[i] - ip[i] * chunk_size_; + + return it->second(t); + } + private: int const chunk_size_; generator_func generator_;