#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
