//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03 // // class path // template // path(const Source& source); // template // path(InputIterator first, InputIterator last); #include #include #include #include "test_macros.h" #include "test_iterators.h" #include "min_allocator.h" #include "filesystem_test_helper.hpp" namespace fs = std::experimental::filesystem; template void RunTestCase(MultiStringType const& MS) { using namespace fs; const char* Expect = MS; const CharT* TestPath = MS; const CharT* TestPathEnd = StrEnd(TestPath); const std::size_t Size = TestPathEnd - TestPath; const std::size_t SSize = StrEnd(Expect) - Expect; assert(Size == SSize); // StringTypes { const std::basic_string S(TestPath); path p(S); assert(p.native() == Expect); assert(p.string() == TestPath); assert(p.string() == S); } { const std::basic_string_view S(TestPath); path p(S); assert(p.native() == Expect); assert(p.string() == TestPath); assert(p.string() == S); } // Char* pointers { path p(TestPath); assert(p.native() == Expect); assert(p.string() == TestPath); } { path p(TestPath, TestPathEnd); assert(p.native() == Expect); assert(p.string() == TestPath); } // Iterators { using It = input_iterator; path p(It{TestPath}); assert(p.native() == Expect); assert(p.string() == TestPath); } { using It = input_iterator; path p(It{TestPath}, It{TestPathEnd}); assert(p.native() == Expect); assert(p.string() == TestPath); } } void test_sfinae() { using namespace fs; { using It = const char* const; static_assert(std::is_constructible::value, ""); } { using It = input_iterator; static_assert(std::is_constructible::value, ""); } { struct Traits { using iterator_category = std::input_iterator_tag; using value_type = const char; using pointer = const char*; using reference = const char&; using difference_type = std::ptrdiff_t; }; using It = input_iterator; static_assert(std::is_constructible::value, ""); } { using It = output_iterator; static_assert(!std::is_constructible::value, ""); } { static_assert(!std::is_constructible::value, ""); } } int main() { for (auto const& MS : PathList) { RunTestCase(MS); RunTestCase(MS); RunTestCase(MS); RunTestCase(MS); } test_sfinae(); }