11e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow//===----------------------------------------------------------------------===//
21e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow//
31e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow//                     The LLVM Compiler Infrastructure
41e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow//
51e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow// This file is dual licensed under the MIT and the University of Illinois Open
61e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow// Source Licenses. See LICENSE.TXT for details.
71e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow//
81e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow//===----------------------------------------------------------------------===//
91e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
101e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow// <string_view>
111e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
121e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow// constexpr const_iterator rend() const;
131e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
141e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow#include <string_view>
151e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow#include <cassert>
1621208822a84ac01e34df721b7b45e67561f75b98Stephan T. Lavavej#include <cstddef>
171e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
181e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow#include "test_macros.h"
191e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
201e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clowtemplate <class S>
211e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clowvoid
221e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clowtest(S s)
231e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow{
241e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    const S& cs = s;
251e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    typename S::reverse_iterator e = s.rend();
261e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    typename S::const_reverse_iterator ce1 = cs.rend();
271e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    typename S::const_reverse_iterator ce2 = s.crend();
281e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
291e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    if (s.empty())
301e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    {
311e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow        assert(  e ==  s.rbegin());
321e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow        assert(ce1 == cs.rbegin());
331e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow        assert(ce2 ==  s.rbegin());
341e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    }
351e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    else
361e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    {
371e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow        assert(  e !=  s.rbegin());
381e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow        assert(ce1 != cs.rbegin());
391e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow        assert(ce2 !=  s.rbegin());
401e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    }
411e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
4221208822a84ac01e34df721b7b45e67561f75b98Stephan T. Lavavej    assert(static_cast<std::size_t>(  e -  s.rbegin()) == s.size());
4321208822a84ac01e34df721b7b45e67561f75b98Stephan T. Lavavej    assert(static_cast<std::size_t>(ce1 - cs.rbegin()) == cs.size());
4421208822a84ac01e34df721b7b45e67561f75b98Stephan T. Lavavej    assert(static_cast<std::size_t>(ce2 - s.crbegin()) == s.size());
451e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
461e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    assert(  e == ce1);
471e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    assert(  e == ce2);
481e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    assert(ce1 == ce2);
491e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow}
501e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
511e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
521e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clowint main()
531e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow{
541e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    typedef std::string_view    string_view;
551e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    typedef std::u16string_view u16string_view;
561e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    typedef std::u32string_view u32string_view;
571e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    typedef std::wstring_view   wstring_view;
581e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow
591e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(string_view   ());
601e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u16string_view());
611e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u32string_view());
621e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(wstring_view  ());
631e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(string_view   ( "123"));
641e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(wstring_view  (L"123"));
651e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow#if TEST_STD_VER >= 11
661e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u16string_view{u"123"});
671e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow    test(u32string_view{U"123"});
681e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow#endif
69b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow
70b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow#if TEST_STD_VER > 14
71b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow    {
72b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow    constexpr string_view       sv { "123", 3 };
73b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow    constexpr u16string_view u16sv {u"123", 3 };
74b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow    constexpr u32string_view u32sv {U"123", 3 };
75b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow    constexpr wstring_view     wsv {L"123", 3 };
76b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow
77b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow    static_assert (    *--sv.rend() ==    sv[0], "" );
78b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow    static_assert ( *--u16sv.rend() == u16sv[0], "" );
79b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow    static_assert ( *--u32sv.rend() == u32sv[0], "" );
80b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow    static_assert (   *--wsv.rend() ==   wsv[0], "" );
81b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow
82b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow    static_assert (    *--sv.crend() ==    sv[0], "" );
83b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow    static_assert ( *--u16sv.crend() == u16sv[0], "" );
84b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow    static_assert ( *--u32sv.crend() == u32sv[0], "" );
85b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow    static_assert (   *--wsv.crend() ==   wsv[0], "" );
86b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow    }
87b08183bc1f0f76a1c436a30498dfbdbc7c2d1dbfMarshall Clow#endif
881e00d6db319aaec6acb6db0eafd059c7fb97bf66Marshall Clow}
89