1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <string_view>
11
12// constexpr const_iterator end() const;
13
14#include <string_view>
15#include <cassert>
16#include <cstddef>
17
18#include "test_macros.h"
19
20template <class S>
21void
22test(S s)
23{
24    const S& cs = s;
25    typename S::iterator e = s.end();
26    typename S::const_iterator ce1 = cs.end();
27    typename S::const_iterator ce2 = s.cend();
28
29    if (s.empty())
30    {
31        assert(  e ==  s.begin());
32        assert(ce1 == cs.begin());
33        assert(ce2 ==  s.begin());
34    }
35    else
36    {
37        assert(  e !=  s.begin());
38        assert(ce1 != cs.begin());
39        assert(ce2 !=  s.begin());
40    }
41
42    assert(static_cast<std::size_t>(  e -  s.begin()) == s.size());
43    assert(static_cast<std::size_t>(ce1 - cs.begin()) == cs.size());
44    assert(static_cast<std::size_t>(ce2 - s.cbegin()) == s.size());
45
46    assert(  e == ce1);
47    assert(  e == ce2);
48    assert(ce1 == ce2);
49}
50
51
52int main()
53{
54    typedef std::string_view    string_view;
55    typedef std::u16string_view u16string_view;
56    typedef std::u32string_view u32string_view;
57    typedef std::wstring_view   wstring_view;
58
59    test(string_view   ());
60    test(u16string_view());
61    test(u32string_view());
62    test(wstring_view  ());
63    test(string_view   ( "123"));
64    test(wstring_view  (L"123"));
65#if TEST_STD_VER >= 11
66    test(u16string_view{u"123"});
67    test(u32string_view{U"123"});
68#endif
69
70#if TEST_STD_VER > 11
71    {
72    constexpr string_view       sv { "123", 3 };
73    constexpr u16string_view u16sv {u"123", 3 };
74    constexpr u32string_view u32sv {U"123", 3 };
75    constexpr wstring_view     wsv {L"123", 3 };
76
77    static_assert (    sv.begin() !=    sv.end(), "" );
78    static_assert ( u16sv.begin() != u16sv.end(), "" );
79    static_assert ( u32sv.begin() != u32sv.end(), "" );
80    static_assert (   wsv.begin() !=   wsv.end(), "" );
81
82    static_assert (    sv.begin() !=    sv.cend(), "" );
83    static_assert ( u16sv.begin() != u16sv.cend(), "" );
84    static_assert ( u32sv.begin() != u32sv.cend(), "" );
85    static_assert (   wsv.begin() !=   wsv.cend(), "" );
86    }
87#endif
88}
89