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-exception
6//
7//===----------------------------------------------------------------------===//
8
9// <ostream>
10
11// template <class Stream, class T>
12// Stream&& operator<<(Stream&& os, const T& x);
13
14#include <ostream>
15#include <cassert>
16
17#include "test_macros.h"
18
19
20template <class CharT>
21class testbuf
22 : public std::basic_streambuf<CharT>
23{
24 typedef std::basic_streambuf<CharT> base;
25 std::basic_string<CharT> str_;
26public:
27 testbuf()
28 {
29 }
30
31 std::basic_string<CharT> str() const
32 {return std::basic_string<CharT>(base::pbase(), base::pptr());}
33
34protected:
35
36 virtual typename base::int_type
37 overflow(typename base::int_type ch = base::traits_type::eof())
38 {
39 if (ch != base::traits_type::eof())
40 {
41 int n = static_cast<int>(str_.size());
42 str_.push_back(static_cast<CharT>(ch));
43 str_.resize(str_.capacity());
44 base::setp(const_cast<CharT*>(str_.data()),
45 const_cast<CharT*>(str_.data() + str_.size()));
46 base::pbump(n+1);
47 }
48 return ch;
49 }
50};
51
52struct Int {
53 int value;
54 template <class CharT>
55 friend void operator<<(std::basic_ostream<CharT>& os, Int const& self) {
56 os << self.value;
57 }
58};
59
60int main(int, char**)
61{
62 {
63 testbuf<char> sb;
64 std::ostream os(&sb);
65 Int const i = {.value: 123};
66 std::ostream&& result = (std::move(os) << i);
67 assert(&result == &os);
68 assert(sb.str() == "123");
69 }
70#ifndef TEST_HAS_NO_WIDE_CHARACTERS
71 {
72 testbuf<wchar_t> sb;
73 std::wostream os(&sb);
74 Int const i = {.value: 123};
75 std::wostream&& result = (std::move(os) << i);
76 assert(&result == &os);
77 assert(sb.str() == L"123");
78 }
79#endif
80
81 return 0;
82}
83

source code of libcxx/test/std/input.output/iostream.format/output.streams/ostream.rvalue/rvalue.pass.cpp