1#ifndef HALCHECK_LIB_ITERATOR_GENERATE_HPP
2#define HALCHECK_LIB_ITERATOR_GENERATE_HPP
6#include <halcheck/lib/functional.hpp>
7#include <halcheck/lib/iterator/interface.hpp>
8#include <halcheck/lib/optional.hpp>
9#include <halcheck/lib/type_traits.hpp>
14namespace halcheck {
namespace lib {
21class generate_iterator :
public lib::iterator_interface<generate_iterator<F>> {
23 using lib::iterator_interface<generate_iterator>::operator++;
26 using reference =
const value_type &;
31 constexpr generate_iterator() =
default;
33 explicit generate_iterator(F func) : _func(
std::move(func)) { ++(*this); }
35 constexpr reference &operator*() const noexcept {
return *_value; }
37 generate_iterator &operator++() {
39 _value.emplace(std::move(*value));
46 friend bool operator==(
const generate_iterator &lhs,
const generate_iterator &rhs) {
47 return !lhs._value && !rhs._value;
50 lib::optional<F> _func;
51 lib::optional<value_type> _value;
55lib::generate_iterator<F> make_generate_iterator(F func) {
56 return lib::generate_iterator<F>(std::move(func));
HALCHECK_INLINE_CONSTEXPR struct halcheck::lib::@20 invoke
An implementation of std::invoke.
decltype(lib::invoke(std::declval< F >(), std::declval< Args >()...)) invoke_result_t
An implementation of std::invoke_result_t.
Definition invoke.hpp:42
typename std::decay< T >::type decay_t
An implementation of std::decay_t.
Definition type_traits.hpp:101
#define HALCHECK_REQUIRE(...)
Expands to a template argument that is only valid if the given argument evaluates to true.
Definition type_traits.hpp:24