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 
9 // <sstream>
10 
11 // template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
12 // class basic_stringbuf
13 
14 // pos_type seekoff(off_type off, ios_base::seekdir way,
15 //                  ios_base::openmode which = ios_base::in | ios_base::out);
16 
17 #include <sstream>
18 #include <cassert>
19 
20 int main(int, char**)
21 {
22     {
23         std::stringbuf sb(std::ios_base::in);
24         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == -1);
25         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == -1);
26         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == -1);
27         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in | std::ios_base::out) == -1);
28         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in | std::ios_base::out) == -1);
29         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in | std::ios_base::out) == -1);
30         assert(sb.pubseekoff(0, std::ios_base::beg, std::ios_base::in) == 0);
31         assert(sb.pubseekoff(0, std::ios_base::cur, std::ios_base::in) == 0);
32         assert(sb.pubseekoff(0, std::ios_base::end, std::ios_base::in) == 0);
33     }
34     {
35         std::stringbuf sb(std::ios_base::out);
36         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == -1);
37         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == -1);
38         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == -1);
39         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in | std::ios_base::out) == -1);
40         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in | std::ios_base::out) == -1);
41         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in | std::ios_base::out) == -1);
42         assert(sb.pubseekoff(0, std::ios_base::beg, std::ios_base::out) == 0);
43         assert(sb.pubseekoff(0, std::ios_base::cur, std::ios_base::out) == 0);
44         assert(sb.pubseekoff(0, std::ios_base::end, std::ios_base::out) == 0);
45     }
46     {
47         std::stringbuf sb("0123456789", std::ios_base::in);
48         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == -1);
49         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == -1);
50         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == -1);
51         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in | std::ios_base::out) == -1);
52         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in | std::ios_base::out) == -1);
53         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in | std::ios_base::out) == -1);
54         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == 3);
55         assert(sb.sgetc() == '3');
56         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == 6);
57         assert(sb.sgetc() == '6');
58         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == 7);
59         assert(sb.sgetc() == '7');
60     }
61     {
62         std::stringbuf sb("0123456789", std::ios_base::out);
63         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == -1);
64         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == -1);
65         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == -1);
66         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out | std::ios_base::in) == -1);
67         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out | std::ios_base::in) == -1);
68         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out | std::ios_base::in) == -1);
69         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == 3);
70         assert(sb.sputc('a') == 'a');
71         assert(sb.str() == "012a456789");
72         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == 7);
73         assert(sb.sputc('b') == 'b');
74         assert(sb.str() == "012a456b89");
75         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == 7);
76         assert(sb.sputc('c') == 'c');
77         assert(sb.str() == "012a456c89");
78     }
79     {
80         std::stringbuf sb("0123456789");
81         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == 3);
82         assert(sb.sgetc() == '3');
83         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == 6);
84         assert(sb.sgetc() == '6');
85         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == 7);
86         assert(sb.sgetc() == '7');
87         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out | std::ios_base::in) == 3);
88         assert(sb.sgetc() == '3');
89         assert(sb.sputc('a') == 'a');
90         assert(sb.str() == "012a456789");
91         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out | std::ios_base::in) == -1);
92         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out | std::ios_base::in) == 7);
93         assert(sb.sgetc() == '7');
94         assert(sb.sputc('c') == 'c');
95         assert(sb.str() == "012a456c89");
96         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == 3);
97         assert(sb.sputc('3') == '3');
98         assert(sb.str() == "0123456c89");
99         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == 7);
100         assert(sb.sputc('7') == '7');
101         assert(sb.str() == "0123456789");
102         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == 7);
103         assert(sb.sputc('c') == 'c');
104         assert(sb.str() == "0123456c89");
105     }
106     {
107         std::wstringbuf sb(L"0123456789", std::ios_base::in);
108         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == -1);
109         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == -1);
110         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == -1);
111         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in | std::ios_base::out) == -1);
112         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in | std::ios_base::out) == -1);
113         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in | std::ios_base::out) == -1);
114         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == 3);
115         assert(sb.sgetc() == L'3');
116         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == 6);
117         assert(sb.sgetc() == L'6');
118         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == 7);
119         assert(sb.sgetc() == L'7');
120     }
121     {
122         std::wstringbuf sb(L"0123456789", std::ios_base::out);
123         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == -1);
124         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == -1);
125         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == -1);
126         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out | std::ios_base::in) == -1);
127         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out | std::ios_base::in) == -1);
128         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out | std::ios_base::in) == -1);
129         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == 3);
130         assert(sb.sputc(L'a') == L'a');
131         assert(sb.str() == L"012a456789");
132         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == 7);
133         assert(sb.sputc(L'b') == L'b');
134         assert(sb.str() == L"012a456b89");
135         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == 7);
136         assert(sb.sputc(L'c') == L'c');
137         assert(sb.str() == L"012a456c89");
138     }
139     {
140         std::wstringbuf sb(L"0123456789");
141         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == 3);
142         assert(sb.sgetc() == L'3');
143         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == 6);
144         assert(sb.sgetc() == L'6');
145         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == 7);
146         assert(sb.sgetc() == L'7');
147         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out | std::ios_base::in) == 3);
148         assert(sb.sgetc() == L'3');
149         assert(sb.sputc(L'a') == L'a');
150         assert(sb.str() == L"012a456789");
151         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out | std::ios_base::in) == -1);
152         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out | std::ios_base::in) == 7);
153         assert(sb.sgetc() == L'7');
154         assert(sb.sputc(L'c') == L'c');
155         assert(sb.str() == L"012a456c89");
156         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == 3);
157         assert(sb.sputc(L'3') == L'3');
158         assert(sb.str() == L"0123456c89");
159         assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == 7);
160         assert(sb.sputc(L'7') == L'7');
161         assert(sb.str() == L"0123456789");
162         assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == 7);
163         assert(sb.sputc(L'c') == L'c');
164         assert(sb.str() == L"0123456c89");
165     }
166 
167   return 0;
168 }
169