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 begin() const;
13
14#include <string_view>
15#include <cassert>
16
17#include "test_macros.h"
18
19template <class S>
20void
21test(S s)
22{
23    const S& cs = s;
24    typename S::iterator b = s.begin();
25    typename S::const_iterator cb1 = cs.begin();
26    typename S::const_iterator cb2 = s.cbegin();
27    if (!s.empty())
28    {
29        assert(   *b ==  s[0]);
30        assert(  &*b == &s[0]);
31        assert( *cb1 ==  s[0]);
32        assert(&*cb1 == &s[0]);
33        assert( *cb2 ==  s[0]);
34        assert(&*cb2 == &s[0]);
35
36    }
37    assert(  b == cb1);
38    assert(  b == cb2);
39    assert(cb1 == cb2);
40}
41
42
43int main()
44{
45    typedef std::string_view    string_view;
46    typedef std::u16string_view u16string_view;
47    typedef std::u32string_view u32string_view;
48    typedef std::wstring_view   wstring_view;
49
50    test(string_view   ());
51    test(u16string_view());
52    test(u32string_view());
53    test(wstring_view  ());
54    test(string_view   ( "123"));
55    test(wstring_view  (L"123"));
56#if TEST_STD_VER >= 11
57    test(u16string_view{u"123"});
58    test(u32string_view{U"123"});
59#endif
60
61#if TEST_STD_VER > 11
62    {
63    constexpr string_view       sv { "123", 3 };
64    constexpr u16string_view u16sv {u"123", 3 };
65    constexpr u32string_view u32sv {U"123", 3 };
66    constexpr wstring_view     wsv {L"123", 3 };
67
68    static_assert (    *sv.begin() ==    sv[0], "" );
69    static_assert ( *u16sv.begin() == u16sv[0], "" );
70    static_assert ( *u32sv.begin() == u32sv[0], "" );
71    static_assert (   *wsv.begin() ==   wsv[0], "" );
72
73    static_assert (    *sv.cbegin() ==    sv[0], "" );
74    static_assert ( *u16sv.cbegin() == u16sv[0], "" );
75    static_assert ( *u32sv.cbegin() == u32sv[0], "" );
76    static_assert (   *wsv.cbegin() ==   wsv[0], "" );
77    }
78#endif
79}
80