Changeset 990b85d in mainline
- Timestamp:
- 2018-07-05T21:41:18Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f7aaffe0
- Parents:
- 4d30bcd
- git-author:
- Jaroslav Jindrak <dzejrou@…> (2017-11-04 20:26:38)
- git-committer:
- Dzejrou <dzejrou@…> (2018-07-05 21:41:18)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/cpp/include/impl/streambuf.hpp
r4d30bcd r990b85d 52 52 53 53 virtual ~basic_streambuf() 54 { 55 // TODO: implement 56 } 54 { /* DUMMY BODY */ } 57 55 58 56 /** … … 62 60 locale pubimbue(const locale& loc) 63 61 { 64 // TODO: implement62 return imbue(loc); 65 63 } 66 64 67 65 locale& getloc() const 68 66 { 69 // TODO: implement67 return locale_; 70 68 } 71 69 … … 76 74 basic_streambuf<Char, Traits>* pubsetbuf(char_type* s, streamsize n) 77 75 { 78 // TODO: implement76 return setbuf(s, n); 79 77 } 80 78 … … 82 80 ios_base::openmode which = ios_base::in | ios_base::out) 83 81 { 84 // TODO: implement82 return seekoff(off, way, which); 85 83 } 86 84 … … 88 86 ios_base::in | ios_base::out) 89 87 { 90 // TODO: implement88 return seekpos(pos, which); 91 89 } 92 90 93 91 int pubsync() 94 92 { 95 // TODO: implement93 return sync(); 96 94 } 97 95 … … 102 100 streamsize in_avail() 103 101 { 104 // TODO: implement 102 if (read_avail_()) 103 return egptr() - gptr(); 104 else 105 return showmanyc(); 105 106 } 106 107 107 108 int_type snextc() 108 109 { 109 // TODO: implement 110 if (traits_type::eq(sbumpc, traits_type::eof())) 111 return traits_type::eof(); 112 else 113 return sgetc(); 110 114 } 111 115 112 116 int_type sbumpc() 113 117 { 114 // TODO: implement 118 if (read_avail_()) 119 return traits_type::to_int_type(*input_next++); 120 else 121 return uflow(); 115 122 } 116 123 117 124 int_type sgetc() 118 125 { 119 // TODO: implement 126 if (read_avail_()) 127 return traits_type::to_int_type(*input_next++); 128 else 129 return underflow(); 120 130 } 121 131 122 132 streamsize sgetn(char_type* s, streamsize n) 123 133 { 124 // TODO: implement134 return xsgetn(s, n); 125 135 } 126 136 … … 131 141 int_type sputbackc(char_type c) 132 142 { 133 // TODO: implement 143 if (!putback_avail_() || traits_type::eq(c, gptr()[-1])) 144 return pbackfail(traits_type::to_int_type(c)); 145 else 146 return traits_type::to_int_type(*(--input_next)); 134 147 } 135 148 136 149 int_type sungetc() 137 150 { 138 // TODO: implement 151 if (!putback_avail_()) 152 return pbackfail(); 153 else 154 return traits_type::to_int_type(*(--input_next)); 139 155 } 140 156 … … 145 161 int_type sputc(char_type c) 146 162 { 147 // TODO: implement 163 if (!write_avail_()) 164 return overflow(traits_type::to_int_type(c)); 165 else 166 { 167 traits_type::assign(*output_next_++, c); 168 169 return traits_type::to_int_type(c); 170 } 148 171 } 149 172 150 173 streamsize sputn(const char_type* s, streamsize n) 151 174 { 152 // TODO: implement175 return xsputn(s, n); 153 176 } 154 177 155 178 protected: 156 179 basic_streambuf() 157 { 158 // TODO: implement 159 } 180 : input_begin_{}, input_next_{}, input_end_{}, 181 output_begin_{}, output_next_{}, output_end_{}, 182 locale_{locale()} 183 { /* DUMMY BODY */ } 160 184 161 185 basic_streambuf(const basic_streambuf& rhs) 162 186 { 163 // TODO: implement 187 input_begin_ = rhs.input_begin_; 188 input_next_ = rhs.input_next_; 189 input_end_ = rhs.input_end_; 190 191 output_begin_ = rhs.output_begin_; 192 output_next_ = rhs.output_next_; 193 output_end_ = rhs.output_end_; 194 195 locale_ = rhs.locale_; 164 196 } 165 197 166 198 basic_strambuf& operator=(const basic_streambuf& rhs) 167 199 { 168 // TODO: implement 200 input_begin_ = rhs.input_begin_; 201 input_next_ = rhs.input_next_; 202 input_end_ = rhs.input_end_; 203 204 output_begin_ = rhs.output_begin_; 205 output_next_ = rhs.output_next_; 206 output_end_ = rhs.output_end_; 207 208 locale_ = rhs.locale_; 209 210 return *this; 169 211 } 170 212 171 213 void swap(basic_streambuf& rhs) 172 214 { 173 // TODO: implement 215 swap(input_begin_, rhs.input_begin_); 216 swap(input_next_, rhs.input_next_); 217 swap(input_end_, rhs.input_end_); 218 219 swap(output_begin_, rhs.output_begin_); 220 swap(output_next_, rhs.output_next_); 221 swap(output_end_, rhs.output_end_); 222 223 swap(locale_, rhs.locale_); 174 224 } 175 225 … … 180 230 char_type* eback() const 181 231 { 182 // TODO: implement232 return input_begin_; 183 233 } 184 234 185 235 char_type* gptr() const 186 236 { 187 // TODO: implement237 return input_next_; 188 238 } 189 239 190 240 char_type* egptr() const 191 241 { 192 // TODO: implement242 return input_end_; 193 243 } 194 244 195 245 void gbump(int n) 196 246 { 197 // TODO: implement247 input_next_ += n; 198 248 } 199 249 200 250 void setg(char_type* gbeg, char_type* gnext, char_type* gend) 201 251 { 202 // TODO: implement 252 input_begin_ = gbeg; 253 input_next_ = gnext; 254 input_end_ = gend; 203 255 } 204 256 … … 209 261 char_type* pbase() const 210 262 { 211 // TODO: implement263 return output_begin_; 212 264 } 213 265 214 266 char_type* pptr() const 215 267 { 216 // TODO: implement268 return output_next_; 217 269 } 218 270 219 271 char_type* epptr() const 220 272 { 221 // TODO: implement273 return output_end_; 222 274 } 223 275 224 276 void pbump(int n) 225 277 { 226 // TODO: implement278 output_next_ += n; 227 279 } 228 280 229 281 void setp(char_type* pbeg, char_type* pend) 230 282 { 231 // TODO: implement 283 output_begin_ = pbeg; 284 output_next_ = pbeg; 285 output_end_ = pend; 232 286 } 233 287 … … 237 291 238 292 virtual void imbue(const locale& loc) 239 { 240 // TODO: implement 241 } 293 { /* DUMMY BODY */ } 242 294 243 295 /** … … 248 300 setbuf(char_type* s, streamsize n) 249 301 { 250 // TODO: implement302 return *this; 251 303 } 252 304 … … 254 306 ios_base::openmode which = ios_base::in | ops_base::out) 255 307 { 256 // TODO: implement308 return pos_type(off_type(-1)); 257 309 } 258 310 … … 260 312 ios_base::in | ios_base::out) 261 313 { 262 // TODO: implement314 return pos_type(off_type(-1)); 263 315 } 264 316 265 317 virtual int sync() 266 318 { 267 // TODO: implement319 return 0; 268 320 } 269 321 … … 274 326 virtual streamsize showmanyc() 275 327 { 276 // TODO: implement328 return 0; 277 329 } 278 330 279 331 virtual streamsize xsgetn(char_type* s, streamsize n) 280 332 { 281 // TODO: implement 333 if (!s || n == 0) 334 return 0; 335 336 streamsize i{0}; 337 auto eof = traits_type::eof(); 338 for (; i <= n; ++i) 339 { 340 if (!read_avail_() && traits_type::eq_int_type(uflow(), eof)) 341 break; 342 343 traits_type::asign(*s++, *input_next_++); 344 } 345 346 return i; 282 347 } 283 348 284 349 virtual int_type underflow() 285 350 { 286 // TODO: implement351 return traits_type::eof(); 287 352 } 288 353 289 354 virtual int_type uflow() 290 355 { 291 // TODO: implement 356 auto res = underflow(); 357 if (traits_type::eq_int_type(res, traits_type::eof())) 358 return traits_type::eof(); 359 else 360 return traits_type::to_int_type(*input_next_++); 292 361 } 293 362 … … 298 367 virtual int_type pbackfail(int_type c = traits_type::eof()) 299 368 { 300 // TODO: implement369 return traits_type::eof(); 301 370 } 302 371 … … 307 376 virtual streamsize xsputn(const char_type* s, streamsize n) 308 377 { 309 // TODO: implement 378 if (!s || n == 0) 379 return 0; 380 381 char* = &s[0]; 382 streamsize i{0}; 383 for (; i <= n; ++i) 384 { 385 if (!write_avail_() && traits_type::eq_int_type(overflow(), eof)) 386 break; 387 388 traits_type::assign(*s++, *output_next_++); 389 } 390 391 return i; 310 392 } 311 393 312 394 virtual int_type overflow(int_type c = traits_type::eof()) 313 395 { 314 // TODO: implement396 return traits_type::eof(); 315 397 } 316 398 317 399 private: 318 // TODO: implement 400 value_type* input_begin_; 401 value_type* input_next_; 402 value_type* input_end_; 403 404 value_type* output_begin_; 405 value_type* output_next_; 406 value_type* output_end_; 407 408 locale locale_; 409 410 bool write_avail_() const 411 { 412 return output_next_ && output_next_ < output_end_; 413 } 414 415 bool putback_avail_() const 416 { 417 return input_next_ && input_begin_ < input_next_; 418 } 419 420 bool read_avail_() const 421 { 422 return input_next_ && input_next_ < input_end_; 423 } 319 424 }; 320 425
Note:
See TracChangeset
for help on using the changeset viewer.