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#ifndef TEST_STD_INPUT_OUTPUT_FILE_STREAMS_FSTREAMS_TYPES_H
10#define TEST_STD_INPUT_OUTPUT_FILE_STREAMS_FSTREAMS_TYPES_H
11
12#include <cstddef>
13#include <fstream>
14#include <vector>
15
16#include "test_macros.h"
17
18struct UserManagedBuffer {
19 UserManagedBuffer(std::size_t size) : size_(size) {}
20
21 UserManagedBuffer(UserManagedBuffer const&) = delete;
22 UserManagedBuffer(UserManagedBuffer&&) = default;
23
24 void operator()(std::basic_ofstream<char>& stream) {
25 buffers_.emplace_back(new char[size_]);
26 stream.rdbuf()->pubsetbuf(buffers_.back(), size_);
27 }
28 void operator()(std::basic_ifstream<char>& stream) {
29 buffers_.emplace_back(new char[size_]);
30 stream.rdbuf()->pubsetbuf(buffers_.back(), size_);
31 }
32
33#ifndef TEST_HAS_NO_WIDE_CHARACTERS
34 void operator()(std::basic_ofstream<wchar_t>& stream) {
35 wbuffers_.emplace_back(new wchar_t[size_]);
36 stream.rdbuf()->pubsetbuf(wbuffers_.back(), size_);
37 }
38 void operator()(std::basic_ifstream<wchar_t>& stream) {
39 wbuffers_.emplace_back(new wchar_t[size_]);
40 stream.rdbuf()->pubsetbuf(wbuffers_.back(), size_);
41 }
42#endif
43 ~UserManagedBuffer() {
44 for (char* p : buffers_)
45 delete[] p;
46
47#ifndef TEST_HAS_NO_WIDE_CHARACTERS
48 for (wchar_t* p : wbuffers_)
49 delete[] p;
50#endif
51 }
52
53private:
54 std::size_t size_;
55 std::vector<char*> buffers_;
56 std::vector<wchar_t*> wbuffers_;
57};
58
59struct LibraryManagedBuffer {
60 LibraryManagedBuffer(std::size_t size) : size_(size) {}
61 template <class CharT>
62 void operator()(std::basic_ofstream<CharT>& stream) const {
63 stream.rdbuf()->pubsetbuf(nullptr, size_);
64 }
65
66 template <class CharT>
67 void operator()(std::basic_ifstream<CharT>& stream) const {
68 stream.rdbuf()->pubsetbuf(nullptr, size_);
69 }
70
71private:
72 std::size_t size_;
73};
74
75struct LibraryDefaultBuffer {
76 LibraryDefaultBuffer() {}
77 template <class CharT>
78 void operator()(std::basic_ofstream<CharT>&) const {}
79 template <class CharT>
80 void operator()(std::basic_ifstream<CharT>&) const {}
81};
82
83#if TEST_STD_VER >= 26
84# if defined(_WIN32)
85using NativeHandleT = void*; // HANDLE
86# elif __has_include(<unistd.h>)
87using NativeHandleT = int; // POSIX file descriptor
88# else
89# error "Provide a native file handle!"
90# endif
91#endif
92
93#endif // TEST_STD_INPUT_OUTPUT_FILE_STREAMS_FSTREAMS_TYPES_H
94

source code of libcxx/test/std/input.output/file.streams/fstreams/types.h