@@ -224,9 +224,6 @@ template <typename Container, typename ItFunc> struct DefragmentMap {
224224 : container(container), it(f()), end(container.end()) {
225225 }
226226
227- // Deref should be true if the value is wrapped in a pointer. Set here instead of at class level
228- // to allow overriding without specifying other parameters.
229- template <bool Deref = false >
230227 // The key is set if the defragmentation has to stop mid way due to depleted quota
231228 DefragmentResult Defragment (PageUsage* page_usage, std::string* key) {
232229 if (page_usage->QuotaDepleted ()) {
@@ -236,13 +233,7 @@ template <typename Container, typename ItFunc> struct DefragmentMap {
236233 DefragmentResult result;
237234 for (; it != end; ++it) {
238235 const auto & [k, map] = *it;
239- DefragmentResult r;
240- if constexpr (Deref) {
241- r = map->Defragment (quota_usec, page_usage);
242- } else {
243- r = map.Defragment (quota_usec, page_usage);
244- }
245- if (result.Merge (std::move (r)).quota_depleted ) {
236+ if (result.Merge (DefragmentIndex (map, page_usage, 0 )).quota_depleted ) {
246237 *key = k;
247238 break ;
248239 }
@@ -255,6 +246,19 @@ template <typename Container, typename ItFunc> struct DefragmentMap {
255246 return result;
256247 }
257248
249+ private:
250+ template <typename T>
251+ static auto DefragmentIndex (T& t, PageUsage* page_usage, int /* tag*/ )
252+ -> decltype(t->Defragment (page_usage)) {
253+ return t->Defragment (page_usage);
254+ }
255+
256+ template <typename T>
257+ static auto DefragmentIndex (T& t, PageUsage* page_usage, char /* tag*/ )
258+ -> decltype(t.Defragment(page_usage)) {
259+ return t.Defragment (page_usage);
260+ }
261+
258262 Container& container;
259263 Iterator it;
260264 Iterator end;
0 commit comments