Header file range/v3/view/c_str.hpp

#include <range/v3/range_fwd.hpp>

#include <range/v3/iterator_range.hpp>

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

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

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

namespace ranges
{
    inline namespace v3
    {
        namespace view
        {
            struct c_str_fn
            {
                template <std::size_t N>
                ranges::iterator_range<char*> operator()(char(&) sz[N]) const;
                
                template <std::size_t N>
                ranges::iterator_range<char const*> operator()(char const(&) sz[N]) const;
                
                template <std::size_t N>
                ranges::iterator_range<wchar_t*> operator()(wchar_t(&) sz[N]) const;
                
                template <std::size_t N>
                ranges::iterator_range<wchar_t const*> operator()(wchar_t const(&) sz[N]) const;
                
                template <std::size_t N>
                ranges::iterator_range<char16_t*> operator()(char16_t(&) sz[N]) const;
                
                template <std::size_t N>
                ranges::iterator_range<char16_t const*> operator()(char16_t const(&) sz[N]) const;
                
                template <std::size_t N>
                ranges::iterator_range<char32_t*> operator()(char32_t(&) sz[N]) const;
                
                template <std::size_t N>
                ranges::iterator_range<char32_t const*> operator()(char32_t const(&) sz[N]) const;
                
                ranges::delimit_view<ranges::iterator_range<char*, ranges::unreachable>, char> operator()(char* sz) const;
                
                ranges::delimit_view<ranges::iterator_range<char const*, ranges::unreachable>, char> operator()(char const* sz) const;
                
                ranges::delimit_view<ranges::iterator_range<wchar_t*, ranges::unreachable>, wchar_t> operator()(wchar_t* sz) const;
                
                ranges::delimit_view<ranges::iterator_range<wchar_t const*, ranges::unreachable>, wchar_t> operator()(wchar_t const* sz) const;
                
                ranges::delimit_view<ranges::iterator_range<char16_t*, ranges::unreachable>, char16_t> operator()(char16_t* sz) const;
                
                ranges::delimit_view<ranges::iterator_range<char16_t const*, ranges::unreachable>, char16_t> operator()(char16_t const* sz) const;
                
                ranges::delimit_view<ranges::iterator_range<char32_t*, ranges::unreachable>, char32_t> operator()(char32_t* sz) const;
                
                ranges::delimit_view<ranges::iterator_range<char32_t const*, ranges::unreachable>, char32_t> operator()(char32_t const* sz) const;
            };
            
            inline namespace 
            {
                constexpr auto& c_str = static_const<c_str_fn>::value;
            }
        }
    }
}