Header file range/v3/action/unique.hpp

#include <range/v3/range_fwd.hpp>

#include <range/v3/range_traits.hpp>

#include <range/v3/action/action.hpp>

#include <range/v3/action/erase.hpp>

#include <range/v3/algorithm/unique.hpp>

#include <range/v3/utility/iterator_concepts.hpp>

#include <range/v3/utility/static_const.hpp>

namespace ranges
{
    inline namespace v3
    {
        namespace action
        {
            struct unique_fn
            {
                struct ConceptImpl
                {
                    template <typename Rng, typename C = equal_to, typename P = ident, typename I = range_iterator_t<Rng>, typename S = range_sentinel_t<Rng>>
                    decltype(concepts::valid_expr(concepts::model_of<concepts::ForwardRange, Rng>(), concepts::model_of<concepts::ErasableRange, Rng, I, S>(), concepts::is_true(Sortable<I, C, P>()))) requires_(Rng&&, C&& = C{}, P&& = P{});
                };
                
                template <typename Rng, typename C = equal_to, typename P = ident>
                using Concept = concepts::models<ConceptImpl, Rng, C, P>;
                
                template <typename Rng, typename C = equal_to, typename P = ident, typename I = range_iterator_t<Rng>, int _concept_requires_63 = 42, typename std::enable_if<(_concept_requires_63==43)||(Concept<Rng, C, P>()), int>::type=0>
                Rng operator()(Rng&& rng, C pred = C{}, P proj = P{}) const;
                
                template <typename Rng, typename C = equal_to, typename P = ident, int _concept_requires_73 = 42, typename std::enable_if<(_concept_requires_73==43)||(!Concept<Rng, C, P>()), int>::type=0>
                void operator()(Rng&&, C&& = C{}, P&& = P{}) const;
            };
            
            inline namespace 
            {
                constexpr auto& unique = static_const<action<unique_fn>>::value;
            }
        }
    }
}