void checkIteratorConcepts() { using namespace fs; using It = path::iterator; using Traits = std::iterator_traits<It>; 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()); } }