ROOT logo
#ifndef TreeSearch__TreeWalk
#define TreeSearch__TreeWalk

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// TreeSearch::TreeWalk                                                      //
//                                                                           //
// Generic function object to traverse a PatternTree.                        //
//                                                                           //
// TreeWalk implements an internal iterator pattern [E. Gamma et al.,        //
// "Design Patterns", Addison-Wesley, 1995] that applies generic operation   //
// to each tree element.  The operation itself represents a simplified form  //
// of a visitor pattern [ibid.], where the simplification lies in the fact   //
// that the tree contains only a single class of nodes instead of many.      //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include "Node.h"
#include <fstream>
#include <iostream>
#include <map>

namespace TreeSearch {

  //___________________________________________________________________________
  // Base class for "Visitors" to the pattern tree nodes
  class NodeVisitor {
  public:
    enum ETreeOp { kRecurse, kRecurseUncond, kSkipChildNodes, kError };

    virtual ETreeOp operator() ( const NodeDescriptor& nd ) = 0;
    virtual ~NodeVisitor() {}
  protected:
    // Functions to allow derived classes to modify Links and Patterns.
    // (needed since C++ friend access doesn't extend to derived classes)
    static void SetLinkPattern( Link* link, Pattern* pattern );
    static void SetLinkType( Link* link, Int_t type );
    static void SetLinkNext( Link* link, Link* next );
    static void SetPatternChild( Pattern* pat, Link* link );
  };


  //___________________________________________________________________________
  // The actual tree iterator class
  class TreeWalk {
  private:
    UInt_t   fNlevels;  // Number of levels in tree
  public:
    TreeWalk( UInt_t nlevels = 0 ) : fNlevels(nlevels) {}
    virtual ~TreeWalk() {}
    void SetNlevels( UInt_t n ) { fNlevels = n; }
    
    NodeVisitor::ETreeOp 
    operator() ( Link* link, NodeVisitor& op, Pattern* parent = 0,
		 UInt_t depth = 0, UInt_t shift = 0,
		 Bool_t mirrored = false ) const;
    ClassDef(TreeWalk, 0)  // Generic traversal function for a PatternTree
  };


  //___________________________________________________________________________
  // TreeSearch::WritePattern
  // TreeSearch::CountPattern
  // TreeSearch::PrintPattern
  //
  // Common "visitor" objects for tree traversal operations. The object's
  // operator() is applied to each tree node. These can be used with the
  // TreeWalk iterator

  //___________________________________________________________________________
  // Write patterns to binary file
  class WritePattern : public NodeVisitor {
  public:
    WritePattern( const char* filename, size_t index_size = sizeof(Int_t) );
    virtual ~WritePattern() { delete os; }
    virtual ETreeOp operator() ( const NodeDescriptor& nd );

  private:
    std::ofstream* os;        // Output file stream
    size_t    fIdxSiz;        // Byte size of the pattern count (1, 2, or 4)
    std::map<Pattern*,Int_t> fMap; // Index map for serializing 

    // Because of the pointer member, disallow copying and assignment
    WritePattern( const WritePattern& orig );
    WritePattern& operator=( const WritePattern& rhs );
  };

  //___________________________________________________________________________
  // Count unique patterns (including shifts)
  class CountPattern : public NodeVisitor {
  public:
    CountPattern() : fCount(0) {}
    virtual ETreeOp operator() ( const NodeDescriptor& )
    { fCount++; return kRecurse; }
    ULong64_t GetCount() const { return fCount; }

  private:
    ULong64_t    fCount;    // Pattern count
  };

  //___________________________________________________________________________
  // Pretty print to output stream (and count) all actual patterns
  class PrintPattern : public NodeVisitor {
  public:
    PrintPattern( std::ostream& ostr = std::cout, bool dump = false ) 
      : os(ostr), fCount(0), fDump(dump) {}
    virtual ETreeOp operator() ( const NodeDescriptor& nd );
    ULong64_t GetCount() const { return fCount; }

  private:
    std::ostream&  os;        // Destinaton stream
    ULong64_t      fCount;    // Pattern count
    Bool_t         fDump;     // Dump mode (one line per pattern)
  };

  /////////////////////////////////////////////////////////////////////////////

} // end namespace TreeSearch

#endif
 TreeWalk.h:1
 TreeWalk.h:2
 TreeWalk.h:3
 TreeWalk.h:4
 TreeWalk.h:5
 TreeWalk.h:6
 TreeWalk.h:7
 TreeWalk.h:8
 TreeWalk.h:9
 TreeWalk.h:10
 TreeWalk.h:11
 TreeWalk.h:12
 TreeWalk.h:13
 TreeWalk.h:14
 TreeWalk.h:15
 TreeWalk.h:16
 TreeWalk.h:17
 TreeWalk.h:18
 TreeWalk.h:19
 TreeWalk.h:20
 TreeWalk.h:21
 TreeWalk.h:22
 TreeWalk.h:23
 TreeWalk.h:24
 TreeWalk.h:25
 TreeWalk.h:26
 TreeWalk.h:27
 TreeWalk.h:28
 TreeWalk.h:29
 TreeWalk.h:30
 TreeWalk.h:31
 TreeWalk.h:32
 TreeWalk.h:33
 TreeWalk.h:34
 TreeWalk.h:35
 TreeWalk.h:36
 TreeWalk.h:37
 TreeWalk.h:38
 TreeWalk.h:39
 TreeWalk.h:40
 TreeWalk.h:41
 TreeWalk.h:42
 TreeWalk.h:43
 TreeWalk.h:44
 TreeWalk.h:45
 TreeWalk.h:46
 TreeWalk.h:47
 TreeWalk.h:48
 TreeWalk.h:49
 TreeWalk.h:50
 TreeWalk.h:51
 TreeWalk.h:52
 TreeWalk.h:53
 TreeWalk.h:54
 TreeWalk.h:55
 TreeWalk.h:56
 TreeWalk.h:57
 TreeWalk.h:58
 TreeWalk.h:59
 TreeWalk.h:60
 TreeWalk.h:61
 TreeWalk.h:62
 TreeWalk.h:63
 TreeWalk.h:64
 TreeWalk.h:65
 TreeWalk.h:66
 TreeWalk.h:67
 TreeWalk.h:68
 TreeWalk.h:69
 TreeWalk.h:70
 TreeWalk.h:71
 TreeWalk.h:72
 TreeWalk.h:73
 TreeWalk.h:74
 TreeWalk.h:75
 TreeWalk.h:76
 TreeWalk.h:77
 TreeWalk.h:78
 TreeWalk.h:79
 TreeWalk.h:80
 TreeWalk.h:81
 TreeWalk.h:82
 TreeWalk.h:83
 TreeWalk.h:84
 TreeWalk.h:85
 TreeWalk.h:86
 TreeWalk.h:87
 TreeWalk.h:88
 TreeWalk.h:89
 TreeWalk.h:90
 TreeWalk.h:91
 TreeWalk.h:92
 TreeWalk.h:93
 TreeWalk.h:94
 TreeWalk.h:95
 TreeWalk.h:96
 TreeWalk.h:97
 TreeWalk.h:98
 TreeWalk.h:99
 TreeWalk.h:100
 TreeWalk.h:101
 TreeWalk.h:102
 TreeWalk.h:103
 TreeWalk.h:104
 TreeWalk.h:105
 TreeWalk.h:106
 TreeWalk.h:107
 TreeWalk.h:108
 TreeWalk.h:109
 TreeWalk.h:110
 TreeWalk.h:111
 TreeWalk.h:112
 TreeWalk.h:113
 TreeWalk.h:114
 TreeWalk.h:115
 TreeWalk.h:116
 TreeWalk.h:117
 TreeWalk.h:118
 TreeWalk.h:119
 TreeWalk.h:120