Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::generator(3)	      C++ Standard Libary	     std::generator(3)

NAME
       std::generator -	std::generator

Synopsis
	  Defined in header <generator>
	  template<

	      class Ref,
	      class		     V		       =		 void,
       (1) (since C++23)
	      class Allocator =	void >
	  class	generator

	      :	public ranges::view_interface<generator<Ref, V,	Allocator>>
	  namespace pmr	{

	      template<	class Ref, class V = void >
	      using			   generator			     =
       (2) (since C++23)
		  std::generator<Ref, V, std::pmr::polymorphic_allocator<>>;

	  }

	  1) The class template	std::generator presents	a view of the elements
       yielded by the
	  evaluation of	a coroutine.
	  2)  Convenience  alias template for the generator using the polymor-
       phic allocator.

	  A std::generator generates a sequence	of elements by repeatedly  re-
       suming the
	  coroutine from which it was returned.	Each time a co_yield statement
       is evaluated,
	  the  coroutine  produces  one	 element  of  the  sequence.  When the
       co_yield	statement is
	  of the form co_yield ranges::elements_of(rng), each element  of  the
       range rng is
	  successively produced	as an element of the sequence.

	  std::generator models	view and input_range.

	  The behavior of a program that adds a	specialization for std::gener-
       ator is
	  undefined.

Template parameters
	  Ref	     -	the  reference type (ranges::range_reference_t)	of the
       generator. If V is
		      void, both the reference type and	the value type are in-
       ferred from Ref
	  V	    - the value	type (range_value_t) of	the generator, or void
	  Allocator - an allocator type	or void

	  If Allocator is not void, then the behavior is undefined if  Alloca-
       tor does	not meet
	  the Allocator	requirements.

Member types
	  Member type	   Definition
			   std::conditional_t<std::is_void_v<V>,      std::re-
       move_cvref_t<Ref>,
	  value	(private)  V>;.
			   (exposition-only member type*)
	  reference	   std::conditional_t<std::is_void_v<V>, Ref&&,	Ref>;.
	  (private)	   (exposition-only member type*)
	  yielded	    std::conditional_t<std::is_reference_v<reference>,
       reference, const
			   reference&>.

Type requirements
	  -
	  std::allocator_traits<Allocator>::pointer is a pointer type.
	  -
	  value	is a cv-unqualified object type.
	  -
	  reference  is	 either	 a  reference type, or a cv-unqualified	object
       type that models
	  copy_constructible.
	  -
	  Let  /*RRef*/	 denote:std::remove_reference_t</*reference*/>&&,   if
       /*reference*/ is	a
	  reference type, and /*reference*/ otherwise.
	    *  std::common_reference_with</*reference*/&&, /*value*/&> is mod-
       eled.
	    * std::common_reference_with</*reference*/&&, /*RRef*/&&> is  mod-
       eled.
	    * std::common_reference_with</*RRef*/&&, const /*value*/&> is mod-
       eled.

	  The  program	is ill-formed if any of	these type requirements	is not
       satisfied.

Member objects
	  Member name  Definition
		       Internally, each	active instance	of  std::generator  is
       associated with a
		       stack (handled as if by object of type
		       std::unique_ptr<std::stack<std::coroutine_handle<>>>).

			 *  When  begin	 is called, a new stack	is created and
       the generator is
			   added to the	stack.
	  active_	 * When	co_yield ranges::elements_of(rng) is evaluated
       in a generator
	  (private)	   body, rng is	converted to a generator and added  to
       the stack that
			   contains the	enclosing generator.
			 *  When  a  generator	iterator  is  incremented, the
       coroutine at the	top
			   of the associated stack is resumed.
			 * When	a generator finishes (i.e. when	 final_suspend
       is called), it
			   is removed from the stack.
			   (exposition-only member object*)
	  coroutine_   a handle	of type	std::coroutine_handle<promise_type>
	  (private)    (exposition-only	member object*)

Member functions
	  constructor	constructs a generator object
			(public	member function)
	  destructor	 effectively destroys the entire stack of yielded gen-
       erators
			(public	member function)
	  operator=	assigns	a generator object
			(public	member function)
			resumes	the initially suspended	coroutine and  returns
       an iterator to
	  begin		its handle
			(public	member function)
	  end		returns	std::default_sentinel
			(public	member function)
		Inherited from std::ranges::view_interface
	  empty		returns	whether	the derived view is empty. Provided if
       it satisfies
	  (C++20)	sized_range or forward_range.
			(public	 member	 function  of std::ranges::view_inter-
       face<D>)
	  cbegin	returns	a constant iterator to the  beginning  of  the
       range.
	  (C++23)	 (public  member  function of std::ranges::view_inter-
       face<D>)
	  cend		returns	a sentinel for the constant  iterator  of  the
       range.
	  (C++23)	 (public  member  function of std::ranges::view_inter-
       face<D>)
	  operator bool	returns	whether	the derived view is  not  empty.  Pro-
       vided if
	  (C++20)	ranges::empty is applicable to it.
			(public	 member	 function  of std::ranges::view_inter-
       face<D>)

	  Nested classes

	  promise_type the promise type
		       (public member class)
	  iterator     the iterator type
		       (exposition-only	member class*)

Notes
	  Feature-test macro   Value	Std			  Feature
	  __cpp_lib_generator  202207L	(C++23)	 std::generator	   synchronous
       coroutine generator
					      for ranges

Example
	  Can be tried in Compiler Explorer

       // Run this code

	#include <generator>
	#include <iostream>

	template<typename T>
	struct Tree
	{
	    T value;
	    Tree *left{}, *right{};

	    std::generator<const T&> traverse_inorder()	const
	    {
		if (left)
		    for	(const T& x : left->traverse_inorder())
			co_yield x;

		co_yield value;
		if (right)
		    for	(const T& x : right->traverse_inorder())
			co_yield x;
	    }
	};

	int main()
	{
	    Tree<char> tree[]
	    {
					    {'D', tree + 1, tree + 2},
		//
		//
		//
			    {'B',  tree	 + 3, tree + 4},       {'F', tree + 5,
       tree + 6},
		//
		//
		//
		  {'A'},			     {'C'},		{'E'},
       {'G'}
	    };

	    for	(char x	: tree->traverse_inorder())
		std::cout << x << ' ';
	    std::cout << '\n';
	}

Output:
	A B C D	E F G

References
	    * C++23 standard (ISO/IEC 14882:2023):

	    * 26.8 Range generators [coro.generator]

See also
	  noop_coroutine creates a coroutine handle that has no	observable ef-
       fects when
	  (C++20)	 resumed or destroyed
			 (function)

http://cppreference.com		  2024.06.10		     std::generator(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::generator&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help