#pragma once #include #include namespace phosphor { namespace dbus { namespace monitoring { /** @brief A tuple of references. */ template using TupleOfRefs = std::tuple...>; namespace detail { /** @brief Less than implementation for tuples of references. */ template struct TupleOfRefsLess { static constexpr bool compare(const T& l, const U& r) { if (std::get(l).get() < std::get(r).get()) { return true; } if (std::get(r).get() < std::get(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 struct TupleOfRefsLess { 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 constexpr bool operator()( const TupleOfRefs& l, const TupleOfRefs& r) const { static_assert(sizeof...(T) == sizeof...(U), "Cannot compare tuples of different lengths."); return detail::TupleOfRefsLess < sizeof...(T), 0, TupleOfRefs, TupleOfRefs>::compare(l, r); } }; } // namespace monitoring } // namespace dbus } // namespace phosphor