brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · e1c7182 Raw
92 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++0310 11// <sstream>12 13// template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >14// class basic_stringbuf15 16// basic_stringbuf& operator=(basic_stringbuf&& rhs);17 18#include <sstream>19#include <cassert>20#include <utility>21 22#include "make_string.h"23#include "test_macros.h"24 25#define STR(S) MAKE_STRING(CharT, S)26 27template <class CharT>28struct test_stringbuf : std::basic_stringbuf<CharT> {29  using std::basic_stringbuf<CharT>::basic_stringbuf;30 31  // Checks the following requirement after being moved from:32  //    The six pointers of std::basic_streambuf in *this are guaranteed to be different33  //    from the corresponding pointers in the moved-from rhs unless null.34  void check_different_pointers(test_stringbuf<CharT> const& other) const {35    assert(this->eback() == nullptr || this->eback() != other.eback());36    assert(this->gptr() == nullptr || this->gptr() != other.gptr());37    assert(this->egptr() == nullptr || this->egptr() != other.egptr());38    assert(this->pbase() == nullptr || this->pbase() != other.pbase());39    assert(this->pptr() == nullptr || this->pptr() != other.pptr());40    assert(this->epptr() == nullptr || this->epptr() != other.epptr());41  }42};43 44template <class CharT>45void test() {46  std::basic_string<CharT> strings[] = {STR(""), STR("short"), STR("loooooooooooooooooooong")};47  for (std::basic_string<CharT> const& s : strings) {48    {49      test_stringbuf<CharT> buf1(s);50      test_stringbuf<CharT> buf;51      buf = std::move(buf1);52      assert(buf.str() == s);53      buf.check_different_pointers(buf1);54    }55    {56      test_stringbuf<CharT> buf1(s, std::ios_base::in);57      test_stringbuf<CharT> buf;58      buf = std::move(buf1);59      assert(buf.str() == s);60      buf.check_different_pointers(buf1);61    }62    {63      test_stringbuf<CharT> buf1(s, std::ios_base::out);64      test_stringbuf<CharT> buf;65      buf = std::move(buf1);66      assert(buf.str() == s);67      buf.check_different_pointers(buf1);68    }69    {70      test_stringbuf<CharT> buf1;71      test_stringbuf<CharT> buf;72      buf = std::move(buf1);73      buf.check_different_pointers(buf1);74    }75    // Use the assignment operator on an actual std::stringbuf, not test_stringbuf76    {77      std::basic_stringbuf<CharT> buf1(s);78      std::basic_stringbuf<CharT> buf;79      buf = std::move(buf1);80      assert(buf.str() == s);81    }82  }83}84 85int main(int, char**) {86  test<char>();87#ifndef TEST_HAS_NO_WIDE_CHARACTERS88  test<wchar_t>();89#endif90  return 0;91}92