home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / yacl-012.zip / basedemo / tree / treetest.cxx < prev   
C/C++ Source or Header  |  1994-10-14  |  3KB  |  108 lines

  1.  
  2.  
  3. #include "base/tree.h"
  4. #include "base/treewalk.h"
  5. #include "base/memory.h"
  6.  
  7. #include <stdio.h>
  8. #include <iostream.h>
  9.  
  10.  
  11. class NodePrinter: public CL_Object {
  12.  
  13. public:
  14.     bool Print (CL_VoidPtrTreeNode& node, long depth);
  15.     bool Start (CL_VoidPtrTreeNode& node, long depth);
  16.     bool End   (CL_VoidPtrTreeNode& node, long depth);
  17. };
  18.  
  19. bool NodePrinter::Print (CL_VoidPtrTreeNode& node, long depth)
  20. {
  21.     printf ("Depth %ld content '%s' label %ld\n", depth, (char*)
  22.             node.Content(), node.Label());
  23.     return TRUE;
  24. }
  25.  
  26. bool NodePrinter::Start  (CL_VoidPtrTreeNode& node, long depth)
  27. {
  28.     for (long i = 0; i < 4*depth; i++) putchar (' ');
  29.     printf ("Depth %ld content '%s' label %ld\n", depth, (char*)
  30.             node.Content(), node.Label());
  31.     if (node.ChildCount() > 0) {
  32.         for (long i = 0; i < 4*depth; i++) putchar (' ');
  33.         printf ("{\n");
  34.     }
  35.     return TRUE;
  36. }
  37.  
  38.  
  39. bool NodePrinter::End  (CL_VoidPtrTreeNode& node, long depth)
  40. {
  41.     if (node.ChildCount() > 0) {
  42.         for (long i = 0; i < 4*depth; i++) putchar (' ');
  43.         printf ("}\n");
  44.     }
  45.     return TRUE;
  46. }
  47.  
  48.  
  49.  
  50. typedef CL_Binding<NodePrinter> NodeBind;
  51.  
  52. void main ()
  53. {
  54.     CL_MemoryLeakChecker check (cout);
  55.     CL_VoidPtrTree aTree;
  56.     NodePrinter prt1;
  57.  
  58.     aTree.NewRoot (1)->Content() = "Level 0 (root)";
  59.     aTree.AddChild (2, 1)->Content() = "Level 1, #1";
  60.     aTree.AddChild (3, 1)->Content() = "Level 1, #2";
  61.     aTree.AddChild (4, 1)->Content() = "Level 1, #3";
  62.  
  63.     aTree.AddChild (5, 3)->Content() = "Level 2, #1";
  64.     aTree.AddChild (6, 3)->Content() = "Level 2, #2";
  65.  
  66.     for (long i = 1; i <= 6; i++)
  67.         printf ("Node %ld has %ld children\n", i,
  68.                 aTree.Node (i)->ChildCount());
  69.  
  70.     printf ("----------------------\nPost-order walk:\n\n");
  71.     CL_VoidPtrTreePostWalker walker (aTree.Root());
  72.     for (walker.Reset (); walker.More(); ) {
  73.         CL_VoidPtrTreeNode* n = walker.Next();
  74.         printf ("%ld: %s\n", n->Label(), n->Content());
  75.     }
  76.  
  77.     printf ("----------------------\nPre-order walk:\n\n");
  78.     CL_VoidPtrTreePreWalker pwalker (aTree.Root());
  79.     for (pwalker.Reset (); pwalker.More(); ) {
  80.         CL_VoidPtrTreeNode* n = pwalker.Next();
  81.         printf ("%ld: %s\n", n->Label(), n->Content());
  82.     }
  83.  
  84.  
  85.  
  86.     NodeBind print_bind (&prt1, (NodeBind::MethodPtr) &NodePrinter::Print);
  87.     aTree.PostOrderWalk (1, print_bind);
  88.  
  89.     printf ("--------------\nBegin general traversal:\n");
  90.     NodeBind start_bind (&prt1, (NodeBind::MethodPtr) &NodePrinter::Start);
  91.     NodeBind end_bind   (&prt1, (NodeBind::MethodPtr) &NodePrinter::End);
  92.     long cnt = aTree.Traverse (1, start_bind, end_bind);
  93.  
  94.     printf ("--------------\n"
  95.             "End General traversal\nCount returned:%d\n", cnt);
  96.  
  97.     CL_VoidPtrTree* anotherTree = aTree.ExtractSubtree (3);
  98.     char* p = (char*) aTree.Node(1)->Content();
  99.  
  100.  
  101.     aTree.PostOrderWalk (1, print_bind);
  102.     printf ("--------------\n");
  103.     anotherTree->PostOrderWalk (3, print_bind);
  104.     delete anotherTree;
  105. }
  106.  
  107.  
  108.