File: recursivegenerator.imp

package info (click to toggle)
c%2B%2B-annotations 12.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 13,044 kB
  • sloc: cpp: 24,337; makefile: 1,517; ansic: 165; sh: 121; perl: 90
file content (80 lines) | stat: -rw-r--r-- 1,722 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
template<typename T>
RecursiveGenerator<T>::RecursiveGenerator(Promise& promise) noexcept
: 
    d_promise(&promise)
{}

template<typename T>
RecursiveGenerator<T>:: RecursiveGenerator(RecursiveGenerator&& tmp) noexcept
: 
    d_promise(tmp.d_promise)
{
    tmp.d_promise = 0;
}

template<typename T>
RecursiveGenerator<T>::~RecursiveGenerator()
{
    if (d_promise != nullptr)
        d_promise->destroy();
}

template<typename T>
RecursiveGenerator<T> &RecursiveGenerator<T>::RecursiveGenerator::operator=(
                                            RecursiveGenerator &&tmp) noexcept 
{
    if (this != &tmp)
    {
        if (d_promise != 0)
            d_promise->destroy();

        d_promise = tmp.d_promise;
        tmp.d_promise = 0;
    }

    return *this;
}


template <typename T>
RecGenIterator<T, typename RecursiveGenerator<T>::Promise> 
RecursiveGenerator<T>::begin()
{
    if (d_promise != nullptr)
    {
        d_promise->pull();

        if (!d_promise->is_complete())
            return RecGenIterator<T, Promise>{ d_promise };

        d_promise->throw_if_exception();
    }

    return { };
}

template<typename T>
inline RecGenIterator<T, typename RecursiveGenerator<T>::Promise> 
RecursiveGenerator<T>::end() noexcept
{
    return { };
}

template<typename T>
inline void RecursiveGenerator<T>::swap(RecursiveGenerator &other) noexcept
{
    std::swap(d_promise, other.d_promise);
}


template<typename FUNC, typename T>
Generator<
    std::invoke_result_t<
        FUNC &, typename RecursiveGenerator<T>::RecGenIterator::reference
    >
> fmap(FUNC func, RecursiveGenerator<T> source)
{
    for (auto &&value: source)
        co_yield std::invoke(func, static_cast<decltype(value)>(value));
}