brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · 9d75bf9 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++03, c++11, c++14, c++1710 11// <sstream>12 13// template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >14// class basic_stringbuf15 16// basic_string<charT, traits, Allocator> str() &&;17 18#include <sstream>19#include <cassert>20 21#include "make_string.h"22#include "test_macros.h"23 24#define STR(S) MAKE_STRING(CharT, S)25 26template <class CharT>27static void test() {28  {29    std::basic_stringbuf<CharT> buf(STR("testing"));30    std::basic_string<CharT> s = std::move(buf).str();31    assert(s == STR("testing"));32    assert(buf.view().empty());33  }34  {35    std::basic_stringbuf<CharT> buf;36    std::basic_string<CharT> s = std::move(buf).str();37    assert(s.empty());38    assert(buf.view().empty());39  }40  {41    std::basic_stringbuf<CharT> buf(STR("a very long string that exceeds the small string optimization buffer length"));42    const CharT* p             = buf.view().data();43    std::basic_string<CharT> s = std::move(buf).str();44    assert(s.data() == p); // the allocation was pilfered45    assert(buf.view().empty());46  }47}48 49struct StringBuf : std::stringbuf {50  using basic_stringbuf::basic_stringbuf;51  void public_setg(int a, int b, int c) {52    char* p = eback();53    this->setg(p + a, p + b, p + c);54  }55};56 57static void test_altered_sequence_pointers() {58  {59    auto src = StringBuf("hello world", std::ios_base::in);60    src.public_setg(4, 6, 9);61    std::stringbuf dest;62    dest             = std::move(src);63    std::string view = std::string(dest.view());64    std::string str  = std::move(dest).str();65    assert(view == str);66    LIBCPP_ASSERT(str == "o wor");67    assert(dest.str().empty());68    assert(dest.view().empty());69  }70  {71    auto src = StringBuf("hello world", std::ios_base::in);72    src.public_setg(4, 6, 9);73    std::stringbuf dest;74    dest.swap(src);75    std::string view = std::string(dest.view());76    std::string str  = std::move(dest).str();77    assert(view == str);78    LIBCPP_ASSERT(str == "o wor");79    assert(dest.str().empty());80    assert(dest.view().empty());81  }82}83 84int main(int, char**) {85  test<char>();86#ifndef TEST_HAS_NO_WIDE_CHARACTERS87  test<wchar_t>();88#endif89  test_altered_sequence_pointers();90  return 0;91}92