Skip to content

Commit

Permalink
input_or_output_iteratorに対応
Browse files Browse the repository at this point in the history
  • Loading branch information
acd1034 committed Sep 17, 2022
1 parent 9caa507 commit 0205c08
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 0 deletions.
14 changes: 14 additions & 0 deletions include/ns/enumerate_view.hpp
Expand Up @@ -31,8 +31,22 @@ namespace ns {
std::size_t count_ = 0;

public:
using difference_type = std::ranges::range_difference_t<View>;

constexpr iterator(std::ranges::iterator_t<View> current, std::size_t count)
: current_(std::move(current)), count_(std::move(count)) {}

constexpr std::pair<std::size_t, std::ranges::range_reference_t<View>> //
operator*() const {
return {count_, *current_};
}

constexpr iterator& operator++() {
++current_;
++count_;
return *this;
}
constexpr void operator++(int) { ++*this; }
};

template <std::ranges::input_range View>
Expand Down
47 changes: 47 additions & 0 deletions tests/enumerate_view/enumerate_view.cpp
@@ -1,3 +1,50 @@
#include <catch2/catch_test_macros.hpp>
#include <ns/enumerate_view.hpp>

// begin test 用の view

template <class T>
struct test_input_iterator {
private:
T* ptr_ = nullptr;

public:
using difference_type = std::ptrdiff_t;
using value_type = std::remove_cv_t<T>;
using iterator_concept = std::input_iterator_tag;
test_input_iterator() = default;
constexpr explicit test_input_iterator(T* ptr) : ptr_(std::move(ptr)) {}
constexpr decltype(auto) operator*() const { return *ptr_; }
constexpr test_input_iterator& operator++() {
++ptr_;
return *this;
}
constexpr void operator++(int) { ++ptr_; }
constexpr bool operator==(const test_input_iterator& other) const { return ptr_ == other.ptr_; }
};

template <class T>
struct test_view : std::ranges::view_base {
private:
T value{};

public:
test_view() = default;
constexpr explicit test_view(T v) : value(std::move(v)) {}
auto begin() { return test_input_iterator<T>(std::addressof(value)); }
auto begin() const { return test_input_iterator<const T>(std::addressof(value)); }
auto end() { return test_input_iterator<T>(std::addressof(value) + 1); }
auto end() const { return test_input_iterator<const T>(std::addressof(value) + 1); }
};

static_assert(std::ranges::view<test_view<int>>);
static_assert(std::ranges::input_range<test_view<int>>);
static_assert(not std::ranges::forward_range<test_view<int>>);

// end test 用の view

using testing_view = ns::enumerate_view<test_view<int>>;
// まだ動かない
// static_assert(std::input_or_output_iterator<std::ranges::iterator_t<testing_view>>);

// TEST_CASE("enumerate_view", "[enumerate_view]") {}

0 comments on commit 0205c08

Please sign in to comment.