]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common: Add ceph::for_each for tuples
authorAdam C. Emerson <aemerson@redhat.com>
Wed, 10 Jan 2018 04:26:48 +0000 (23:26 -0500)
committerAdam C. Emerson <aemerson@redhat.com>
Fri, 12 Jan 2018 05:49:36 +0000 (00:49 -0500)
Expand to pairs, optionals, and variants later.

Signed-off-by: Adam C. Emerson <aemerson@redhat.com>
src/common/convenience.h

index c28349382095f81247c16324bb3d6fa331e0c3eb..3989c70d1043cca2523f1b5c3850830425574f30 100644 (file)
@@ -229,5 +229,45 @@ auto maybe_do_or(const std::optional<T>& t, F&& f, U&& u) ->
   else
     return std::forward<U>(u);
 }
+
+namespace _convenience {
+template<typename... Ts, typename F,  std::size_t... Is>
+inline void for_each_helper(const std::tuple<Ts...>& t, const F& f,
+                           std::index_sequence<Is...>) {
+  (f(std::get<Is>(t)), ..., void());
+}
+template<typename... Ts, typename F,  std::size_t... Is>
+inline void for_each_helper(std::tuple<Ts...>& t, const F& f,
+                           std::index_sequence<Is...>) {
+  (f(std::get<Is>(t)), ..., void());
+}
+template<typename... Ts, typename F,  std::size_t... Is>
+inline void for_each_helper(const std::tuple<Ts...>& t, F& f,
+                           std::index_sequence<Is...>) {
+  (f(std::get<Is>(t)), ..., void());
+}
+template<typename... Ts, typename F,  std::size_t... Is>
+inline void for_each_helper(std::tuple<Ts...>& t, F& f,
+                           std::index_sequence<Is...>) {
+  (f(std::get<Is>(t)), ..., void());
+}
+}
+
+template<typename... Ts, typename F>
+inline void for_each(const std::tuple<Ts...>& t, const F& f) {
+  _convenience::for_each_helper(t, f, std::index_sequence_for<Ts...>{});
+}
+template<typename... Ts, typename F>
+inline void for_each(std::tuple<Ts...>& t, const F& f) {
+  _convenience::for_each_helper(t, f, std::index_sequence_for<Ts...>{});
+}
+template<typename... Ts, typename F>
+inline void for_each(const std::tuple<Ts...>& t, F& f) {
+  _convenience::for_each_helper(t, f, std::index_sequence_for<Ts...>{});
+}
+template<typename... Ts, typename F>
+inline void for_each(std::tuple<Ts...>& t, F& f) {
+  _convenience::for_each_helper(t, f, std::index_sequence_for<Ts...>{});
+}
 }
 #endif // CEPH_COMMON_CONVENIENCE_H