00001 
00002 
00003 #include "queue.h"
00004 #include "packnode.h"
00005 #include "packcontainer_int.h"
00006 #include "packtree_base_int.h"
00007 
00008 
00047 void packtree_base_int::newLevel( packnode<int>* top, 
00048                               bool freqCalc, 
00049                               bool reverse )
00050 {
00051   if (top != 0) {
00052     const size_t len = top->length();
00053     if (len > 1) {
00054       
00055       
00056       
00057       packcontainer_int container( top );
00058 
00059       if (reverse) {
00060         
00061         
00062         
00063         
00064         waveObj->forwardStepRev( container, len );
00065       }
00066       else {
00067         
00068         
00069         
00070         
00071         waveObj->forwardStep( container, len );
00072       }
00073 
00074       packnode<int> *lhs = new packnode<int>(container.lhsData(), 
00075                                                    len/2,
00076                                                    packnode<int>::LowPass );
00077       packnode<int> *rhs = new packnode<int>(container.rhsData(), 
00078                                                    len/2,
00079                                                    packnode<int>::HighPass );
00080 
00081       
00082       
00083       top->mark( false );
00084       lhs->mark( true );
00085       rhs->mark( true );
00086 
00087       top->lhsChild( lhs );
00088       top->rhsChild( rhs );
00089 
00090       
00091       
00092       
00093       
00094       newLevel( lhs, freqCalc, false );
00095 
00096       if (freqCalc) {
00097         
00098         
00099         
00100         newLevel( rhs, freqCalc, true );
00101       }
00102       else { 
00103         
00104         newLevel( rhs, freqCalc, false );
00105       }
00106     }
00107   }
00108 } 
00109 
00110 
00111 
00129 void packtree_base_int::breadthFirstPrint(const printKind kind)
00130 {
00131   queue<int> Q;
00132 
00133   Q.addQueue( root, 0 );
00134   while (! Q.queueEmpty() ) {
00135     packnode<int> *node = Q.queueStart()->node;
00136     size_t indent = Q.queueStart()->indent;
00137     Q.deleteStart();
00138     
00139     if (indent > 0) {
00140       
00141       printf("%*c", indent, ' ');
00142     }
00143 
00144     switch (kind) {
00145     case printData: node->pr();
00146       break;
00147     case printCost: node->prCost();
00148       break;
00149     case printBestBasis: node->prBestBasis();
00150       break;
00151     default:
00152       assert( false );
00153       break;
00154     } 
00155     
00156     packnode<int> *lhs = node->lhsChild();
00157     packnode<int> *rhs = node->rhsChild();
00158 
00159     if (lhs != 0) {
00160       Q.addQueue( lhs, indent + 2 );
00161     }
00162     if (rhs != 0) {
00163       Q.addQueue( rhs, indent + 2 );
00164     }
00165   }
00166 } 
00167 
00168 
00169 
00170 
00175 void packtree_base_int::pr()
00176 {
00177   if (root != 0) {
00178     breadthFirstPrint(printData);
00179   }
00180 }