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(size_type n, charT c, const Allocator& a = Allocator());
13
14#include <string>
15#include <stdexcept>
16#include <algorithm>
17#include <cassert>
18
19#include "test_allocator.h"
20#include "min_allocator.h"
21
22template <class charT>
23void
24test(unsigned n, charT c)
25{
26    typedef std::basic_string<charT, std::char_traits<charT>, test_allocator<charT> > S;
27    typedef typename S::traits_type T;
28    typedef typename S::allocator_type A;
29    S s2(n, c);
30    assert(s2.__invariants());
31    assert(s2.size() == n);
32    for (unsigned i = 0; i < n; ++i)
33        assert(s2[i] == c);
34    assert(s2.get_allocator() == A());
35    assert(s2.capacity() >= s2.size());
36}
37
38template <class charT, class A>
39void
40test(unsigned n, charT c, const A& a)
41{
42    typedef std::basic_string<charT, std::char_traits<charT>, A> S;
43    typedef typename S::traits_type T;
44    S s2(n, c, a);
45    assert(s2.__invariants());
46    assert(s2.size() == n);
47    for (unsigned i = 0; i < n; ++i)
48        assert(s2[i] == c);
49    assert(s2.get_allocator() == a);
50    assert(s2.capacity() >= s2.size());
51}
52
53template <class Tp>
54void
55test(Tp n, Tp c)
56{
57    typedef char charT;
58    typedef std::basic_string<charT, std::char_traits<charT>, test_allocator<charT> > S;
59    typedef typename S::traits_type T;
60    typedef typename S::allocator_type A;
61    S s2(n, c);
62    assert(s2.__invariants());
63    assert(s2.size() == n);
64    for (unsigned i = 0; i < n; ++i)
65        assert(s2[i] == c);
66    assert(s2.get_allocator() == A());
67    assert(s2.capacity() >= s2.size());
68}
69
70template <class Tp, class A>
71void
72test(Tp n, Tp c, const A& a)
73{
74    typedef char charT;
75    typedef std::basic_string<charT, std::char_traits<charT>, A> S;
76    typedef typename S::traits_type T;
77    S s2(n, c, a);
78    assert(s2.__invariants());
79    assert(s2.size() == n);
80    for (unsigned i = 0; i < n; ++i)
81        assert(s2[i] == c);
82    assert(s2.get_allocator() == a);
83    assert(s2.capacity() >= s2.size());
84}
85
86int main()
87{
88    {
89    typedef test_allocator<char> A;
90    typedef std::basic_string<char, std::char_traits<char>, A> S;
91
92    test(0, 'a');
93    test(0, 'a', A(2));
94
95    test(1, 'a');
96    test(1, 'a', A(2));
97
98    test(10, 'a');
99    test(10, 'a', A(2));
100
101    test(100, 'a');
102    test(100, 'a', A(2));
103
104    test(100, 65);
105    test(100, 65, A(3));
106    }
107#if __cplusplus >= 201103L
108    {
109    typedef min_allocator<char> A;
110    typedef std::basic_string<char, std::char_traits<char>, A> S;
111
112    test(0, 'a');
113    test(0, 'a', A());
114
115    test(1, 'a');
116    test(1, 'a', A());
117
118    test(10, 'a');
119    test(10, 'a', A());
120
121    test(100, 'a');
122    test(100, 'a', A());
123
124    test(100, 65);
125    test(100, 65, A());
126    }
127#endif
128}
129