Header file range/v3/view/concat.hpp

#include <meta/meta.hpp>

#include <range/v3/range_fwd.hpp>

#include <range/v3/size.hpp>

#include <range/v3/begin_end.hpp>

#include <range/v3/range_traits.hpp>

#include <range/v3/range_concepts.hpp>

#include <range/v3/view_facade.hpp>

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

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

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

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

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

#include <range/v3/view/all.hpp>

namespace ranges
{
    inline namespace v3
    {
        namespace detail
        {
            template <typename Reference>
            struct deref_fun
            {
                template <typename I>
                Reference operator()(I const& it) const;
            };
            
            template <typename State, typename Value>
            using concat_cardinality = std::integral_constant<cardinality, State::value==infinite||Value::value==infinite?infinite:State::value==unknown||Value::value==unknown?unknown:State::value==finite||Value::value==finite?finite:static_cast<cardinality>(State::value+Value::value)>;
        }
        
        template <typename ... Rngs>
        struct concat_view;
        
        namespace view
        {
            struct concat_fn
            {
                template <typename ... Rngs>
                concat_view<all_t<Rngs>...> operator()(Rngs&&... rngs) const;
            };
            
            inline namespace 
            {
                constexpr auto& concat = static_const<concat_fn>::value;
            }
        }
    }
}

Class template ranges::v3::concat_view<Rngs...>

template <typename ... Rngs>
struct concat_view
: view_facade<concat_view<Rngs...>, meta::fold<meta::list<range_cardinality<Rngs>...>, std::integral_constant<cardinality, static_cast<cardinality>(0)>, meta::quote<detail::concat_cardinality> >::value>
{
    concat_view() = default;
    
    explicit concat_view(Rngs... rngs);
    
    template <int _concept_requires_310 = 42, typename std::enable_if<(_concept_requires_310==43)||(meta::and_c<(bool)SizedRange<Rngs>()>::value), int>::type ... = 0>
    constexpr size_type_ size() const;
};

@{