//===----------------------------------------------------------------------===// // // 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 // // class path // template // path(const Source& source); // template // path(InputIterator first, InputIterator last); #include "filesystem_include.h" #include #include #include #include "test_macros.h" #include "filesystem_test_helper.h" template std::reverse_iterator mkRev(It it) { return std::reverse_iterator(it); } void checkIteratorConcepts() { using namespace fs; using It = path::iterator; using Traits = std::iterator_traits; ASSERT_SAME_TYPE(Traits::iterator_category, std::bidirectional_iterator_tag); ASSERT_SAME_TYPE(Traits::value_type, path); ASSERT_SAME_TYPE(Traits::pointer, path const*); ASSERT_SAME_TYPE(Traits::reference, path const&); { It it; ASSERT_SAME_TYPE(It&, decltype(++it)); ASSERT_SAME_TYPE(It, decltype(it++)); ASSERT_SAME_TYPE(It&, decltype(--it)); ASSERT_SAME_TYPE(It, decltype(it--)); ASSERT_SAME_TYPE(Traits::reference, decltype(*it)); ASSERT_SAME_TYPE(Traits::pointer, decltype(it.operator->())); ASSERT_SAME_TYPE(std::string const&, decltype(it->native())); ASSERT_SAME_TYPE(bool, decltype(it == it)); ASSERT_SAME_TYPE(bool, decltype(it != it)); } { path const p; ASSERT_SAME_TYPE(It, decltype(p.begin())); ASSERT_SAME_TYPE(It, decltype(p.end())); assert(p.begin() == p.end()); } } void checkBeginEndBasic() { using namespace fs; using It = path::iterator; { path const p; ASSERT_SAME_TYPE(It, decltype(p.begin())); ASSERT_SAME_TYPE(It, decltype(p.end())); assert(p.begin() == p.end()); } { path const p("foo"); It default_constructed; default_constructed = p.begin(); assert(default_constructed == p.begin()); assert(default_constructed != p.end()); default_constructed = p.end(); assert(default_constructed == p.end()); assert(default_constructed != p.begin()); } { path p("//root_name//first_dir////second_dir"); const path expect[] = {"/", "root_name", "first_dir", "second_dir"}; assert(checkCollectionsEqual(p.begin(), p.end(), std::begin(expect), std::end(expect))); assert(checkCollectionsEqualBackwards(p.begin(), p.end(), std::begin(expect), std::end(expect))); } { path p("////foo/bar/baz///"); const path expect[] = {"/", "foo", "bar", "baz", ""}; assert(checkCollectionsEqual(p.begin(), p.end(), std::begin(expect), std::end(expect))); assert(checkCollectionsEqualBackwards(p.begin(), p.end(), std::begin(expect), std::end(expect))); } } int main(int, char**) { using namespace fs; checkIteratorConcepts(); checkBeginEndBasic(); // See path.decompose.pass.cpp for more tests. return 0; }