libcxx

libcxx mirror with random patches
git clone https://git.neptards.moe/neptards/libcxx.git
Log | Files | Refs

iter_iter_iter.pass.cpp (10690B)


      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>
     11 
     12 // template<class InputIterator>
     13 //   iterator insert(const_iterator p, InputIterator first, InputIterator last);
     14 
     15 #if _LIBCPP_DEBUG >= 1
     16 #define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
     17 #endif
     18 
     19 #include <string>
     20 #include <cassert>
     21 
     22 #include "test_iterators.h"
     23 #include "min_allocator.h"
     24 
     25 template <class S, class It>
     26 void
     27 test(S s, typename S::difference_type pos, It first, It last, S expected)
     28 {
     29     typename S::const_iterator p = s.cbegin() + pos;
     30     typename S::iterator i = s.insert(p, first, last);
     31     LIBCPP_ASSERT(s.__invariants());
     32     assert(i - s.begin() == pos);
     33     assert(s == expected);
     34 }
     35 
     36 #ifndef TEST_HAS_NO_EXCEPTIONS
     37 template <class S, class It>
     38 void
     39 test_exceptions(S s, typename S::difference_type pos, It first, It last)
     40 {
     41     typename S::const_iterator p = s.cbegin() + pos;
     42     S aCopy = s;
     43     try {
     44         s.insert(p, first, last);
     45         assert(false);
     46         }
     47     catch (...) {}
     48     LIBCPP_ASSERT(s.__invariants());
     49     assert(s == aCopy);
     50 }
     51 #endif
     52 
     53 int main()
     54 {
     55     {
     56     typedef std::string S;
     57     const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
     58     test(S(), 0, s, s, S());
     59     test(S(), 0, s, s+1, S("A"));
     60     test(S(), 0, s, s+10, S("ABCDEFGHIJ"));
     61     test(S(), 0, s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
     62 
     63     test(S("12345"), 0, s, s, S("12345"));
     64     test(S("12345"), 1, s, s+1, S("1A2345"));
     65     test(S("12345"), 4, s, s+10, S("1234ABCDEFGHIJ5"));
     66     test(S("12345"), 5, s, s+52, S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
     67 
     68     test(S("1234567890"), 0, s, s, S("1234567890"));
     69     test(S("1234567890"), 1, s, s+1, S("1A234567890"));
     70     test(S("1234567890"), 10, s, s+10, S("1234567890ABCDEFGHIJ"));
     71     test(S("1234567890"), 8, s, s+52, S("12345678ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz90"));
     72 
     73     test(S("12345678901234567890"), 3, s, s, S("12345678901234567890"));
     74     test(S("12345678901234567890"), 3, s, s+1, S("123A45678901234567890"));
     75     test(S("12345678901234567890"), 15, s, s+10, S("123456789012345ABCDEFGHIJ67890"));
     76     test(S("12345678901234567890"), 20, s, s+52,
     77          S("12345678901234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
     78 
     79     test(S(), 0, input_iterator<const char*>(s), input_iterator<const char*>(s), S());
     80     test(S(), 0, input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("A"));
     81     test(S(), 0, input_iterator<const char*>(s), input_iterator<const char*>(s+10), S("ABCDEFGHIJ"));
     82     test(S(), 0, input_iterator<const char*>(s), input_iterator<const char*>(s+52), S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
     83 
     84     test(S("12345"), 0, input_iterator<const char*>(s), input_iterator<const char*>(s), S("12345"));
     85     test(S("12345"), 1, input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("1A2345"));
     86     test(S("12345"), 4, input_iterator<const char*>(s), input_iterator<const char*>(s+10), S("1234ABCDEFGHIJ5"));
     87     test(S("12345"), 5, input_iterator<const char*>(s), input_iterator<const char*>(s+52), S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
     88 
     89     test(S("1234567890"), 0, input_iterator<const char*>(s), input_iterator<const char*>(s), S("1234567890"));
     90     test(S("1234567890"), 1, input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("1A234567890"));
     91     test(S("1234567890"), 10, input_iterator<const char*>(s), input_iterator<const char*>(s+10), S("1234567890ABCDEFGHIJ"));
     92     test(S("1234567890"), 8, input_iterator<const char*>(s), input_iterator<const char*>(s+52), S("12345678ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz90"));
     93 
     94     test(S("12345678901234567890"), 3, input_iterator<const char*>(s), input_iterator<const char*>(s), S("12345678901234567890"));
     95     test(S("12345678901234567890"), 3, input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("123A45678901234567890"));
     96     test(S("12345678901234567890"), 15, input_iterator<const char*>(s), input_iterator<const char*>(s+10), S("123456789012345ABCDEFGHIJ67890"));
     97     test(S("12345678901234567890"), 20, input_iterator<const char*>(s), input_iterator<const char*>(s+52),
     98          S("12345678901234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
     99     }
    100 #if TEST_STD_VER >= 11
    101     {
    102     typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
    103     const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    104     test(S(), 0, s, s, S());
    105     test(S(), 0, s, s+1, S("A"));
    106     test(S(), 0, s, s+10, S("ABCDEFGHIJ"));
    107     test(S(), 0, s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
    108 
    109     test(S("12345"), 0, s, s, S("12345"));
    110     test(S("12345"), 1, s, s+1, S("1A2345"));
    111     test(S("12345"), 4, s, s+10, S("1234ABCDEFGHIJ5"));
    112     test(S("12345"), 5, s, s+52, S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
    113 
    114     test(S("1234567890"), 0, s, s, S("1234567890"));
    115     test(S("1234567890"), 1, s, s+1, S("1A234567890"));
    116     test(S("1234567890"), 10, s, s+10, S("1234567890ABCDEFGHIJ"));
    117     test(S("1234567890"), 8, s, s+52, S("12345678ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz90"));
    118 
    119     test(S("12345678901234567890"), 3, s, s, S("12345678901234567890"));
    120     test(S("12345678901234567890"), 3, s, s+1, S("123A45678901234567890"));
    121     test(S("12345678901234567890"), 15, s, s+10, S("123456789012345ABCDEFGHIJ67890"));
    122     test(S("12345678901234567890"), 20, s, s+52,
    123          S("12345678901234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
    124 
    125     test(S(), 0, input_iterator<const char*>(s), input_iterator<const char*>(s), S());
    126     test(S(), 0, input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("A"));
    127     test(S(), 0, input_iterator<const char*>(s), input_iterator<const char*>(s+10), S("ABCDEFGHIJ"));
    128     test(S(), 0, input_iterator<const char*>(s), input_iterator<const char*>(s+52), S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
    129 
    130     test(S("12345"), 0, input_iterator<const char*>(s), input_iterator<const char*>(s), S("12345"));
    131     test(S("12345"), 1, input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("1A2345"));
    132     test(S("12345"), 4, input_iterator<const char*>(s), input_iterator<const char*>(s+10), S("1234ABCDEFGHIJ5"));
    133     test(S("12345"), 5, input_iterator<const char*>(s), input_iterator<const char*>(s+52), S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
    134 
    135     test(S("1234567890"), 0, input_iterator<const char*>(s), input_iterator<const char*>(s), S("1234567890"));
    136     test(S("1234567890"), 1, input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("1A234567890"));
    137     test(S("1234567890"), 10, input_iterator<const char*>(s), input_iterator<const char*>(s+10), S("1234567890ABCDEFGHIJ"));
    138     test(S("1234567890"), 8, input_iterator<const char*>(s), input_iterator<const char*>(s+52), S("12345678ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz90"));
    139 
    140     test(S("12345678901234567890"), 3, input_iterator<const char*>(s), input_iterator<const char*>(s), S("12345678901234567890"));
    141     test(S("12345678901234567890"), 3, input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("123A45678901234567890"));
    142     test(S("12345678901234567890"), 15, input_iterator<const char*>(s), input_iterator<const char*>(s+10), S("123456789012345ABCDEFGHIJ67890"));
    143     test(S("12345678901234567890"), 20, input_iterator<const char*>(s), input_iterator<const char*>(s+52),
    144          S("12345678901234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
    145     }
    146 #endif
    147 #ifndef TEST_HAS_NO_EXCEPTIONS
    148     { // test iterator operations that throw
    149     typedef std::string S;
    150     typedef ThrowingIterator<char> TIter;
    151     typedef input_iterator<TIter> IIter;
    152     const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    153     test_exceptions(S(), 0, IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter());
    154     test_exceptions(S(), 0, IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter());
    155     test_exceptions(S(), 0, IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter());
    156 
    157     test_exceptions(S(), 0, TIter(s, s+10, 4, TIter::TAIncrement), TIter());
    158     test_exceptions(S(), 0, TIter(s, s+10, 5, TIter::TADereference), TIter());
    159     test_exceptions(S(), 0, TIter(s, s+10, 6, TIter::TAComparison), TIter());
    160     }
    161 #endif
    162 #if _LIBCPP_DEBUG >= 1
    163     {
    164         std::string v;
    165         std::string v2;
    166         char a[] = "123";
    167         const int N = sizeof(a)/sizeof(a[0]);
    168         std::string::iterator i = v.insert(v2.cbegin() + 10, a, a+N);
    169         assert(false);
    170     }
    171 #endif
    172 
    173     { // test inserting into self
    174     typedef std::string S;
    175     S s_short = "123/";
    176     S s_long  = "Lorem ipsum dolor sit amet, consectetur/";
    177 
    178     s_short.insert(s_short.begin(), s_short.begin(), s_short.end());
    179     assert(s_short == "123/123/");
    180     s_short.insert(s_short.begin(), s_short.begin(), s_short.end());
    181     assert(s_short == "123/123/123/123/");
    182     s_short.insert(s_short.begin(), s_short.begin(), s_short.end());
    183     assert(s_short == "123/123/123/123/123/123/123/123/");
    184 
    185     s_long.insert(s_long.begin(), s_long.begin(), s_long.end());
    186     assert(s_long == "Lorem ipsum dolor sit amet, consectetur/Lorem ipsum dolor sit amet, consectetur/");
    187     }
    188 
    189     { // test assigning a different type
    190     typedef std::string S;
    191     const uint8_t p[] = "ABCD";
    192 
    193     S s;
    194     s.insert(s.begin(), p, p + 4);
    195     assert(s == "ABCD");
    196     }
    197 
    198   { // test with a move iterator that returns char&&
    199     typedef input_iterator<const char*> It;
    200     typedef std::move_iterator<It> MoveIt;
    201     const char p[] = "ABCD";
    202     std::string s;
    203     s.insert(s.begin(), MoveIt(It(std::begin(p))), MoveIt(It(std::end(p) - 1)));
    204     assert(s == "ABCD");
    205   }
    206   { // test with a move iterator that returns char&&
    207     typedef forward_iterator<const char*> It;
    208     typedef std::move_iterator<It> MoveIt;
    209     const char p[] = "ABCD";
    210     std::string s;
    211     s.insert(s.begin(), MoveIt(It(std::begin(p))), MoveIt(It(std::end(p) - 1)));
    212     assert(s == "ABCD");
    213   }
    214   { // test with a move iterator that returns char&&
    215     typedef const char* It;
    216     typedef std::move_iterator<It> MoveIt;
    217     const char p[] = "ABCD";
    218     std::string s;
    219     s.insert(s.begin(), MoveIt(It(std::begin(p))), MoveIt(It(std::end(p) - 1)));
    220     assert(s == "ABCD");
    221   }
    222 }