rbegin.pass.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. // <string_view>
  9. // const_iterator rbegin() const;
  10. #include <string_view>
  11. #include <cassert>
  12. #include "test_macros.h"
  13. template <class S>
  14. void
  15. test(S s)
  16. {
  17. const S& cs = s;
  18. typename S::reverse_iterator b = s.rbegin();
  19. typename S::const_reverse_iterator cb1 = cs.rbegin();
  20. typename S::const_reverse_iterator cb2 = s.crbegin();
  21. if (!s.empty())
  22. {
  23. const size_t last = s.size() - 1;
  24. assert( *b == s[last]);
  25. assert( &*b == &s[last]);
  26. assert( *cb1 == s[last]);
  27. assert(&*cb1 == &s[last]);
  28. assert( *cb2 == s[last]);
  29. assert(&*cb2 == &s[last]);
  30. }
  31. assert( b == cb1);
  32. assert( b == cb2);
  33. assert(cb1 == cb2);
  34. }
  35. int main(int, char**)
  36. {
  37. typedef std::string_view string_view;
  38. #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
  39. typedef std::u8string_view u8string_view;
  40. #endif
  41. typedef std::u16string_view u16string_view;
  42. typedef std::u32string_view u32string_view;
  43. typedef std::wstring_view wstring_view;
  44. test(string_view ());
  45. test(u16string_view());
  46. test(u32string_view());
  47. test(wstring_view ());
  48. test(string_view ( "123"));
  49. test(wstring_view (L"123"));
  50. #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
  51. test(u8string_view{u8"123"});
  52. #endif
  53. #if TEST_STD_VER >= 11
  54. test(u16string_view{u"123"});
  55. test(u32string_view{U"123"});
  56. #endif
  57. #if TEST_STD_VER > 14
  58. {
  59. constexpr string_view sv { "123", 3 };
  60. #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
  61. constexpr u8string_view u8sv {u8"123", 3 };
  62. #endif
  63. constexpr u16string_view u16sv {u"123", 3 };
  64. constexpr u32string_view u32sv {U"123", 3 };
  65. constexpr wstring_view wsv {L"123", 3 };
  66. static_assert ( *sv.rbegin() == sv[2], "" );
  67. #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
  68. static_assert ( *u8sv.rbegin() == u8sv[2], "" );
  69. #endif
  70. static_assert ( *u16sv.rbegin() == u16sv[2], "" );
  71. static_assert ( *u32sv.rbegin() == u32sv[2], "" );
  72. static_assert ( *wsv.rbegin() == wsv[2], "" );
  73. static_assert ( *sv.crbegin() == sv[2], "" );
  74. #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
  75. static_assert ( *u8sv.crbegin() == u8sv[2], "" );
  76. #endif
  77. static_assert ( *u16sv.crbegin() == u16sv[2], "" );
  78. static_assert ( *u32sv.crbegin() == u32sv[2], "" );
  79. static_assert ( *wsv.crbegin() == wsv[2], "" );
  80. }
  81. #endif
  82. return 0;
  83. }