diff options
Diffstat (limited to 'src/tupleref.hpp')
-rw-r--r-- | src/tupleref.hpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/tupleref.hpp b/src/tupleref.hpp new file mode 100644 index 0000000..c6a6dcd --- /dev/null +++ b/src/tupleref.hpp @@ -0,0 +1,68 @@ +#pragma once + +#include <tuple> +#include <utility> + +namespace phosphor +{ +namespace dbus +{ +namespace monitoring +{ + +/** @brief A tuple of references. */ +template <typename... T> +using TupleOfRefs = std::tuple<std::reference_wrapper<T>...>; + +namespace detail +{ +/** @brief Less than implementation for tuples of references. */ +template <size_t size, size_t i, typename T, typename U> +struct TupleOfRefsLess +{ + static constexpr bool compare(const T& l, const U& r) + { + if (std::get<i>(l).get() < std::get<i>(r).get()) + { + return true; + } + if (std::get<i>(r).get() < std::get<i>(l).get()) + { + return false; + } + return TupleOfRefsLess < size, i + 1, T, U >::compare(l, r); + } +}; + +/** @brief Less than specialization for tuple element sizeof...(tuple) +1. */ +template <size_t size, typename T, typename U> +struct TupleOfRefsLess<size, size, T, U> +{ + static constexpr bool compare(const T& l, const U& r) + { + return false; + } +}; +} // namespace detail + +/** @brief Less than comparison for tuples of references. */ +struct TupleOfRefsLess +{ + template <typename... T, typename... U> + constexpr bool operator()( + const TupleOfRefs<T...>& l, + const TupleOfRefs<U...>& r) const + { + static_assert(sizeof...(T) == sizeof...(U), + "Cannot compare tuples of different lengths."); + return detail::TupleOfRefsLess < + sizeof...(T), + 0, + TupleOfRefs<T...>, + TupleOfRefs<U... >>::compare(l, r); + } +}; + +} // namespace monitoring +} // namespace dbus +} // namespace phosphor |