/// \file
// Range v3 library
//
//  Copyright Andrey Diduh 2019
//
//  Use, modification and distribution is subject to 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)
//
// Project home: https://github.com/ericniebler/range-v3
//
#ifndef RANGES_V3_ACTION_REMOVE_HPP
#define RANGES_V3_ACTION_REMOVE_HPP
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
namespace ranges
{
    /// \addtogroup group-actions
    /// @{
    namespace actions
    {
        struct remove_fn
        {
        private:
            friend action_access;
            template
            static auto CPP_fun(bind)(remove_fn remove, V && value, P proj)( //
                requires(!range))
            {
                return bind_back(remove, static_cast(value), std::move(proj));
            }
            template
            static auto bind(remove_fn remove, V && value)
            {
                return bind_back(remove, static_cast(value), identity{});
            }
        public:
            template
            auto operator()(Rng && rng, V const & value, P proj = {}) const
                -> CPP_ret(Rng)( //
                    requires forward_range && permutable> &&
                        erasable_range, sentinel_t> &&
                            indirect_relation, P>,
                                              V const *>)
            {
                auto it = ranges::remove(rng, value, std::move(proj));
                ranges::erase(rng, it, ranges::end(rng));
                return static_cast(rng);
            }
        };
        /// \ingroup group-actions
        /// \sa action
        /// \sa with_braced_init_args
        RANGES_INLINE_VARIABLE(action, remove)
    } // namespace actions
    /// @}
} // namespace ranges
#endif // include guard