Header file tuple.hpp

#define SIPLASPLAS_UTILITY_TUPLE_HPP 

#include <tuple>

#include "meta.hpp"

namespace cpp
{
    namespace 
    {
        template <typename Function, typename ... Args, std::size_t ... Is>
        constexpr auto tuple_call(Function function, const std::tuple<Args...>& tuple, meta::index_sequence<Is...>);
        
        template <typename Head, typename ... Tail, std::size_t ... Is>
        constexpr auto tuple_tail(const std::tuple<Head, Tail...>& tuple, std::index_sequence<Is...>);
    }
    
    template <typename Function, typename ... Args>
    constexpr auto tuple_call(Function function, const std::tuple<Args...>& tuple);
    
    template <typename Function, typename ... Args>
    constexpr auto tuple_call(const std::tuple<Args...>& tuple, Function function);
    
    template <typename Head, typename ... Tail>
    constexpr auto tuple_tail(const std::tuple<Head, Tail...>& tuple);
}