Code Monkey home page Code Monkey logo

generator's Introduction

generator

Single-header, ranges-compatible generator type built with C++20 coroutines.

Documentation Status

A generator allows implementing sequence producers which are terse and avoid creating the whole sequence in memory.

For example, if you were to need a sequence of the first n integers, you could generate a std::vector of them. This implementation would be simple, but would have to produce the whole sequence in memory. To avoid this, you could instead write an iterator or range which generates them lazily. However, writing iterators and ranges comes with a lot of boilerplate. Generators have the benefits of both:

tl::generator<int> firstn(std::size_t n) {
   for (auto i = 0; i < n; ++i) {
      co_yield i;
   }
}

You could then use this generator like so:

for (auto i : firstn(10)) {
   std::cout << i;
}

Generators can also create infinite sequences:

tl::generator<int> iota(int i = 0) {
  while(true) {
    co_yield i;
    ++i;
  }
}

You can then pipe this to a range to process it:

for (auto i : iota() | std::views::take(10)) {
   std::cout << i;
}

Compiler support

tl::generator has been tested on Visual Studio 2019 version 16.9 and GCC 10.


CC0

To the extent possible under law, Sy Brand has waived all copyright and related or neighboring rights to the optional library. This work is published from: United Kingdom.

generator's People

Contributors

loghorn avatar tartanllama avatar tchaikov avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

generator's Issues

Incompatible with Clang 13

I tried to compile with Clang 13 our project with generator...

2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(44,15): error : no type named 'suspend_always' in namespace 'std'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(45,15): error : no type named 'suspend_always' in namespace 'std'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(45,15): error : no type named 'suspend_always' in namespace 'std'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(45,15): error : no type named 'suspend_always' in namespace 'std'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(59,15): error : no type named 'suspend_always' in namespace 'std'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(59,15): error : no type named 'suspend_always' in namespace 'std'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(59,15): error : no type named 'suspend_always' in namespace 'std'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(73,35): error : no template named 'coroutine_handle' in namespace 'std'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(76,29): error : missing 'typename' prior to dependent type name 'promise_type::value_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(77,33): error : missing 'typename' prior to dependent type name 'promise_type::reference_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(78,31): error : missing 'typename' prior to dependent type name 'promise_type::pointer_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(73,35): error : no template named 'coroutine_handle' in namespace 'std'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(76,29): error : missing 'typename' prior to dependent type name 'promise_type::value_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(77,33): error : missing 'typename' prior to dependent type name 'promise_type::reference_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(78,31): error : missing 'typename' prior to dependent type name 'promise_type::pointer_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(73,35): error : no template named 'coroutine_handle' in namespace 'std'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(76,29): error : missing 'typename' prior to dependent type name 'promise_type::value_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(77,33): error : missing 'typename' prior to dependent type name 'promise_type::reference_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(78,31): error : missing 'typename' prior to dependent type name 'promise_type::pointer_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(118,19): error : unknown type name 'handle_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(118,19): error : unknown type name 'handle_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(118,19): error : unknown type name 'handle_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(120,10): error : unknown type name 'handle_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(120,10): error : unknown type name 'handle_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(120,10): error : unknown type name 'handle_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(123,32): error : no template named 'coroutine_handle' in namespace 'std'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(123,32): error : no template named 'coroutine_handle' in namespace 'std'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(123,32): error : no template named 'coroutine_handle' in namespace 'std'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(156,26): error : unknown type name 'handle_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(156,26): error : unknown type name 'handle_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(156,26): error : unknown type name 'handle_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(158,7): error : unknown type name 'handle_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(158,7): error : unknown type name 'handle_type'
2>C:\VULKAN\Alter\submodules\include\tl/generator.hpp(158,7): error : unknown type name 'handle_type'

Unable to compile with GCC 11.1

I'm unable to build this with GCC 11.1 because of the following error:

$ cmake --build .
[ 33%] Building CXX object CMakeFiles/tl-generator-catch-main.dir/catch.main.cpp.o
[ 33%] Built target tl-generator-catch-main
[ 66%] Building CXX object CMakeFiles/tl-generator-test-test.dir/tests/test.cpp.o
In file included from /home/wouter/cpp/generator/include/tl/generator.hpp:28,
                 from /home/wouter/cpp/generator/tests/test.cpp:1:
/usr/include/c++/11/ranges: In instantiation of ‘constexpr bool std::ranges::operator==(std::ranges::take_view<tl::generator<int> >::_CI<false>&, const std::ranges::take_view<tl::generator<int> >::_Sentinel<false>&)’:
/home/wouter/cpp/generator/tests/test.cpp:32:51:   required from here
/usr/include/c++/11/ranges:1775:48: error: passing ‘std::ranges::take_view<tl::generator<int> >::_CI<false>’ {aka ‘const std::counted_iterator<tl::generator<int>::iterator>’} as ‘this’ argument discards qualifiers [-fpermissive]
 1775 |           { return __y.count() == 0 || __y.base() == __x._M_end; }
      |                                        ~~~~~~~~^~
In file included from /usr/include/c++/11/iterator:63,
                 from /usr/include/c++/11/ranges:43,
                 from /home/wouter/cpp/generator/include/tl/generator.hpp:28,
                 from /home/wouter/cpp/generator/tests/test.cpp:1:
/usr/include/c++/11/bits/stl_iterator.h:2151:7: note:   in call to ‘constexpr _It std::counted_iterator<_It>::base() && [with _It = tl::generator<int>::iterator]’
 2151 |       base() &&
      |       ^~~~
make[2]: *** [CMakeFiles/tl-generator-test-test.dir/build.make:76: CMakeFiles/tl-generator-test-test.dir/tests/test.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:130: CMakeFiles/tl-generator-test-test.dir/all] Error 2
make: *** [Makefile:166: all] Error 2

Does this have something to do with constness? I cannot figure it out :-(

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.