From c8953c038de7db72bb3fae00384faa8a05d86d69 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Thu, 23 Mar 2017 15:03:15 -0700 Subject: [PATCH] ircd::util: Add non-const overloads to tuple iterations. --- include/ircd/util.h | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/include/ircd/util.h b/include/ircd/util.h index 550f365c1..988bc7995 100644 --- a/include/ircd/util.h +++ b/include/ircd/util.h @@ -125,6 +125,14 @@ using custom_ptr = std::unique_ptr>; // // for_each(tuple, [](auto&& elem) { ... }); +template +typename std::enable_if>::value, void>::type +for_each(std::tuple &t, + func&& f) +{} + template @@ -144,11 +152,32 @@ for_each(const std::tuple &t, for_each(t, std::forward(f)); } +template +typename std::enable_if>::value, void>::type +for_each(std::tuple &t, + func&& f) +{ + f(std::get(t)); + for_each(t, std::forward(f)); +} + // // Iteration of a tuple until() style: your closure returns true to continue, false // to break. until() then remains true to the end, or returns false if not. +template +typename std::enable_if>::value, bool>::type +until(std::tuple &t, + func&& f) +{ + return true; +} + template @@ -159,6 +188,16 @@ until(const std::tuple &t, return true; } +template +typename std::enable_if>::value, bool>::type +until(std::tuple &t, + func&& f) +{ + return f(std::get(t))? until(t, std::forward(f)) : false; +} + template