#include <cassert>
#include <chrono>
#include <mutex>
#include <sstream>
#include <string>
#include <syncstream>
#include <thread>
#include <unordered_set>
#include <vector>
#include "test_macros.h"
static std::ostringstream ss;
static std::unordered_multiset<std::string> test_strings = {
"C++ ",
"is ",
"a ",
"general-purpose ",
"programming ",
"language ",
"created ",
"by ",
"Bjarne ",
"Stroustrup ",
"as ",
"an ",
"extension ",
"of ",
"the ",
"C ",
"programming ",
"language, ",
"or ",
"C ",
"with ",
"Classes. ",
"The ",
"language ",
"has ",
"expanded ",
"significantly ",
"over ",
"time, ",
"and ",
"modern ",
"C++ ",
"has ",
"object-oriented, ",
"generic, ",
"and ",
"functional ",
"features ",
"in ",
"addition ",
"to ",
"facilities ",
"for ",
"low-level ",
"memory ",
"manipulation. ",
"It ",
"is ",
"almost ",
"always ",
"implemented ",
"as ",
"a ",
"compiled ",
"language, ",
"and ",
"many ",
"vendors ",
"provide ",
"C++ ",
"compilers, ",
"including ",
"the ",
"Free ",
"Software ",
"Foundation, ",
"LLVM, ",
"Microsoft, ",
"Intel, ",
"and ",
"IBM, ",
"so ",
"it ",
"is ",
"available ",
"on ",
"many ",
"platforms."};
void f(std::string text) {
std::osyncstream out(ss);
for (char c : text)
out << c;
}
void test() {
ss = std::basic_ostringstream<char>();
std::vector<std::thread> threads;
for (std::string const& word : test_strings)
threads.push_back(std::thread(f, word));
for (auto& thread : threads)
thread.join();
std::string output = ss.str();
for (const std::string& word : test_strings)
assert(output.find(word) != std::string::npos);
}
int main(int, char**) {
for (size_t i = 0; i < 1024; ++i)
test();
return 0;
}