123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- //===----------------------------------------------------------------------===//
- //
- // 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
- //
- //===----------------------------------------------------------------------===//
- // UNSUPPORTED: c++98, c++03
- // <filesystem>
- // class path
- // template <class charT, class traits>
- // basic_ostream<charT, traits>&
- // operator<<(basic_ostream<charT, traits>& os, const path& p);
- //
- // template <class charT, class traits>
- // basic_istream<charT, traits>&
- // operator>>(basic_istream<charT, traits>& is, path& p)
- //
- #include "filesystem_include.hpp"
- #include <type_traits>
- #include <sstream>
- #include <cassert>
- #include <iostream>
- #include "test_macros.h"
- #include "test_iterators.h"
- #include "count_new.hpp"
- #include "filesystem_test_helper.hpp"
- MultiStringType InStr = MKSTR("abcdefg/\"hijklmnop\"/qrstuvwxyz/123456789");
- MultiStringType OutStr = MKSTR("\"abcdefg/\\\"hijklmnop\\\"/qrstuvwxyz/123456789\"");
- template <class CharT>
- void doIOTest() {
- using namespace fs;
- using Ptr = const CharT*;
- using StrStream = std::basic_stringstream<CharT>;
- const Ptr E = OutStr;
- const path p((const char*)InStr);
- StrStream ss;
- { // test output
- auto& ret = (ss << p);
- assert(ss.str() == E);
- assert(&ret == &ss);
- }
- { // test input
- path p_in;
- auto& ret = ss >> p_in;
- assert(p_in.native() == (const char*)InStr);
- assert(&ret == &ss);
- }
- }
- namespace impl {
- using namespace fs;
- template <class Stream, class Tp, class = decltype(std::declval<Stream&>() << std::declval<Tp&>())>
- std::true_type is_ostreamable_imp(int);
- template <class Stream, class Tp>
- std::false_type is_ostreamable_imp(long);
- template <class Stream, class Tp, class = decltype(std::declval<Stream&>() >> std::declval<Tp&>())>
- std::true_type is_istreamable_imp(int);
- template <class Stream, class Tp>
- std::false_type is_istreamable_imp(long);
- } // namespace impl
- template <class Stream, class Tp>
- struct is_ostreamable : decltype(impl::is_ostreamable_imp<Stream, Tp>(0)) {};
- template <class Stream, class Tp>
- struct is_istreamable : decltype(impl::is_istreamable_imp<Stream, Tp>(0)) {};
- void test_LWG2989() {
- static_assert(!is_ostreamable<decltype(std::cout), std::wstring>::value, "");
- static_assert(!is_ostreamable<decltype(std::wcout), std::string>::value, "");
- static_assert(!is_istreamable<decltype(std::cin), std::wstring>::value, "");
- static_assert(!is_istreamable<decltype(std::wcin), std::string>::value, "");
- }
- int main(int, char**) {
- doIOTest<char>();
- doIOTest<wchar_t>();
- //doIOTest<char16_t>();
- //doIOTest<char32_t>();
- test_LWG2989();
- return 0;
- }
|