00001
00002
00003 #include "queue.h"
00004 #include "packnode.h"
00005 #include "packcontainer.h"
00006 #include "packtree_base.h"
00007
00008
00047 void packtree_base::newLevel( packnode<double>* 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 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<double> *lhs = new packnode<double>(container.lhsData(),
00075 len/2,
00076 packnode<double>::LowPass );
00077 packnode<double> *rhs = new packnode<double>(container.rhsData(),
00078 len/2,
00079 packnode<double>::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::breadthFirstPrint(const printKind kind)
00130 {
00131 queue<double> Q;
00132
00133 Q.addQueue( root, 0 );
00134 while (! Q.queueEmpty() ) {
00135 packnode<double> *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<double> *lhs = node->lhsChild();
00157 packnode<double> *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::pr()
00176 {
00177 if (root != 0) {
00178 breadthFirstPrint(printData);
00179 }
00180 }