substr.pass.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. // <string_view>
  10. // constexpr basic_string_view substr(size_type pos = 0, size_type n = npos) const;
  11. // Throws: out_of_range if pos > size().
  12. // Effects: Determines the effective length rlen of the string to reference as the smaller of n and size() - pos.
  13. // Returns: basic_string_view(data()+pos, rlen).
  14. #include <string_view>
  15. #include <cassert>
  16. #include "test_macros.h"
  17. template<typename CharT>
  18. void test1(std::basic_string_view<CharT> sv, size_t n, size_t pos) {
  19. try {
  20. std::basic_string_view<CharT> sv1 = sv.substr(pos, n);
  21. const size_t rlen = std::min(n, sv.size() - pos);
  22. assert (sv1.size() == rlen);
  23. for (size_t i = 0; i <= rlen; ++i)
  24. assert(sv[pos+i] == sv1[i]);
  25. }
  26. catch (const std::out_of_range&) {
  27. assert(pos > sv.size());
  28. }
  29. }
  30. template<typename CharT>
  31. void test ( const CharT *s ) {
  32. typedef std::basic_string_view<CharT> string_view_t;
  33. string_view_t sv1 ( s );
  34. test1(sv1, 0, 0);
  35. test1(sv1, 1, 0);
  36. test1(sv1, 20, 0);
  37. test1(sv1, sv1.size(), 0);
  38. test1(sv1, 0, 3);
  39. test1(sv1, 2, 3);
  40. test1(sv1, 100, 3);
  41. test1(sv1, 0, string_view_t::npos);
  42. test1(sv1, 2, string_view_t::npos);
  43. test1(sv1, sv1.size(), string_view_t::npos);
  44. test1(sv1, sv1.size() + 1, 0);
  45. test1(sv1, sv1.size() + 1, 1);
  46. test1(sv1, sv1.size() + 1, string_view_t::npos);
  47. }
  48. int main () {
  49. test ( "ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" );
  50. test ( "ABCDE");
  51. test ( "a" );
  52. test ( "" );
  53. test ( L"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" );
  54. test ( L"ABCDE" );
  55. test ( L"a" );
  56. test ( L"" );
  57. #if TEST_STD_VER >= 11
  58. test ( u"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" );
  59. test ( u"ABCDE" );
  60. test ( u"a" );
  61. test ( u"" );
  62. test ( U"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" );
  63. test ( U"ABCDE" );
  64. test ( U"a" );
  65. test ( U"" );
  66. #endif
  67. #if TEST_STD_VER > 11
  68. {
  69. constexpr std::string_view sv1 { "ABCDE", 5 };
  70. {
  71. constexpr std::string_view sv2 = sv1.substr ( 0, 3 );
  72. static_assert ( sv2.size() == 3, "" );
  73. static_assert ( sv2[0] == 'A', "" );
  74. static_assert ( sv2[1] == 'B', "" );
  75. static_assert ( sv2[2] == 'C', "" );
  76. }
  77. {
  78. constexpr std::string_view sv2 = sv1.substr ( 3, 0 );
  79. static_assert ( sv2.size() == 0, "" );
  80. }
  81. {
  82. constexpr std::string_view sv2 = sv1.substr ( 3, 3 );
  83. static_assert ( sv2.size() == 2, "" );
  84. static_assert ( sv2[0] == 'D', "" );
  85. static_assert ( sv2[1] == 'E', "" );
  86. }
  87. }
  88. #endif
  89. }