Fix counter postfix++ bug

This commit is contained in:
Eric Mertens 2023-12-04 17:28:16 -08:00
parent f9215e1b63
commit ceab9a14cc

View File

@ -6,25 +6,45 @@
template <typename T>
struct Counter
{
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = T*;
using reference = T&;
using iterator_category = std::output_iterator_tag;
struct EmptyRef {
auto operator=(T const&) const -> void { }
auto operator=(T const&) const -> void {}
auto operator=(T && ) const -> void {}
};
std::size_t n;
auto operator++() -> Counter& { n++; return *this; }
auto operator++(int) -> Counter { Counter temp; n++; return temp; }
auto operator*() const -> EmptyRef { return EmptyRef{}; }
auto operator-(Counter const& rhs) const -> std::ptrdiff_t {
return std::ptrdiff_t{n} - std::ptrdiff_t{rhs.n};
Counter() : n{0} {}
Counter(std::size_t n) : n{n} {}
auto operator++() -> Counter&
{
n++;
return *this;
}
auto operator++(int) -> Counter
{
auto temp = *this;
n++;
return temp;
}
auto operator*() const -> EmptyRef
{
return {};
}
auto operator-(Counter rhs) const -> difference_type
{
return difference_type{n} - difference_type{rhs};
}
operator std::size_t() const
{
return n;
}
operator std::size_t() const { return n; }
};
static_assert(std::output_iterator<Counter<int>, int>);