/*
 *             Copyright Andrey Semashev 2024.
 * Distributed under the Boost Software License, Version 1.0.
 *    (See accompanying file LICENSE_1_0.txt or copy at
 *          http://www.boost.org/LICENSE_1_0.txt)
 */
/*!
 * \file   functor.hpp
 * \author Andrey Semashev
 * \date   2024-01-23
 *
 * This header contains a \c functor implementation. This is a function object
 * that invokes a function that is specified as its template parameter.
 */

#ifndef BOOST_CORE_FUNCTOR_HPP
#define BOOST_CORE_FUNCTOR_HPP

namespace boost::core {

// Block unintended ADL
namespace functor_ns {

//! A function object that invokes a function specified as its template parameter
template< auto Function >
struct functor
{
    template< typename... Args >
    auto operator() (Args&&... args) const noexcept(noexcept(Function(static_cast< Args&& >(args)...))) -> decltype(Function(static_cast< Args&& >(args)...))
    {
        return Function(static_cast< Args&& >(args)...);
    }
};

} // namespace functor_ns

using functor_ns::functor;

} // namespace boost::core

#endif // BOOST_CORE_FUNCTOR_HPP