eng::Visitor Class Reference

Base class for a Visitor of a Graph. More...

#include <eng_node_visitor.hh>

Inheritance diagram for eng::Visitor:

eng::Object::VisitorComputeVolume eng::VisitorCloner eng::VisitorComputeNormals eng::VisitorDraw eng::VisitorGetFirstTransformNode eng::VisitorLod eng::VisitorSetRecomputeNormals mod_base::VisitorClonePartitionNodes mod_sim::VisitorChangeFlameColor

List of all members.

Public Member Functions

 Visitor (Graph &graph, Node::Ptr root)
 Visitor (Graph &graph)
virtual ~Visitor ()
virtual void Visit (Node &node)
virtual void Visit (LodNode &node)
virtual void Visit (PartitionNode &node)
virtual void Visit (TransformNode &node)
virtual void Visit (VertexsNode &node)
virtual void Visit (NormalsNode &node)
virtual void Visit (ModesNode &node)
virtual void Visit (MaterialNode &node)
virtual void Visit (TextureNode &node)
virtual void Visit (ColorsNode &node)
virtual void Visit (PolygonNode &node)
virtual void Visit (PolygonNode_TriColor1 &node)
virtual void Visit (PolygonNode_TriColor3 &node)
virtual void Visit (PolygonNode_QuadColor1 &node)
virtual void Visit (PolygonNode_QuadColor4 &node)
virtual void Visit (PolygonNode_Tex &node)
virtual void Visit (PolygonNode_TexTriColor1 &node)
virtual void Visit (PolygonNode_TexTriColor3 &node)
virtual void Visit (PolygonNode_TexQuadColor1 &node)
virtual void Visit (PolygonNode_TexQuadColor4 &node)
virtual void Visit (SpecialNode &node)
Node::Ptr GetRootNode (void) const
virtual operator bool () const
 Can stop Graph::Traverse() by becoming false.
void Stop (void)
virtual void Begin (GraphTraversal::Ptr traversal)
 allows Visitor::Visit() to push "departure nodes" during traversal
virtual void End (void)
 Visitor::End() is called after traversal ended.

Protected Member Functions

void SetRootNode (Node::Ptr root)

Protected Attributes

GraphmGraph
Node::Ptr mRoot
bool mStop


Detailed Description

Base class for a Visitor of a Graph.

/// In parallel to the set of node classes, the Visitor class has
/// a set of Visit() methods which correlate to each class of node.
/// Each node class has an Accept(Visitor&) method.
/// A function to traverse the Graph passes the Visitor
/// to every node's Accept() method.  In turn, every node
/// calls and passes itself to the Visitor's Visit() method
/// that corresponds to the node's class.
/// The Visitor design pattern doesn't necessarily require
/// tediously defining a Visitor::Visit() method for every Node class
/// If specific action is needed for a specific Node class,
/// then Visitor::Visit(Node&) can be the default method.
///
/// Visit() will be called by Accept() of the corresponding Node class.
/// By default, each Visit is a NOP (not abstract), to facilitate
/// deriving a Visitor that only has a special action for a specific Node class.
/// NullNode::Visit() was omitted since it should never be visited.
///
/// [generalized]
///
/// class Node
/// {
///     virtual void  Accept( Visitor& visitor ) = 0;
/// };
///
/// class TransformNode : public Node
/// {
///     void  Accept( Visitor& visitor ) { visitor.Visit( *this ); }
/// };
///
/// class NodeVisitor
/// {
///     virtual void Visit( TransformNode& node ) { }
///     virtual void Visit( TextureNode& node) { }
///     [..]
/// };
///
/// void Graph::Traverse( Visitor& visitor )
/// {
///     NodeIterator nodeIter;
///     for ( nodeIter = mNodes.begin(); nodeIter != mNodes.end(); ++nodeIter )
///     {
///         nodeIter->Accept( visitor );
///         if ( not visitor ) break;  // Visitor can stop traversal
///     }
/// }
///
/// Visitors that retain a reference to a Node:
/// --------------------------------------------
/// A Visitor that retains a reference to a Node after traversal
/// should use the reference-counted Node::Ptr or risk dangling.
/// Although Visitor::Visit(Node&) isn't passed a Node::Ptr,
/// Node is a Shared object which can be converted to a Node::Ptr
/// by assigning its raw pointer to a Node::Ptr variable
/// (which is how every Node::Ptr was created).
///
/// class VisitorSearch
/// {
///     void Visit( Node& node )
///     {
///         if ( node == sought ) mMatch = &node;
///     }
/// private:
///     Node::Ptr    mMatch;
/// };
///
/// Visitor derivatives that visit node derivatives:
/// ------------------------------------------------
/// The trick is to use static_cast to cast the base Visitor to the derived Visitor,
/// in order for the compiler to select the derived Visit() method over the base one.
///
/// class Visitor
/// {
///    class SpecialNode
///    {
///    };
/// };
///
/// class VisitorDerived : public Visitor
/// {
///    class DerivedSpecialNode : public SpecialNode
///    {
///        void Accept( Visitor& visitor )
///        {
///            static_cast<DerivedVisitor&>(visitor).Visit( *this );
///            ^^^^^^^^^^^ solution
///        };
///    };
/// };
///
/// 

Constructor & Destructor Documentation

eng::Visitor::Visitor ( Graph graph,
Node::Ptr  root 
)

Parameters:
graph 
root Allows traversing a partition of a Graph. Defaults to root of Graph.

eng::Visitor::Visitor ( Graph graph  ) 

virtual eng::Visitor::~Visitor (  )  [inline, virtual]


Member Function Documentation

virtual void eng::Visitor::Visit ( Node node  )  [inline, virtual]

virtual void eng::Visitor::Visit ( LodNode node  )  [inline, virtual]

Reimplemented in eng::VisitorLod.

virtual void eng::Visitor::Visit ( PartitionNode node  )  [inline, virtual]

Reimplemented in mod_base::VisitorClonePartitionNodes.

virtual void eng::Visitor::Visit ( TransformNode node  )  [inline, virtual]

Reimplemented in eng::VisitorDraw, eng::VisitorGetFirstTransformNode, and eng::Object::VisitorComputeVolume.

virtual void eng::Visitor::Visit ( VertexsNode node  )  [inline, virtual]

Reimplemented in eng::VisitorDraw, and eng::Object::VisitorComputeVolume.

virtual void eng::Visitor::Visit ( NormalsNode node  )  [inline, virtual]

Reimplemented in eng::VisitorDraw, and eng::VisitorSetRecomputeNormals.

virtual void eng::Visitor::Visit ( ModesNode node  )  [inline, virtual]

Reimplemented in eng::VisitorDraw, and mod_sim::VisitorChangeFlameColor.

virtual void eng::Visitor::Visit ( MaterialNode node  )  [inline, virtual]

Reimplemented in eng::VisitorDraw.

virtual void eng::Visitor::Visit ( TextureNode node  )  [inline, virtual]

Reimplemented in eng::VisitorDraw.

virtual void eng::Visitor::Visit ( ColorsNode node  )  [inline, virtual]

Reimplemented in eng::VisitorDraw, and mod_sim::VisitorChangeFlameColor.

virtual void eng::Visitor::Visit ( PolygonNode node  )  [inline, virtual]

Reimplemented in eng::VisitorDraw, and eng::VisitorComputeNormals.

void eng::Visitor::Visit ( PolygonNode_TriColor1 node  )  [virtual]

For convenience, by default, Visit() of PolygonNode derivatives call Visit(PolygonNode&).

Reimplemented in eng::VisitorDraw.

void eng::Visitor::Visit ( PolygonNode_TriColor3 node  )  [virtual]

Reimplemented in eng::VisitorDraw.

void eng::Visitor::Visit ( PolygonNode_QuadColor1 node  )  [virtual]

Reimplemented in eng::VisitorDraw.

void eng::Visitor::Visit ( PolygonNode_QuadColor4 node  )  [virtual]

Reimplemented in eng::VisitorDraw.

void eng::Visitor::Visit ( PolygonNode_Tex node  )  [virtual]

Reimplemented in eng::VisitorDraw.

void eng::Visitor::Visit ( PolygonNode_TexTriColor1 node  )  [virtual]

Reimplemented in eng::VisitorDraw.

void eng::Visitor::Visit ( PolygonNode_TexTriColor3 node  )  [virtual]

Reimplemented in eng::VisitorDraw.

void eng::Visitor::Visit ( PolygonNode_TexQuadColor1 node  )  [virtual]

Reimplemented in eng::VisitorDraw.

void eng::Visitor::Visit ( PolygonNode_TexQuadColor4 node  )  [virtual]

Reimplemented in eng::VisitorDraw.

virtual void eng::Visitor::Visit ( SpecialNode node  )  [inline, virtual]

Reimplemented in eng::VisitorDraw.

Node::Ptr eng::Visitor::GetRootNode ( void   )  const [inline]

virtual eng::Visitor::operator bool (  )  const [inline, virtual]

Can stop Graph::Traverse() by becoming false.

void eng::Visitor::Stop ( void   )  [inline]

virtual void eng::Visitor::Begin ( GraphTraversal::Ptr  traversal  )  [inline, virtual]

allows Visitor::Visit() to push "departure nodes" during traversal

virtual void eng::Visitor::End ( void   )  [inline, virtual]

Visitor::End() is called after traversal ended.

Reimplemented in eng::VisitorDraw, eng::VisitorComputeNormals, and eng::Object::VisitorComputeVolume.

void eng::Visitor::SetRootNode ( Node::Ptr  root  )  [inline, protected]


Member Data Documentation

Graph& eng::Visitor::mGraph [protected]

Node::Ptr eng::Visitor::mRoot [protected]

bool eng::Visitor::mStop [protected]


The documentation for this class was generated from the following files: Palomino 3D Engine documents generated by doxygen 1.5.3 on Fri Nov 23 11:26:24 2007