//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: !stdlib=libc++ && (c++03 || c++11 || c++14)

// <string_view>

// constexpr const_iterator rend() const;

#include <string_view>
#include <cassert>
#include <cstddef>

#include "test_macros.h"

template <class S>
void test(S s) {
  const S& cs                            = s;
  typename S::reverse_iterator e         = s.rend();
  typename S::const_reverse_iterator ce1 = cs.rend();
  typename S::const_reverse_iterator ce2 = s.crend();

  if (s.empty()) {
    assert(e == s.rbegin());
    assert(ce1 == cs.rbegin());
    assert(ce2 == s.rbegin());
  } else {
    assert(e != s.rbegin());
    assert(ce1 != cs.rbegin());
    assert(ce2 != s.rbegin());
  }

  assert(static_cast<std::size_t>(e - s.rbegin()) == s.size());
  assert(static_cast<std::size_t>(ce1 - cs.rbegin()) == cs.size());
  assert(static_cast<std::size_t>(ce2 - s.crbegin()) == s.size());

  assert(e == ce1);
  assert(e == ce2);
  assert(ce1 == ce2);
}

int main(int, char**) {
  typedef std::string_view string_view;
#ifndef TEST_HAS_NO_CHAR8_T
  typedef std::u8string_view u8string_view;
#endif
  typedef std::u16string_view u16string_view;
  typedef std::u32string_view u32string_view;

  test(string_view());
  test(u16string_view());
  test(u32string_view());
  test(string_view("123"));
#ifndef TEST_HAS_NO_CHAR8_T
  test(u8string_view{u8"123"});
#endif
#if TEST_STD_VER >= 11
  test(u16string_view{u"123"});
  test(u32string_view{U"123"});
#endif

#ifndef TEST_HAS_NO_WIDE_CHARACTERS
  typedef std::wstring_view wstring_view;
  test(wstring_view());
  test(wstring_view(L"123"));
#endif

#if TEST_STD_VER > 14
  {
    constexpr string_view sv{"123", 3};
#  ifndef TEST_HAS_NO_CHAR8_T
    constexpr u8string_view u8sv{u8"123", 3};
#  endif
    constexpr u16string_view u16sv{u"123", 3};
    constexpr u32string_view u32sv{U"123", 3};

    static_assert(*--sv.rend() == sv[0], "");
#  ifndef TEST_HAS_NO_CHAR8_T
    static_assert(*--u8sv.rend() == u8sv[0], "");
#  endif
    static_assert(*--u16sv.rend() == u16sv[0], "");
    static_assert(*--u32sv.rend() == u32sv[0], "");

    static_assert(*--sv.crend() == sv[0], "");
#  ifndef TEST_HAS_NO_CHAR8_T
    static_assert(*--u8sv.crend() == u8sv[0], "");
#  endif
    static_assert(*--u16sv.crend() == u16sv[0], "");
    static_assert(*--u32sv.crend() == u32sv[0], "");

#  ifndef TEST_HAS_NO_WIDE_CHARACTERS
    {
      constexpr wstring_view wsv{L"123", 3};
      static_assert(*--wsv.rend() == wsv[0], "");
      static_assert(*--wsv.crend() == wsv[0], "");
    }
#  endif
  }
#endif // TEST_STD_VER > 14

  return 0;
}
