| //===----------------------------------------------------------------------===// |
| // |
| // 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++03, c++11, c++14, c++17 |
| |
| // transform_view::<iterator>::difference_type |
| // transform_view::<iterator>::value_type |
| // transform_view::<iterator>::iterator_category |
| // transform_view::<iterator>::iterator_concept |
| |
| #include <ranges> |
| |
| #include "test_macros.h" |
| #include "../types.h" |
| |
| template<class V, class F> |
| concept HasIterCategory = requires { typename std::ranges::transform_view<V, F>::iterator_category; }; |
| |
| constexpr bool test() { |
| { |
| // Member typedefs for contiguous iterator. |
| static_assert(std::same_as<std::iterator_traits<int*>::iterator_concept, std::contiguous_iterator_tag>); |
| static_assert(std::same_as<std::iterator_traits<int*>::iterator_category, std::random_access_iterator_tag>); |
| |
| using TView = std::ranges::transform_view<MoveOnlyView, Increment>; |
| using TIter = std::ranges::iterator_t<TView>; |
| static_assert(std::same_as<typename TIter::iterator_concept, std::random_access_iterator_tag>); |
| static_assert(std::same_as<typename TIter::iterator_category, std::random_access_iterator_tag>); |
| static_assert(std::same_as<typename TIter::value_type, int>); |
| static_assert(std::same_as<typename TIter::difference_type, std::ptrdiff_t>); |
| } |
| { |
| // Member typedefs for random access iterator. |
| using TView = std::ranges::transform_view<RandomAccessView, Increment>; |
| using TIter = std::ranges::iterator_t<TView>; |
| static_assert(std::same_as<typename TIter::iterator_concept, std::random_access_iterator_tag>); |
| static_assert(std::same_as<typename TIter::iterator_category, std::random_access_iterator_tag>); |
| static_assert(std::same_as<typename TIter::value_type, int>); |
| static_assert(std::same_as<typename TIter::difference_type, std::ptrdiff_t>); |
| } |
| { |
| // Member typedefs for random access iterator, LWG3798 rvalue reference. |
| using TView = std::ranges::transform_view<RandomAccessView, IncrementRvalueRef>; |
| using TIter = std::ranges::iterator_t<TView>; |
| static_assert(std::same_as<typename TIter::iterator_concept, std::random_access_iterator_tag>); |
| static_assert(std::same_as<typename TIter::iterator_category, std::random_access_iterator_tag>); |
| static_assert(std::same_as<typename TIter::value_type, int>); |
| static_assert(std::same_as<typename TIter::difference_type, std::ptrdiff_t>); |
| } |
| { |
| // Member typedefs for random access iterator/not-lvalue-ref. |
| using TView = std::ranges::transform_view<RandomAccessView, PlusOneMutable>; |
| using TIter = std::ranges::iterator_t<TView>; |
| static_assert(std::same_as<typename TIter::iterator_concept, std::random_access_iterator_tag>); |
| static_assert(std::same_as<typename TIter::iterator_category, std::input_iterator_tag>); // Note: this is now input_iterator_tag. |
| static_assert(std::same_as<typename TIter::value_type, int>); |
| static_assert(std::same_as<typename TIter::difference_type, std::ptrdiff_t>); |
| } |
| { |
| // Member typedefs for bidirectional iterator. |
| using TView = std::ranges::transform_view<BidirectionalView, Increment>; |
| using TIter = std::ranges::iterator_t<TView>; |
| static_assert(std::same_as<typename TIter::iterator_concept, std::bidirectional_iterator_tag>); |
| static_assert(std::same_as<typename TIter::iterator_category, std::bidirectional_iterator_tag>); |
| static_assert(std::same_as<typename TIter::value_type, int>); |
| static_assert(std::same_as<typename TIter::difference_type, std::ptrdiff_t>); |
| } |
| { |
| // Member typedefs for forward iterator. |
| using TView = std::ranges::transform_view<ForwardView, Increment>; |
| using TIter = std::ranges::iterator_t<TView>; |
| static_assert(std::same_as<typename TIter::iterator_concept, std::forward_iterator_tag>); |
| static_assert(std::same_as<typename TIter::iterator_category, std::forward_iterator_tag>); |
| static_assert(std::same_as<typename TIter::value_type, int>); |
| static_assert(std::same_as<typename TIter::difference_type, std::ptrdiff_t>); |
| } |
| { |
| // Member typedefs for input iterator. |
| using TView = std::ranges::transform_view<InputView, Increment>; |
| using TIter = std::ranges::iterator_t<TView>; |
| static_assert(std::same_as<typename TIter::iterator_concept, std::input_iterator_tag>); |
| static_assert(!HasIterCategory<InputView, Increment>); |
| static_assert(std::same_as<typename TIter::value_type, int>); |
| static_assert(std::same_as<typename TIter::difference_type, std::ptrdiff_t>); |
| } |
| |
| return true; |
| } |
| |
| int main(int, char**) { |
| test(); |
| static_assert(test()); |
| |
| return 0; |
| } |