//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef TEST_STD_INPUT_OUTPUT_FILE_STREAMS_FSTREAMS_TYPES_H
#define TEST_STD_INPUT_OUTPUT_FILE_STREAMS_FSTREAMS_TYPES_H
#include <cstddef>
#include <fstream>
#include <vector>
#include "test_macros.h"
struct UserManagedBuffer {
UserManagedBuffer(std::size_t size) : size_(size) {}
UserManagedBuffer(UserManagedBuffer const&) = delete;
UserManagedBuffer(UserManagedBuffer&&) = default;
void operator()(std::basic_ofstream<char>& stream) {
buffers_.emplace_back(new char[size_]);
stream.rdbuf()->pubsetbuf(buffers_.back(), size_);
}
void operator()(std::basic_ifstream<char>& stream) {
buffers_.emplace_back(new char[size_]);
stream.rdbuf()->pubsetbuf(buffers_.back(), size_);
}
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
void operator()(std::basic_ofstream<wchar_t>& stream) {
wbuffers_.emplace_back(new wchar_t[size_]);
stream.rdbuf()->pubsetbuf(wbuffers_.back(), size_);
}
void operator()(std::basic_ifstream<wchar_t>& stream) {
wbuffers_.emplace_back(new wchar_t[size_]);
stream.rdbuf()->pubsetbuf(wbuffers_.back(), size_);
}
#endif
~UserManagedBuffer() {
for (char* p : buffers_)
delete[] p;
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
for (wchar_t* p : wbuffers_)
delete[] p;
#endif
}
private:
std::size_t size_;
std::vector<char*> buffers_;
std::vector<wchar_t*> wbuffers_;
};
struct LibraryManagedBuffer {
LibraryManagedBuffer(std::size_t size) : size_(size) {}
template <class CharT>
void operator()(std::basic_ofstream<CharT>& stream) const {
stream.rdbuf()->pubsetbuf(nullptr, size_);
}
template <class CharT>
void operator()(std::basic_ifstream<CharT>& stream) const {
stream.rdbuf()->pubsetbuf(nullptr, size_);
}
private:
std::size_t size_;
};
struct LibraryDefaultBuffer {
LibraryDefaultBuffer() {}
template <class CharT>
void operator()(std::basic_ofstream<CharT>&) const {}
template <class CharT>
void operator()(std::basic_ifstream<CharT>&) const {}
};
#if TEST_STD_VER >= 26
# if defined(_WIN32)
using NativeHandleT = void*; // HANDLE
# elif __has_include(<unistd.h>)
using NativeHandleT = int; // POSIX file descriptor
# else
# error "Provide a native file handle!"
# endif
#endif
#endif // TEST_STD_INPUT_OUTPUT_FILE_STREAMS_FSTREAMS_TYPES_H