VTK
|
Dispatch to functor based on two pointer types. More...
#include <vtkDoubleDispatcher.h>
Public Member Functions | |
ReturnType | Go (BaseLhs *lhs, BaseRhs *rhs) |
template<class SomeLhs , class SomeRhs , class Functor > | |
void | Add (Functor fun) |
template<class SomeLhs , class SomeRhs > | |
bool | Remove () |
Protected Types | |
typedef vtkDispatcherCommon::TypeInfo | TypeInfo |
typedef vtkDoubleDispatcherPrivate::Functor < ReturnType, BaseLhs, BaseRhs > | MappedType |
typedef std::pair< TypeInfo, TypeInfo > | KeyType |
typedef std::map< KeyType, MappedType > | MapType |
Protected Member Functions | |
void | DoAddFunctor (TypeInfo lhs, TypeInfo rhs, MappedType fun) |
bool | DoRemove (TypeInfo lhs, TypeInfo rhs) |
Protected Attributes | |
MapType | FunctorMap |
Dispatch to functor based on two pointer types.
vtkDoubleDispatcher is a class that allows calling a functor based on the derived types of two pointers. This form of dynamic dispatching allows the conversion of runtime polymorphism to a compile time polymorphism. For example it can be used as a replacement for the vtkTemplateMacro when you want to know multiple parameter types, or need to call a specialized implementation for a subset
Note: By default the return type is void.
The functors that are passed around can contain state, and are allowed to be const or non const. If you are using a functor that does have state, make sure your copy constructor is correct.
struct functor{ template<typename T,typename U> void operator()(T& t,U& u) const { } }; Here is an example of using the double dispatcher. \code vtkDoubleDispatcher<vtkObject,vtkObject,vtkPoints*> dispatcher; dispatcher.Add<vtkPoints,vtkDoubleArray>(makePointsWrapperFunctor()); dispatcher.Add<vtkPoints,vtkPoints>(straightCopyFunctor()); dispatcher.Go(ptr1,ptr2); //this will return a vtkPoints pointer
Definition at line 85 of file vtkDoubleDispatcher.h.
typedef vtkDispatcherCommon::TypeInfo vtkDoubleDispatcher< BaseLhs, BaseRhs, ReturnType, CastingPolicy >::TypeInfo [protected] |
Definition at line 123 of file vtkDoubleDispatcher.h.
typedef vtkDoubleDispatcherPrivate::Functor<ReturnType,BaseLhs,BaseRhs> vtkDoubleDispatcher< BaseLhs, BaseRhs, ReturnType, CastingPolicy >::MappedType [protected] |
Definition at line 125 of file vtkDoubleDispatcher.h.
typedef std::pair<TypeInfo,TypeInfo> vtkDoubleDispatcher< BaseLhs, BaseRhs, ReturnType, CastingPolicy >::KeyType [protected] |
Definition at line 130 of file vtkDoubleDispatcher.h.
typedef std::map<KeyType, MappedType > vtkDoubleDispatcher< BaseLhs, BaseRhs, ReturnType, CastingPolicy >::MapType [protected] |
Definition at line 131 of file vtkDoubleDispatcher.h.
void vtkDoubleDispatcher< BaseLhs, BaseRhs, ReturnType, CastingPolicy >::Add | ( | Functor | fun | ) | [inline] |
Add in a functor that is mapped to the combination of the two template parameters passed in. When instances of the two parameters are passed in on the Go method we will call the functor and pass along the given parameters. Note: This copies the functor so pass stateful functors by pointer.
vtkDoubleDispatcher<vtkDataModel,vtkCell> dispatcher; dispatcher.Add<vtkImageData,vtkVoxel>(exampleFunctor()); dispatcher.Add<vtkImageData,vtkVoxel>(&exampleFunctorWithState);
Definition at line 99 of file vtkDoubleDispatcher.h.
bool vtkDoubleDispatcher< BaseLhs, BaseRhs, ReturnType, CastingPolicy >::Remove | ( | ) | [inline] |
Remove a functor that is bound to the given parameter types. Will return true if we did remove a functor.
Definition at line 106 of file vtkDoubleDispatcher.h.
ReturnType vtkDoubleDispatcher< BaseLhs, BaseRhs, ReturnType, CastingPolicy >::Go | ( | BaseLhs * | lhs, |
BaseRhs * | rhs | ||
) |
Given two pointers of objects that derive from the BaseLhs and BaseRhs we find the matching functor that was added, and call it passing along the given parameters. It should be noted that the functor will be called with the parameters being the derived type that Functor was registered with. Note: This will only find exact matches. So if you add functor to find vtkDataArray,vtkDataArray, it will not be called if passed with vtkDoubleArray,vtkDoubleArray.
vtkDoubleDispatcher<vtkDataArray,vtkDataArray> dispatcher; dispatcher.Add(vtkFloatArray,vtkFloatArray>(floatFunctor()) dispatcher.Add(vtkFloatArray,vtkDoubleArray>(mixedTypeFunctor()) dispatcher.Go( dataArray1, dataArray2);
Definition at line 201 of file vtkDoubleDispatcher.h.
void vtkDoubleDispatcher< BaseLhs, BaseRhs, ReturnType, CastingPolicy >::DoAddFunctor | ( | TypeInfo | lhs, |
TypeInfo | rhs, | ||
MappedType | fun | ||
) | [protected] |
Definition at line 183 of file vtkDoubleDispatcher.h.
bool vtkDoubleDispatcher< BaseLhs, BaseRhs, ReturnType, CastingPolicy >::DoRemove | ( | TypeInfo | lhs, |
TypeInfo | rhs | ||
) | [protected] |
Definition at line 192 of file vtkDoubleDispatcher.h.
MapType vtkDoubleDispatcher< BaseLhs, BaseRhs, ReturnType, CastingPolicy >::FunctorMap [protected] |
Definition at line 132 of file vtkDoubleDispatcher.h.