brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · 936e01b Raw
112 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++1410 11// <fstream>12 13// plate <class charT, class traits = char_traits<charT> >14// class basic_fstream15 16// template<class T>17// explicit basic_fstream(const T& s, ios_base::openmode mode = ios_base::in); // Since C++1718// Constraints: is_same_v<T, filesystem::path> is true19 20#include <fstream>21#include <filesystem>22#include <cassert>23#include <type_traits>24 25#include "test_macros.h"26#include "test_iterators.h"27#include "platform_support.h"28#include "operator_hijacker.h"29 30namespace fs = std::filesystem;31 32template <class CharT>33constexpr bool test_non_convert_to_path() {34  // String types35  static_assert(!std::is_constructible_v<std::fstream, std::basic_string_view<CharT>>);36  static_assert(!std::is_constructible_v<std::fstream, const std::basic_string_view<CharT>>);37 38  // Char* pointers39  if constexpr (!std::is_same_v<CharT, char> && !std::is_same_v<CharT, fs::path::value_type>)40    static_assert(!std::is_constructible_v<std::fstream, const CharT*>);41 42  // Iterators43  static_assert(!std::is_convertible_v<std::fstream, cpp17_input_iterator<const CharT*>>);44 45  return true;46}47 48static_assert(test_non_convert_to_path<char>());49 50#if !defined(TEST_HAS_NO_WIDE_CHARACTERS) && !defined(TEST_HAS_OPEN_WITH_WCHAR)51static_assert(test_non_convert_to_path<wchar_t>());52#endif // !TEST_HAS_NO_WIDE_CHARACTERS && !TEST_HAS_OPEN_WITH_WCHAR53 54#ifndef TEST_HAS_NO_CHAR8_T55static_assert(test_non_convert_to_path<char8_t>());56#endif // TEST_HAS_NO_CHAR8_T57 58static_assert(test_non_convert_to_path<char16_t>());59static_assert(test_non_convert_to_path<char32_t>());60 61int main(int, char**) {62  fs::path p = get_temp_file_name();63  {64    std::fstream fs(p, std::ios_base::in | std::ios_base::out |65                           std::ios_base::trunc);66    double x = 0;67    fs << 3.25;68    fs.seekg(0);69    fs >> x;70    assert(x == 3.25);71  }72  std::remove(p.string().c_str());73 74  {75    std::basic_fstream<char, operator_hijacker_char_traits<char> > fs(76        p, std::ios_base::in | std::ios_base::out | std::ios_base::trunc);77    std::basic_string<char, operator_hijacker_char_traits<char> > x;78    fs << "3.25";79    fs.seekg(0);80    fs >> x;81    assert(x == "3.25");82  }83  std::remove(p.string().c_str());84 85#ifndef TEST_HAS_NO_WIDE_CHARACTERS86  {87    std::wfstream fs(p, std::ios_base::in | std::ios_base::out |88                            std::ios_base::trunc);89    double x = 0;90    fs << 3.25;91    fs.seekg(0);92    fs >> x;93    assert(x == 3.25);94  }95  std::remove(p.string().c_str());96 97  {98    std::basic_fstream<wchar_t, operator_hijacker_char_traits<wchar_t> > fs(99        p, std::ios_base::in | std::ios_base::out | std::ios_base::trunc);100    std::basic_string<wchar_t, operator_hijacker_char_traits<wchar_t> > x;101    fs << L"3.25";102    fs.seekg(0);103    fs >> x;104    assert(x == L"3.25");105  }106  std::remove(p.string().c_str());107 108#endif109 110  return 0;111}112