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// <fstream>
10
11// template <class charT, class traits = char_traits<charT> >
12// class basic_ofstream
13
14// void swap(basic_ofstream& rhs);
15
16#include <fstream>
17#include <utility>
18#include <cassert>
19#include "test_macros.h"
20#include "platform_support.h"
21
22std::pair<std::string, std::string> get_temp_file_names() {
23 std::pair<std::string, std::string> names;
24 names.first = get_temp_file_name();
25
26 // Create the file so the next call to `get_temp_file_name()` doesn't
27 // return the same file.
28 std::FILE *fd1 = std::fopen(filename: names.first.c_str(), modes: "w");
29
30 names.second = get_temp_file_name();
31 assert(names.first != names.second);
32
33 std::fclose(stream: fd1);
34 std::remove(filename: names.first.c_str());
35
36 return names;
37}
38
39int main(int, char**)
40{
41 std::pair<std::string, std::string> temp_files = get_temp_file_names();
42 std::string& temp1 = temp_files.first;
43 std::string& temp2 = temp_files.second;
44 assert(temp1 != temp2);
45 {
46 std::ofstream fs1(temp1.c_str());
47 std::ofstream fs2(temp2.c_str());
48 fs1 << 3.25;
49 fs2 << 4.5;
50 fs1.swap(rhs&: fs2);
51 fs1 << ' ' << 3.25;
52 fs2 << ' ' << 4.5;
53 }
54 {
55 std::ifstream fs(temp1.c_str());
56 double x = 0;
57 fs >> x;
58 assert(x == 3.25);
59 fs >> x;
60 assert(x == 4.5);
61 }
62 std::remove(filename: temp1.c_str());
63 {
64 std::ifstream fs(temp2.c_str());
65 double x = 0;
66 fs >> x;
67 assert(x == 4.5);
68 fs >> x;
69 assert(x == 3.25);
70 }
71 std::remove(filename: temp2.c_str());
72
73#ifndef TEST_HAS_NO_WIDE_CHARACTERS
74 {
75 std::wofstream fs1(temp1.c_str());
76 std::wofstream fs2(temp2.c_str());
77 fs1 << 3.25;
78 fs2 << 4.5;
79 fs1.swap(rhs&: fs2);
80 fs1 << ' ' << 3.25;
81 fs2 << ' ' << 4.5;
82 }
83 {
84 std::wifstream fs(temp1.c_str());
85 double x = 0;
86 fs >> x;
87 assert(x == 3.25);
88 fs >> x;
89 assert(x == 4.5);
90 }
91 std::remove(filename: temp1.c_str());
92 {
93 std::wifstream fs(temp2.c_str());
94 double x = 0;
95 fs >> x;
96 assert(x == 4.5);
97 fs >> x;
98 assert(x == 3.25);
99 }
100 std::remove(filename: temp2.c_str());
101#endif
102
103 return 0;
104}
105

source code of libcxx/test/std/input.output/file.streams/fstreams/ofstream.assign/member_swap.pass.cpp