use a counter
This commit is contained in:
30
lib/include/aocpp/Counter.hpp
Normal file
30
lib/include/aocpp/Counter.hpp
Normal file
@@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <iterator>
|
||||
|
||||
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 { }
|
||||
};
|
||||
|
||||
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};
|
||||
}
|
||||
operator std::size_t() const { return n; }
|
||||
};
|
||||
|
||||
static_assert(std::output_iterator<Counter<int>, int>);
|
Reference in New Issue
Block a user