www.pudn.com > Loki.rar > Test_Visitor.cpp


#include  
#include "Visitor.h" 
 
using namespace ::Loki; 
 
class RasterBitmap  
    : public BaseVisitable<> 
{ 
public: 
    DEFINE_VISITABLE() 
}; 
 
class Paragraph 
    : public BaseVisitable<> 
{ 
public: 
    DEFINE_VISITABLE() 
}; 
 
 
class ParagraphEx  
    : public Paragraph 
{ 
public: 
    DEFINE_VISITABLE() 
}; 
 
class DummyParagraph 
    : public Paragraph 
{ 
public: 
    DEFINE_VISITABLE() 
}; 
 
class DummyRasterBitmap 
    : public RasterBitmap 
{ 
public: 
    DEFINE_VISITABLE() 
}; 
 
class SomeVisitor  
    : public BaseVisitor 
    , public Visitor 
    , public BaseVisitorImpl 
{ 
public: 
     void Visit(RasterBitmap&) 
     { 
         std::cout << "SomeVisitor::Visit(RasterBitmap&)" << '\n'; 
     } 
 
     void Visit(Paragraph &) 
     { 
         std::cout << "SomeVisitor::Visit(Paragraph&)" << '\n'; 
     } 
 
     void Visit(ParagraphEx &) 
     { 
         std::cout << "SomeVisitor::Visit(ParagraphEx&)" << '\n'; 
     } 
}; 
 
 
void Test_Visitor() 
{ 
    SomeVisitor     someVisit; 
    BaseVisitor    &baseVisit = someVisit; 
 
    RasterBitmap    rast; 
    rast.Accept(baseVisit); 
     
    Paragraph       par; 
    par.Accept(baseVisit); 
 
    ParagraphEx     parEx; 
    parEx.Accept(baseVisit); 
 
    DummyRasterBitmap dummyRast; 
    dummyRast.Accept(baseVisit); 
 
    DummyParagraph    dummyPar; 
    dummyPar.Accept(baseVisit); 
} 
 
typedef CyclicVisitor 
< 
    void, 
    TYPELIST_3(class DocElement, class RasterBitmap2, class Paragraph2) 
> 
MyCyclicVisitor; 
 
 
class DocElement 
{ 
public: 
    virtual void Accept(MyCyclicVisitor &) = 0; 
    virtual ~DocElement() {} 
}; 
 
class RasterBitmap2 
    : public DocElement 
{ 
public: 
    DEFINE_CYCLIC_VISITABLE(MyCyclicVisitor) 
}; 
 
class Paragraph2  
    : public DocElement 
{ 
public: 
    DEFINE_CYCLIC_VISITABLE(MyCyclicVisitor) 
}; 
 
class SomeVisitor2 
    : public MyCyclicVisitor 
{ 
public: 
     void Visit(DocElement &) 
     { 
         std::cout << "SomeVisitor::Visit(DocElement&)" << '\n'; 
     } 
 
     void Visit(Paragraph2 &) 
     { 
         std::cout << "SomeVisitor::Visit(Paragraph2&)" << '\n'; 
     } 
 
     void Visit(RasterBitmap2 &) 
     { 
         std::cout << "SomeVisitor::Visit(RasterBitmap2&)" << '\n'; 
     } 
}; 
 
void Test_CyclicVisitor() 
{ 
    SomeVisitor2     someVisit; 
    MyCyclicVisitor  &baseVisit = someVisit; 
 
    RasterBitmap2   rast; 
    rast.Accept(baseVisit); 
     
    Paragraph2      par; 
    par.Accept(baseVisit); 
 
    DocElement     &docElem1 = par; 
    docElem1.Accept(baseVisit); 
 
    DocElement     &docElem2 = rast; 
    docElem2.Accept(baseVisit); 
} 
 
int main() 
{ 
    Test_Visitor(); 
    Test_CyclicVisitor(); 
}