145 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// UNSUPPORTED: no-localization11// UNSUPPORTED: no-threads12// UNSUPPORTED: libcpp-has-no-experimental-syncstream13 14// <syncstream>15 16// template <class charT, class traits, class Allocator>17// class basic_osyncstream;18 19// The test writes all elements in test_strings in a random order in ss. Every20// write is done by an osyncstream. This means the output is in random order,21// but the words should be written without interleaving. To increment the22// change of interleaving words are written one character at a time.23 24#include <cassert>25#include <chrono>26#include <mutex>27#include <sstream>28#include <string>29#include <syncstream>30#include <thread>31#include <unordered_set>32#include <vector>33 34#include "test_macros.h"35 36static std::ostringstream ss;37 38static std::unordered_multiset<std::string> test_strings = {39 "C++ ",40 "is ",41 "a ",42 "general-purpose ",43 "programming ",44 "language ",45 "created ",46 "by ",47 "Bjarne ",48 "Stroustrup ",49 "as ",50 "an ",51 "extension ",52 "of ",53 "the ",54 "C ",55 "programming ",56 "language, ",57 "or ",58 "C ",59 "with ",60 "Classes. ",61 "The ",62 "language ",63 "has ",64 "expanded ",65 "significantly ",66 "over ",67 "time, ",68 "and ",69 "modern ",70 "C++ ",71 "has ",72 "object-oriented, ",73 "generic, ",74 "and ",75 "functional ",76 "features ",77 "in ",78 "addition ",79 "to ",80 "facilities ",81 "for ",82 "low-level ",83 "memory ",84 "manipulation. ",85 "It ",86 "is ",87 "almost ",88 "always ",89 "implemented ",90 "as ",91 "a ",92 "compiled ",93 "language, ",94 "and ",95 "many ",96 "vendors ",97 "provide ",98 "C++ ",99 "compilers, ",100 "including ",101 "the ",102 "Free ",103 "Software ",104 "Foundation, ",105 "LLVM, ",106 "Microsoft, ",107 "Intel, ",108 "and ",109 "IBM, ",110 "so ",111 "it ",112 "is ",113 "available ",114 "on ",115 "many ",116 "platforms."};117 118void f(std::string text) {119 std::osyncstream out(ss);120 for (char c : text)121 out << c;122}123 124void test() {125 ss = std::basic_ostringstream<char>();126 std::vector<std::thread> threads;127 for (std::string const& word : test_strings)128 threads.push_back(std::thread(f, word));129 130 for (auto& thread : threads)131 thread.join();132 133 std::string output = ss.str();134 for (const std::string& word : test_strings)135 assert(output.find(word) != std::string::npos);136}137 138int main(int, char**) {139 // The more we test, the more likely we catch an error140 for (size_t i = 0; i < 1024; ++i)141 test();142 143 return 0;144}145