Dv::Util::Dispatcher< Application, Input, Value > Class Template Reference

A class template framework to dispatch control based on some value. More...

#include <dispatch.h>

Collaboration diagram for Dv::Util::Dispatcher< Application, Input, Value >:
Collaboration graph
[legend]

List of all members.

Classes

struct  Entry
 Type of entry in dispatch table: if value is key, h will be called. More...

Public Types

typedef bool(Application::* Handler )(Input &input, const Value &value)
 Handler type.

Static Public Member Functions

static bool handle (Application &a, Input &input, const Value &value)
 Main handler function.

Static Public Attributes

static Entry table []
 Actual dispatch table.

Detailed Description

template<class Application, typename Input, typename Value>
class Dv::Util::Dispatcher< Application, Input, Value >

A class template framework to dispatch control based on some value.

The framework assumes that there are two objects:

 Input input; // represents input for application
 Application application; // represents application

The Application class has a number of handler functions

 Application::handle_value_1(Input& input, const Value& value)
 Application::handle_value_2(Input& input, const Value& value)

one of which should be called. Which one to call depends on a certain available value.

The class template below makes it easy to dispatch to the correct handler-function, based on the given value.

To use, an instance should define Dispatcher<Application,Input,Value>::table as in the example below.

 typedef std::string Value;
 Dispatcher<Application,Input,Value>::Entry 
 Dispatcher<Application,Input,Value>::table[] = {
   { "", &Application::default_handler },
   { "a", &Application::handle_a },
   { "b", &Application::handle_b },
   { "c", &Application::handle_c },
   { "", 0 } // sentinel
 };

The Application class could then define an Application::main function as follows.

 class Application {
 public:
   bool main(Input& input, const Value& value) {
     return Dispatcher<Application,Input,Value>::handle(*this, input, value);
     }
 };
See also:
Dv::Cgi::Cgi

Definition at line 56 of file dispatch.h.


Member Typedef Documentation

template<class Application , typename Input , typename Value >
typedef bool(Application::* Dv::Util::Dispatcher< Application, Input, Value >::Handler)(Input &input, const Value &value)

Handler type.

Definition at line 59 of file dispatch.h.


Member Function Documentation

template<class Application , typename Input , typename Value >
static bool Dv::Util::Dispatcher< Application, Input, Value >::handle ( Application &  a,
Input &  input,
const Value &  value 
) [inline, static]

Main handler function.

It will use value to dispatch a call to the appropriate handler function. An actual example can be found in test-dispatch.C in the source directory.

Parameters:
a application defining handler functions.
input object.
value used to select the handler function.

Definition at line 84 of file dispatch.h.

References Dv::Util::Dispatcher< Application, Input, Value >::table.


Member Data Documentation

template<class Application , typename Input , typename Value >
Entry Dv::Util::Dispatcher< Application, Input, Value >::table[] [static]

Actual dispatch table.

Define as in the example below.

 Dispatcher<Application,Input,std::string>::Entry 
 Dispatcher<Application,Input,std::string>::table[] = {
   { "", &Application::default_handler },
   { "a", &Application::handle_a },
   { "b", &Application::handle_b },
   { "c", &Application::handle_c },
   { "", 0 } // sentinel

Definition at line 75 of file dispatch.h.

Referenced by Dv::Util::Dispatcher< Application, Input, Value >::handle().


The documentation for this class was generated from the following file:

dvutil-1.0.10 [ 5 December, 2009]