forked from boostorg/iterator
		
	
		
			
	
	
		
			100 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			100 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | 
 | ||
|  | [section:function_output Function Output Iterator] | ||
|  | 
 | ||
|  | The function output iterator adaptor makes it easier to create custom | ||
|  | output iterators. The adaptor takes a unary function and creates a | ||
|  | model of Output Iterator. Each item assigned to the output iterator is | ||
|  | passed as an argument to the unary function.  The motivation for this | ||
|  | iterator is that creating a conforming output iterator is non-trivial, | ||
|  | particularly because the proper implementation usually requires a | ||
|  | proxy object. | ||
|  | 
 | ||
|  | [h2 Example] | ||
|  | 
 | ||
|  |     struct string_appender | ||
|  |     { | ||
|  |         string_appender(std::string& s) | ||
|  |             : m_str(&s) | ||
|  |         {} | ||
|  | 
 | ||
|  |         void operator()(const std::string& x) const | ||
|  |         { | ||
|  |             *m_str += x; | ||
|  |         } | ||
|  | 
 | ||
|  |         std::string* m_str; | ||
|  |     }; | ||
|  | 
 | ||
|  |     int main(int, char*[]) | ||
|  |     { | ||
|  |       std::vector<std::string> x; | ||
|  |       x.push_back("hello"); | ||
|  |       x.push_back(" "); | ||
|  |       x.push_back("world"); | ||
|  |       x.push_back("!"); | ||
|  | 
 | ||
|  |       std::string s = ""; | ||
|  |       std::copy(x.begin(), x.end(),  | ||
|  | 		boost::make_function_output_iterator(string_appender(s))); | ||
|  | 
 | ||
|  |       std::cout << s << std::endl; | ||
|  | 
 | ||
|  |       return 0; | ||
|  |     } | ||
|  | 
 | ||
|  | [h2 Reference] | ||
|  | 
 | ||
|  | [h3 Synopsis] | ||
|  | 
 | ||
|  |   template <class UnaryFunction> | ||
|  |   class function_output_iterator { | ||
|  |   public: | ||
|  |     typedef std::output_iterator_tag iterator_category; | ||
|  |     typedef void                     value_type; | ||
|  |     typedef void                     difference_type; | ||
|  |     typedef void                     pointer; | ||
|  |     typedef void                     reference; | ||
|  | 
 | ||
|  |     explicit function_output_iterator(); | ||
|  | 
 | ||
|  |     explicit function_output_iterator(const UnaryFunction& f); | ||
|  | 
 | ||
|  |     /* see below */ operator*(); | ||
|  |     function_output_iterator& operator++(); | ||
|  |     function_output_iterator& operator++(int); | ||
|  |   private: | ||
|  |     UnaryFunction m_f;     // exposition only | ||
|  |   }; | ||
|  | 
 | ||
|  | [h3 Requirements] | ||
|  | 
 | ||
|  | `UnaryFunction` must be Assignable and Copy Constructible.   | ||
|  | 
 | ||
|  | [h3 Concepts] | ||
|  | 
 | ||
|  | `function_output_iterator` is a model of the Writable and | ||
|  | Incrementable Iterator concepts. | ||
|  | 
 | ||
|  | [h3 Operations] | ||
|  | 
 | ||
|  |   explicit function_output_iterator(const UnaryFunction& f = UnaryFunction()); | ||
|  | 
 | ||
|  | [*Effects: ] Constructs an instance of `function_output_iterator`  | ||
|  |   with `m_f` constructed from `f`. | ||
|  | 
 | ||
|  |   unspecified_type operator*(); | ||
|  | 
 | ||
|  | [*Returns: ] An object `r` of unspecified type such that `r = t` | ||
|  |   is equivalent to `m_f(t)` for all `t`. | ||
|  |    | ||
|  | 
 | ||
|  |   function_output_iterator& operator++(); | ||
|  | 
 | ||
|  | [*Returns: ] `*this`. | ||
|  | 
 | ||
|  | 
 | ||
|  |   function_output_iterator& operator++(int); | ||
|  | 
 | ||
|  | [*Returns: ] `*this`. | ||
|  | 
 | ||
|  | [endsect] |