Home | History | Annotate | Download | only in string.cons
      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 // basic_string(const basic_string<charT,traits,Allocator>& str,
     13 //              size_type pos, size_type n = npos,
     14 //              const Allocator& a = Allocator());
     15 
     16 #include <string>
     17 #include <stdexcept>
     18 #include <algorithm>
     19 #include <cassert>
     20 
     21 #include "test_allocator.h"
     22 #include "min_allocator.h"
     23 
     24 template <class S>
     25 void
     26 test(S str, unsigned pos)
     27 {
     28     typedef typename S::traits_type T;
     29     typedef typename S::allocator_type A;
     30     try
     31     {
     32         S s2(str, pos);
     33         assert(s2.__invariants());
     34         assert(pos <= str.size());
     35         unsigned rlen = str.size() - pos;
     36         assert(s2.size() == rlen);
     37         assert(T::compare(s2.data(), str.data() + pos, rlen) == 0);
     38         assert(s2.get_allocator() == A());
     39         assert(s2.capacity() >= s2.size());
     40     }
     41     catch (std::out_of_range&)
     42     {
     43         assert(pos > str.size());
     44     }
     45 }
     46 
     47 template <class S>
     48 void
     49 test(S str, unsigned pos, unsigned n)
     50 {
     51     typedef typename S::traits_type T;
     52     typedef typename S::allocator_type A;
     53     try
     54     {
     55         S s2(str, pos, n);
     56         assert(s2.__invariants());
     57         assert(pos <= str.size());
     58         unsigned rlen = std::min<unsigned>(str.size() - pos, n);
     59         assert(s2.size() == rlen);
     60         assert(T::compare(s2.data(), str.data() + pos, rlen) == 0);
     61         assert(s2.get_allocator() == A());
     62         assert(s2.capacity() >= s2.size());
     63     }
     64     catch (std::out_of_range&)
     65     {
     66         assert(pos > str.size());
     67     }
     68 }
     69 
     70 template <class S>
     71 void
     72 test(S str, unsigned pos, unsigned n, const typename S::allocator_type& a)
     73 {
     74     typedef typename S::traits_type T;
     75     typedef typename S::allocator_type A;
     76     try
     77     {
     78         S s2(str, pos, n, a);
     79         assert(s2.__invariants());
     80         assert(pos <= str.size());
     81         unsigned rlen = std::min<unsigned>(str.size() - pos, n);
     82         assert(s2.size() == rlen);
     83         assert(T::compare(s2.data(), str.data() + pos, rlen) == 0);
     84         assert(s2.get_allocator() == a);
     85         assert(s2.capacity() >= s2.size());
     86     }
     87     catch (std::out_of_range&)
     88     {
     89         assert(pos > str.size());
     90     }
     91 }
     92 
     93 int main()
     94 {
     95     {
     96     typedef test_allocator<char> A;
     97     typedef std::basic_string<char, std::char_traits<char>, A> S;
     98 
     99     test(S(A(3)), 0);
    100     test(S(A(3)), 1);
    101     test(S("1", A(5)), 0);
    102     test(S("1", A(5)), 1);
    103     test(S("1", A(5)), 2);
    104     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 0);
    105     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 5);
    106     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50);
    107     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 500);
    108 
    109     test(S(A(3)), 0, 0);
    110     test(S(A(3)), 0, 1);
    111     test(S(A(3)), 1, 0);
    112     test(S(A(3)), 1, 1);
    113     test(S(A(3)), 1, 2);
    114     test(S("1", A(5)), 0, 0);
    115     test(S("1", A(5)), 0, 1);
    116     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 0);
    117     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 1);
    118     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 10);
    119     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 100);
    120 
    121     test(S(A(3)), 0, 0, A(4));
    122     test(S(A(3)), 0, 1, A(4));
    123     test(S(A(3)), 1, 0, A(4));
    124     test(S(A(3)), 1, 1, A(4));
    125     test(S(A(3)), 1, 2, A(4));
    126     test(S("1", A(5)), 0, 0, A(6));
    127     test(S("1", A(5)), 0, 1, A(6));
    128     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 0, A(8));
    129     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 1, A(8));
    130     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 10, A(8));
    131     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 100, A(8));
    132     }
    133 #if __cplusplus >= 201103L
    134     {
    135     typedef min_allocator<char> A;
    136     typedef std::basic_string<char, std::char_traits<char>, A> S;
    137 
    138     test(S(A()), 0);
    139     test(S(A()), 1);
    140     test(S("1", A()), 0);
    141     test(S("1", A()), 1);
    142     test(S("1", A()), 2);
    143     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 0);
    144     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 5);
    145     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50);
    146     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 500);
    147 
    148     test(S(A()), 0, 0);
    149     test(S(A()), 0, 1);
    150     test(S(A()), 1, 0);
    151     test(S(A()), 1, 1);
    152     test(S(A()), 1, 2);
    153     test(S("1", A()), 0, 0);
    154     test(S("1", A()), 0, 1);
    155     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 0);
    156     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 1);
    157     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 10);
    158     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 100);
    159 
    160     test(S(A()), 0, 0, A());
    161     test(S(A()), 0, 1, A());
    162     test(S(A()), 1, 0, A());
    163     test(S(A()), 1, 1, A());
    164     test(S(A()), 1, 2, A());
    165     test(S("1", A()), 0, 0, A());
    166     test(S("1", A()), 0, 1, A());
    167     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 0, A());
    168     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 1, A());
    169     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 10, A());
    170     test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 100, A());
    171     }
    172 #endif
    173 }
    174