wibble  1.1
consumer.h
Go to the documentation of this file.
1 
6 #include <iterator>
7 
8 #include <wibble/amorph.h>
9 #include <wibble/range.h>
10 #include <wibble/cast.h>
11 
12 #ifndef WIBBLE_CONSUMER_H
13 #define WIBBLE_CONSUMER_H
14 
15 namespace wibble {
16 
17 template< typename T > struct Consumer;
18 
19 template< typename T >
21 {
22  typedef T InputType;
23  virtual void consume( const T &a ) = 0;
24  virtual void consume( Range< T > s ) = 0;
25  virtual ~ConsumerInterface() {}
26 };
27 
28 template< typename T, typename W >
29 struct ConsumerMorph : Morph< ConsumerMorph< T, W >, W, ConsumerInterface< T > >
30 {
32  ConsumerMorph( const W &w ) : Morph< ConsumerMorph, W, ConsumerInterface< T > >( w ) {}
33 
34  virtual void consume( const T &a ) {
35  return this->wrapped().consume( a );
36  }
37 
38  virtual void consume( Range< T > s ) {
39  while ( !s.empty() ) {
40  consume( s.head() );
41  s = s.tail();
42  }
43  }
44 };
45 
46 template< typename T, typename Self >
48 {
49  Self &self() { return *static_cast< Self * >( this ); }
50  const Self &self() const { return *static_cast< const Self * >( this ); }
51  typedef std::output_iterator_tag iterator_category;
52  typedef T ConsumedType;
53 
54  bool operator<=( const Self &o ) const { return this <= &o; }
55  Consumer< T > &operator++() { return self(); }
56  Consumer< T > &operator++(int) { return self(); }
57  Consumer< T > &operator*() { return self(); }
58  Consumer< T > &operator=( const T &a ) {
59  self()->consume( a );
60  return self();
61  }
62 };
63 
64 template< typename T >
65 struct Consumer: Amorph< Consumer< T >, ConsumerInterface< T > >,
66  ConsumerMixin< T, Consumer< T > >
67 {
69 
70  typedef void value_type;
71  typedef void difference_type;
72  typedef void pointer;
73  typedef void reference;
74 
76  Consumer() {}
77 
78  void consume( const T &a ) {
79  return this->implementation()->consume( a );
80  }
81 
82  Consumer< T > &operator=( const T &a ) {
83  consume( a );
84  return *this;
85  }
86  // output iterator - can't read or move
87 };
88 
89 template< typename T, typename Out >
90 struct ConsumerFromIterator : ConsumerMixin< T, ConsumerFromIterator< T, Out > >
91 {
92  ConsumerFromIterator( Out out ) : m_out( out ) {}
93  void consume( const T& a ) {
94  *(*m_out) = a;
95  ++(*m_out);
96  }
97 protected:
98  Out m_out;
99 };
100 
101 template< typename R >
104 }
105 
106 // insert iterators
107 template< typename Out >
109  return consumerMorph(
111 }
112 
113 // containers
114 template< typename T >
116  return consumer( std::inserter( c, c.end() ) );
117 }
118 
119 // consumers
120 template< typename T >
122  return t;
123 }
124 
125 }
126 
127 #endif
wibble::iterator
Iterator< typename I::value_type > iterator(I i)
Definition: iterator.h:123
wibble::ConsumerMorph
Definition: consumer.h:29
wibble::commandline::SingleOption
Definition: options.h:161
wibble::Consumer::value_type
void value_type
Definition: consumer.h:70
wibble::ConsumerMixin::iterator_category
std::output_iterator_tag iterator_category
Definition: consumer.h:51
cast.h
withCommands
int withCommands(int argc, const char *argv[])
Definition: commandline-demo.cpp:7
wibble::commandline::Engine::name
const std::string & name() const
Definition: engine.h:107
wibble::MorphInterface
An interface implemented by all morph classes.
Definition: amorph.h:91
wibble::ConsumerMixin::operator++
Consumer< T > & operator++()
Definition: consumer.h:55
wibble::ConsumerMixin::ConsumedType
T ConsumedType
Definition: consumer.h:52
wibble::Consumer::Consumer
Consumer()
Definition: consumer.h:76
wibble::commandline::StandardParser::outputHelp
void outputHelp(std::ostream &out)
Definition: parser.cpp:10
wibble::Range
Definition: range.h:20
wibble::commandline::StandardParser::version
BoolOption * version
Definition: parser.h:80
wibble::ConsumerFromIterator::m_out
Out m_out
Definition: consumer.h:98
main
int main(int argc, const char *argv[])
Definition: commandline-demo.cpp:80
wibble::consumerMorph
Consumer< typename R::ConsumedType > consumerMorph(R r)
Definition: consumer.h:102
wibble::ConsumerMorph::consume
virtual void consume(Range< T > s)
Definition: consumer.h:38
wibble::commandline::Engine::add
void add(const std::string &alias, Engine *o)
Definition: engine.cpp:39
wibble::ConsumerInterface::~ConsumerInterface
virtual ~ConsumerInterface()
Definition: consumer.h:25
wibble::ConsumerMorph::ConsumerMorph
ConsumerMorph(const W &w)
Definition: consumer.h:32
wibble::IsType
Definition: cast.h:25
wibble::consumer
Consumer< typename Out::container_type::value_type > consumer(Out out)
Definition: consumer.h:108
wibble::commandline::Engine::longDescription
std::string longDescription
Definition: engine.h:224
wibble::Consumer
Definition: consumer.h:17
wibble::ConsumerFromIterator::consume
void consume(const T &a)
Definition: consumer.h:93
wibble::commandline::StandardParserWithMandatoryCommand
Parser for commandline arguments, with builting help functions and manpage generation,...
Definition: parser.h:115
wibble::mixin::Comparable
Definition: mixin.h:13
wibble::commandline::Engine::usage
std::string usage
Definition: engine.h:222
wibble::commandline::StandardParserWithMandatoryCommand::parse
bool parse(int argc, const char *argv[])
Definition: parser.cpp:61
wibble::Range::head
T head() const
Definition: range.h:163
tut
Template Unit Tests Framework for C++.
Definition: tut-main.cpp:6
main
int main(int argc, char **argv)
Definition: test-main.h:257
wibble::commandline
Definition: core.cpp:6
wibble::Amorph
Definition: amorph.h:272
wibble::ConsumerMixin::operator=
Consumer< T > & operator=(const T &a)
Definition: consumer.h:58
wibble::ConsumerInterface
Definition: consumer.h:20
wibble::Morph< ConsumerMorph< T, W >, W, ConsumerInterface< T > >::wrapped
const Wrapped & wrapped() const
Definition: amorph.h:181
wibble::commandline::StandardParser::help
BoolOption * help
Definition: parser.h:79
wibble::exception::BadOption
Definition: core.h:12
range.h
-*- C++ -*-
wibble::commandline::OptionGroup::add
Option * add(Option *o)
Definition: options.h:368
wibble::commandline::Engine::addEngine
Engine * addEngine(const std::string &name, const std::string &usage=std::string(), const std::string &description=std::string(), const std::string &longDescription=std::string())
Create a Engine and add it to this engine as a command.
Definition: engine.h:182
wibble::commandline::Engine
Parse commandline options.
Definition: engine.h:38
wibble::ConsumerMorph::ConsumerMorph
ConsumerMorph()
Definition: consumer.h:31
wibble::commandline::OptionGroup
Group related commandline options.
Definition: options.h:359
wibble::ConsumerMixin::operator++
Consumer< T > & operator++(int)
Definition: consumer.h:56
wibble::ConsumerMixin::operator<=
bool operator<=(const Self &o) const
Definition: consumer.h:54
wibble::ConsumerInterface::InputType
T InputType
Definition: consumer.h:22
wibble::Consumer::consume
void consume(const T &a)
Definition: consumer.h:78
wibble::exception::Generic::type
virtual const char * type() const
Get a string tag identifying the exception type.
Definition: exception.h:190
wibble::ConsumerFromIterator::ConsumerFromIterator
ConsumerFromIterator(Out out)
Definition: consumer.h:92
wibble::exception::Generic::fullInfo
virtual const std::string & fullInfo() const
Format in a string all available information about the exception.
Definition: exception.h:205
wibble::commandline::BoolOption::boolValue
bool boolValue() const
Definition: options.h:153
wibble::exception::Generic
Base class for all exceptions.
Definition: exception.h:179
amorph.h
-*- C++ -*-
wibble::ConsumerMixin::operator*
Consumer< T > & operator*()
Definition: consumer.h:57
wibble::Consumer::reference
void reference
Definition: consumer.h:73
wibble::commandline::Engine::description
std::string description
Definition: engine.h:223
wibble::ConsumerFromIterator
Definition: consumer.h:90
parser.h
wibble::commandline::BoolOption
Boolean option.
Definition: options.h:134
wibble::commandline::StandardParserWithManpage::manpage
StringOption * manpage
Definition: parser.h:108
wibble::Consumer::pointer
void pointer
Definition: consumer.h:72
wibble::ConsumerMorph::consume
virtual void consume(const T &a)
Definition: consumer.h:34
wibble
Definition: amorph.h:17
wibble::Consumer::Consumer
Consumer(const MorphInterface< ConsumerInterface< T > > &i)
Definition: consumer.h:75
wibble::ConsumerInterface::consume
virtual void consume(const T &a)=0
wibble::commandline::SingleOption::boolValue
bool boolValue() const
Definition: options.h:210
wibble::ConsumerMixin
Definition: consumer.h:47
file
file(GLOB TEST_SOURCES test_ *.cpp) ADD_CUSTOM_TARGET(check COMMAND make libwibble-test &&$
Definition: tests/CMakeLists.txt:3
project
project(wibble) include(test.cmake) include(CheckCXXSourceCompiles) check_cxx_source_compiles(" int main()
Definition: CMakeLists.txt:1
wibble::Consumer::difference_type
void difference_type
Definition: consumer.h:71
usage
void usage(ostream &out, const string &argv0)
Definition: commandline-demo.cpp:75
wibble::Consumer::operator=
Consumer< T > & operator=(const T &a)
Definition: consumer.h:82
wibble::Morph
Definition: amorph.h:141
wibble::Consumer::Super
Amorph< Consumer< T >, ConsumerInterface< T > > Super
Definition: consumer.h:68
wibble::commandline::Engine::foundCommand
Engine * foundCommand() const
Return the command that has been found in the commandline, or NULL if none have been found.
Definition: engine.h:215