Main Page | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals

MRAsbBase.h

Go to the documentation of this file.
00001 // MRAsbBase.h
00002 //////////////////////////////////////////////////////////////////////
00003 //          (c) Copyright 2002 Brown Deer Technology, LLC.
00004 //                        All rights reserved.
00005 //////////////////////////////////////////////////////////////////////
00006 
00007 #ifndef MRASBBASE_H
00008 #define MRASBBASE_H
00009 
00010 #ifdef USE_STD
00011 #include <iostream>
00012 #include <string>
00013 using namespace std;
00014 #else
00015 #include <iostream.h>
00016 #include <string.h>
00017 #endif
00018 
00019 #include "DataTypeCode.h"
00020 #include "BufferBase.h"
00021 #include "MRAmp.h"
00022 #include "MRAmpEncode.h"
00023 #include "MRAsbn.h"
00024 #include "MRAmspec.h"
00025 #include "MRAcspec.h"
00026 #include "ilog2.h"
00027 
00028 #ifndef MRA_MAXDIM
00029 #define MRA_MAXDIM 4
00030 #endif
00031 
00032 #ifndef MRASBBASE_PROCESS_MAXSIZEB
00033 #define MRASBBASE_PROCESS_MAXSIZEB 256
00034 #endif
00035 
00036 inline int castc_float( bytepack bp ) { return ilog2( float(bp) ); }
00037 inline int castc_double( bytepack bp ) { return ilog2( double(bp) ); }
00038 
00039 class MRAsbBase
00040 {
00041    public:
00042 
00043       virtual string isa() const { return "MRAsbBase"; }
00044 
00045       static const int     goodbit = 0x01;
00046       static const int     failbit = 0x02;
00047       static const int   baddimbit = 0x04;
00048       static const int     fragbit = 0x08;
00049       static const int hdrfixedbit = 0x10;
00050       static const int  sbfixedbit = 0x20;
00051 
00052       MRAsbBase( BufferBase* );
00053       MRAsbBase( const MRAsbBase&, BufferBase*  );
00054       MRAsbBase( const MRAmpEncode&, BufferBase* );
00055 
00056       virtual ~MRAsbBase();
00057 
00058       MRAsbBase& copy( const MRAsbBase& );
00059       MRAsbBase& operator = ( const MRAsbBase& );
00060       MRAsbBase& copy( MRAsbBase&, MRAmrange );
00061 //      MRAsbBase& test_copy_crange( MRAsbBase&, MRAcrange );
00062       MRAsbBase& copy( MRAsbBase&, MRAcrange );
00063       MRAsbBase& copy( MRAsbBase&, MRAmrange, MRAcrange );
00064 
00065       MRAsbBase& operator () ( BufferBase* );
00066       MRAsbBase& operator () ( const MRAsbBase&, BufferBase* );
00067       MRAsbBase& operator () ( const MRAmpEncode&, BufferBase* );
00068 
00069       bool is_equal( const MRAsbBase& );
00070       bool operator == ( const MRAsbBase& );
00071       bool operator != ( const MRAsbBase& );
00072 
00073       void clear();
00074       void setstate(int);
00075       void clrstate(int);
00076       int rdstate( int = 0xFF );
00077       bool good();
00078       bool fail();
00079       bool baddim();
00080       bool frag();
00081       bool hdrfixed();
00082       bool sbfixed();
00083 
00084       MRAsbBase& set_null();
00085       bool is_null();
00086       bool operator ! ();
00087 
00088       MRAsbBase& set_empty();
00089       bool is_empty();
00090 
00091       void fix_hdr();
00092       void fix_sb();
00093       void unfix_sb();
00094 
00095       void refix_hdr(); // THIS IS A HACK.  THIS CLASS MUST BE
00096                         // REDESIGNED FOR BETTER MANIPULATION OF hdr
00097 
00098       void set_sbn();
00099       void set_sbn( const MRAsbn& );
00100       void set_sbn( int sbn );
00101 
00102       void set_mspec();
00103       void set_mspec( const MRAmspec& );
00104       void set_mspec( 
00105         const MRAmrange& mthis, 
00106         const MRAmrange& mexist,
00107         const MRAmrange& mtheory
00108       );
00109       void set_mspec( const MRAmrange& mthis );
00110 
00111       void set_cspec();
00112       void set_cspec( const MRAcspec& );
00113       void set_cspec( 
00114         const MRAcrange& cthis, 
00115         const MRAcrange& cexist,
00116         const MRAcrange& ctheory
00117       );
00118       void set_cspec( const MRAcrange& cthis );
00119 
00120       void set_datatypecode( int datatypecode );
00121 
00122       void write( BufferBase& );
00123       MRAsbBase& operator << ( BufferBase& );
00124       void read( BufferBase& );
00125       MRAsbBase& operator >> ( BufferBase& );
00126 
00127       void write( istream& );
00128       void read( ostream& );
00129 
00130       void recover( BufferBase& );
00131       void recover( istream& );
00132 
00133       MRAmpEncode& mpenc();
00134 
00135       int sbsizeb();
00136 
00137       MRAsbn& sbn();
00138       MRAmspec& mspec();
00139       MRAcspec& cspec();
00140 
00141       int datatypecode();
00142 
00143       int process_sizeb();
00144       int process_method();
00145       char* process();
00146       char process( int i );
00147 
00148       int hdrsizeb();
00149 
00150       bool mmatch( MRAmrange, MRAmpBase& );
00151 
00152       MRAsbBase& append( MRAmpBase& );
00153       MRAsbBase& append_null();
00154       MRAsbBase& append( MRAsbBase& );
00155       MRAsbBase& append( MRAsbBase&, MRAmrange );
00156       MRAsbBase& append( MRAsbBase&, MRAcrange );
00157       MRAsbBase& append( MRAsbBase&, MRAmrange, MRAcrange );
00158 
00159       class iterator
00160       {
00161          public:
00162             iterator( MRAsbBase* );
00163             ~iterator();
00164             iterator& operator ++ ();
00165             MRAmp operator * ();
00166             void set_null();
00167             bool is_null();
00168             bool operator ! ();
00169             operator bool();
00170             bool is_equal( const iterator& );
00171             bool operator == ( const iterator& );
00172             bool operator != ( const iterator& );
00173             bool operator > ( const iterator& );
00174             bool operator < ( const iterator& );
00175             bool operator >= ( const iterator& );
00176             bool operator <= ( const iterator& );
00177             int pos() { return _pos; }
00178          protected:
00179             int _pos;
00180             MRAsbBase* _ptsb;
00181          private:
00182             iterator() {}
00183          friend class MRAsbBase;
00184       };
00185 
00186       iterator begin();
00187       iterator end();
00188 
00189    protected:
00190       int _state;
00191 
00192       MRAmpEncode _mpenc;
00193 
00194       int _sbsizeb;
00195 
00196       MRAsbn _sbn;
00197       MRAmspec _mspec;
00198       MRAcspec _cspec;
00199 
00200       int _datatypecode;
00201       int _process_sizeb;
00202       int _process_method;
00203       char _process[MRASBBASE_PROCESS_MAXSIZEB];
00204 
00205       BufferBase* _ptbuffer;
00206 
00207    private:
00208       MRAsbBase() {}
00209       virtual void synchronize();
00210 
00211    friend class iterator; 
00212 
00213    friend class MRAsbObject;
00214 
00215    friend BufferBase& operator << ( BufferBase&, MRAsbBase& );
00216    friend BufferBase& operator >> ( BufferBase&, MRAsbBase& );
00217 
00218    friend ostream& operator << ( ostream&, MRAsbBase& );
00219    friend istream& operator >> ( istream&, MRAsbBase& );
00220 
00221 };
00222 
00223 inline
00224 MRAsbBase::MRAsbBase( BufferBase* ptbuffer ) 
00225   : _ptbuffer(ptbuffer)
00226 {
00227    set_null();
00228    _ptbuffer->erase();
00229 }
00230 
00231 inline
00232 MRAsbBase::MRAsbBase( const MRAsbBase& sb, BufferBase* ptbuffer )
00233   : _state(sb._state), _mpenc(sb._mpenc),
00234     _sbsizeb(sb._sbsizeb),
00235     _sbn(sb._sbn), _mspec(sb._mspec), _cspec(sb._cspec),
00236     _datatypecode(sb._datatypecode),
00237     _process_sizeb(sb._process_sizeb), _process_method(sb._process_method),
00238     _ptbuffer(ptbuffer)
00239 {
00240    
00241    for( int i = 0; i < process_sizeb(); ++i ) _process[i] = sb._process[i];
00242    sb._ptbuffer->seekg(0);
00243    _ptbuffer->seekp(0);
00244    for( int i = 0; i < sb._ptbuffer->size(); ++i ) {
00245       _ptbuffer->put( sb._ptbuffer->get() );
00246    }
00247 }
00248 
00249 inline
00250 MRAsbBase::MRAsbBase( const MRAmpEncode& mpenc, BufferBase* ptbuffer )
00251   : _state(goodbit), _mpenc(mpenc), 
00252     _sbsizeb(0), 
00253     _sbn( _mpenc.grid_dim() ), _mspec( _mpenc.grid_dim() ), 
00254     _datatypecode(0),
00255     _process_sizeb(3), _process_method(0),
00256     _ptbuffer(ptbuffer)
00257 {}
00258 
00259 inline
00260 MRAsbBase::~MRAsbBase()
00261 {
00262    if ( _ptbuffer != 0 ) { delete _ptbuffer; _ptbuffer = 0; }
00263 }
00264 
00265 inline
00266 MRAsbBase& MRAsbBase::operator () ( BufferBase* ptbuffer ) 
00267 { 
00268    if ( _ptbuffer != 0 ) delete _ptbuffer; 
00269    _ptbuffer = ptbuffer;
00270    set_null(); 
00271    return *this;
00272 }
00273 
00274 inline
00275 MRAsbBase& MRAsbBase::operator () ( const MRAsbBase& sb, BufferBase* ptbuffer )
00276 {
00277    _state = sb._state;
00278    _mpenc = sb._mpenc;
00279    _sbsizeb = sb._sbsizeb;
00280    _sbn = sb._sbn;
00281    _mspec = sb._mspec;
00282    _cspec = sb._cspec;
00283    _datatypecode = sb._datatypecode;
00284    _process_sizeb = sb._process_sizeb;
00285    _process_method = sb._process_method;
00286    if ( _ptbuffer != 0 ) delete _ptbuffer; 
00287    _ptbuffer = ptbuffer; 
00288    for( int i = 0; i < process_sizeb(); ++i ) _process[i] = sb._process[i];
00289    sb._ptbuffer->seekg(0);
00290    _ptbuffer->seekp(0);
00291    char c;
00292    for( int i = 0; i < sb._ptbuffer->size(); ++i ) {
00293       c = sb._ptbuffer->get();
00294       _ptbuffer->put( c );
00295    }
00296    return *this;
00297 }
00298 
00299 inline
00300 MRAsbBase& MRAsbBase::operator () ( 
00301   const MRAmpEncode& mpenc, BufferBase* ptbuffer  
00302 )
00303 {
00304    _state = goodbit;
00305    _mpenc = mpenc;
00306    _sbsizeb = 0;
00307    _sbn(_mpenc.grid_dim());
00308    _mspec(_mpenc.grid_dim());
00309    _datatypecode = 0;
00310    _process_sizeb = 3;
00311    _process_method = 0;
00312    if ( _ptbuffer != 0 ) delete _ptbuffer; 
00313    _ptbuffer = ptbuffer;
00314    return *this;
00315 }
00316 
00317 inline
00318 MRAsbBase& MRAsbBase::copy( const MRAsbBase& sb ) 
00319 {
00320    if ( this != &sb ) {
00321       _state = sb._state;
00322       _mpenc = sb._mpenc;
00323       _sbsizeb = sb._sbsizeb;
00324       _sbn( _mpenc.grid_dim() ) = sb._sbn;
00325       _mspec( _mpenc.grid_dim() ) = sb._mspec;
00326       _cspec = sb._cspec;
00327       _datatypecode = sb._datatypecode;
00328       _process_sizeb = sb._process_sizeb;
00329       _process_method = sb._process_method;
00330       for( int i = 0; i < process_sizeb(); ++i ) _process[i]=sb._process[i];
00331       sb._ptbuffer->seekg(0);
00332       _ptbuffer->seekp(0);
00333       char c;
00334       for( int i = 0; i < sb._ptbuffer->size(); ++i ) {
00335          c = sb._ptbuffer->get();
00336          _ptbuffer->put( c );
00337       }
00338    }
00339    return *this;
00340 }
00341 
00342 inline
00343 MRAsbBase& MRAsbBase::operator = ( const MRAsbBase& rhs ) { return copy(rhs); }
00344 
00345 inline
00346 MRAsbBase& MRAsbBase::copy( MRAsbBase& sb, MRAmrange mrange ) 
00347 {
00348    if ( !sb.good() ) {
00349       clrstate(goodbit), setstate(failbit);
00350       return *this;
00351    }
00352    clear();
00353    _mpenc = sb._mpenc;
00354    _sbsizeb = 0;
00355    set_sbn( sb.sbn() );
00356    set_mspec( sb.mspec() );
00357    set_mspec( mrange * sb.mspec().mthis );
00358    set_cspec( sb.cspec() );
00359    set_datatypecode( sb.datatypecode() );
00360    _process_sizeb = sb.process_sizeb();
00361    _process_method = sb.process_method();
00362    for( int i = 0; i < _process_sizeb - 3; ++i ) {
00363       _process[i] = sb.process(i);
00364    }
00365  
00366    fix_hdr();
00367 
00368    MRAmlevel mlevel( _mpenc.grid_dim() );
00369    MRAmp mp;
00370    for( MRAsbBase::iterator iter = sb.begin(); iter < sb.end(); ++iter ) {
00371       mp = *iter;
00372       for(int d=0; d < _mpenc.grid_dim(); ++d) mlevel[d] = mp.mcode_to_m(d);
00373       if ( mlevel <= mrange ) append(mp);
00374    }
00375 
00376    fix_sb();
00377 
00378    return *this;
00379 }
00380 
00381 /*
00382 inline
00383 MRAsbBase& MRAsbBase::test_copy_crange( MRAsbBase& sb, MRAcrange crange ) 
00384 {
00385 //this should becom part of class
00386    int (*castc)( bytepack );
00387    if ( _datatypecode == DataTypeCode_type<float>::code() ) {
00388       castc = castc_float;
00389    } else if ( _datatypecode == DataTypeCode_type<double>::code() ) {
00390       castc = castc_double;
00391    } else {
00392       castc = 0;
00393    }
00394 
00395    if ( !sb.good() ) {
00396       clrstate(goodbit), setstate(failbit);
00397       return *this;
00398    }
00399    clear();
00400    _mpenc = sb._mpenc;
00401    _sbsizeb = 0;
00402    set_sbn( sb.sbn() );
00403    set_mspec( sb.mspec() );
00404    set_cspec( sb.cspec() );
00405    set_cspec( crange * sb.cspec().cthis );
00406    set_datatypecode( sb.datatypecode() );
00407    _process_sizeb = sb.process_sizeb();
00408    _process_method = sb.process_method();
00409    for(int i = 0; i < _process_sizeb - 3; ++i ) { _process[i] = sb.process(i);} 
00410    fix_hdr();
00411 
00412    MRAmlevel mlevel( _mpenc.grid_dim() );
00413    MRAmp mp;
00414    MRAmp mp2(_mpenc);
00415 //   MRAmpBuilder<float> mpbuilder2;
00416    for( MRAsbBase::iterator iter = sb.begin(); iter < sb.end(); ++iter ) {
00417       mp = *iter;
00418       mp2 = mp;
00419 //      mpbuilder2(mp2);
00420       mp2.set_empty();
00421       mp2.fix_hdr();
00422       for(int d=0; d < _mpenc.grid_dim(); ++d) mlevel[d] = mp.mcode_to_m(d);
00423 cout << "parse mp of sizeb " << mp.mpsizeb() << endl;
00424 
00425          MRAacoef acoef;
00426          MRAclevel clevel;
00427          for( MRAmpBase::iterator itmp=mp.begin(); itmp < mp.end(); ++itmp ) {
00428             acoef = *itmp;
00429             cout << "   " << acoef.a[0] << ":" << float(acoef.bpcoef)  << ' ' 
00430                  << castc(acoef.bpcoef) << endl;
00431             clevel = castc(acoef.bpcoef);
00432             if ( clevel <= crange ) mp2.append( acoef.a, acoef.bpcoef );
00433 //            mp2.append( acoef.a, acoef.bpcoef );
00434 //clevel.report();
00435 //crange.report();
00436          }
00437          mp2.fix_mp();
00438 
00439 //      if ( mlevel <= mrange ) append(mp);
00440       append(mp2);
00441 
00442    }
00443 
00444    fix_sb();
00445 
00446    return *this;
00447 }
00448 */
00449 
00450 inline
00451 MRAsbBase& MRAsbBase::copy( MRAsbBase& sb, MRAcrange crange ) 
00452 {
00453 //this should becom part of class
00454    int (*castc)( bytepack );
00455    if ( _datatypecode == DataTypeCode_type<float>::code() ) {
00456       castc = castc_float;
00457    } else if ( _datatypecode == DataTypeCode_type<double>::code() ) {
00458       castc = castc_double;
00459    } else {
00460       castc = 0;
00461    }
00462 
00463    if ( !sb.good() ) {
00464       clrstate(goodbit), setstate(failbit);
00465       return *this;
00466    }
00467    clear();
00468    _mpenc = sb._mpenc;
00469    _sbsizeb = 0;
00470    set_sbn( sb.sbn() );
00471    set_mspec( sb.mspec() );
00472    set_cspec( sb.cspec() );
00473    set_cspec( crange * sb.cspec().cthis );
00474    set_datatypecode( sb.datatypecode() );
00475    _process_sizeb = sb.process_sizeb();
00476    _process_method = sb.process_method();
00477    for(int i = 0; i < _process_sizeb - 3; ++i ) { _process[i] = sb.process(i);} 
00478    fix_hdr();
00479 
00480    MRAmlevel mlevel( _mpenc.grid_dim() );
00481    MRAmp mp;
00482    MRAmp mp2(_mpenc);
00483    for( MRAsbBase::iterator iter = sb.begin(); iter < sb.end(); ++iter ) {
00484       mp = *iter;
00485       mp2 = mp;
00486       mp2.set_empty();
00487       mp2.fix_hdr();
00488       for(int d=0; d < _mpenc.grid_dim(); ++d) mlevel[d] = mp.mcode_to_m(d);
00489 
00490       MRAacoef acoef;
00491       MRAclevel clevel;
00492       for( MRAmpBase::iterator itmp=mp.begin(); itmp < mp.end(); ++itmp ) {
00493          acoef = *itmp;
00494 //         cout << "   " << acoef.a[0] << ":" << float(acoef.bpcoef)  << ' ' 
00495 //              << castc(acoef.bpcoef) << endl;
00496          clevel = castc(acoef.bpcoef);
00497          if ( clevel <= crange ) mp2.append( acoef.a, acoef.bpcoef );
00498       }
00499 
00500       mp2.fix_mp();
00501 
00502       append(mp2);
00503    }
00504 
00505    fix_sb();
00506 
00507    return *this;
00508 }
00509 
00510 inline
00511 MRAsbBase& MRAsbBase::copy( MRAsbBase& sb, MRAmrange mrange, MRAcrange crange ) 
00512 {
00513 //this should becom part of class
00514    int (*castc)( bytepack );
00515    if ( _datatypecode == DataTypeCode_type<float>::code() ) {
00516       castc = castc_float;
00517 cout << "cast as float\n";
00518    } else if ( _datatypecode == DataTypeCode_type<double>::code() ) {
00519       castc = castc_double;
00520 cout << "cast as double\n";
00521    } else {
00522       castc = 0;
00523    }
00524 
00525    if ( !sb.good() ) {
00526       clrstate(goodbit), setstate(failbit);
00527       return *this;
00528    }
00529    clear();
00530    _mpenc = sb._mpenc;
00531    _sbsizeb = 0;
00532    set_sbn( sb.sbn() );
00533    set_mspec( sb.mspec() );
00534    set_cspec( sb.cspec() );
00535    set_cspec( crange * sb.cspec().cthis );
00536    set_datatypecode( sb.datatypecode() );
00537    _process_sizeb = sb.process_sizeb();
00538    _process_method = sb.process_method();
00539    for(int i = 0; i < _process_sizeb - 3; ++i ) { _process[i] = sb.process(i);} 
00540    fix_hdr();
00541 
00542    MRAmlevel mlevel( _mpenc.grid_dim() );
00543    MRAmp mp;
00544    MRAmp mp2(_mpenc);
00545    for( MRAsbBase::iterator iter = sb.begin(); iter < sb.end(); ++iter ) {
00546       mp = *iter;
00547       mp2 = mp;
00548       mp2.set_empty();
00549       mp2.fix_hdr();
00550       for(int d=0; d < _mpenc.grid_dim(); ++d) mlevel[d] = mp.mcode_to_m(d);
00551       if ( mlevel <= mrange ) {
00552          MRAacoef acoef;
00553          MRAclevel clevel;
00554          for( MRAmpBase::iterator itmp=mp.begin(); itmp < mp.end(); ++itmp ) {
00555          acoef = *itmp;
00556 //         cout << "   " << acoef.a[0] << ":" << float(acoef.bpcoef)  << ' ' 
00557 //              << castc(acoef.bpcoef) << endl;
00558             clevel = castc(acoef.bpcoef);
00559             if ( clevel <= crange ) mp2.append( acoef.a, acoef.bpcoef );
00560          }
00561 
00562          mp2.fix_mp();
00563 
00564          append(mp2);
00565       }
00566    }
00567 
00568    fix_sb();
00569 
00570    return *this;
00571 }
00572 
00573 inline
00574 bool MRAsbBase::is_equal( const MRAsbBase& sb ) 
00575 {
00576    if ( this != &sb ) {
00577       if ( _state != sb._state ) return false;
00578       if ( _mpenc != sb._mpenc ) return false;
00579       if ( _sbsizeb != sb._sbsizeb ) return false;
00580       if ( _sbn != sb._sbn ) return false;
00581       if ( _mspec != sb._mspec ) return false;
00582       if ( _cspec != sb._cspec ) return false;
00583       if ( _datatypecode != sb._datatypecode ) return false;
00584       if ( _process_sizeb != sb._process_sizeb ) return false;
00585       if ( _process_method != sb._process_method ) return false;
00586       for( int i = 0; i < _process_sizeb - 3; ++i ) {
00587          if ( _process[i] != sb._process[i] ) return false;
00588       }
00589       int mark = _ptbuffer->tellg();
00590       int sbmark = sb._ptbuffer->tellg();
00591       _ptbuffer->seekg(0);
00592       sb._ptbuffer->seekg(0);
00593       for( int i = 0; i < process_sizeb() - 3; ++i ) {
00594          if ( _ptbuffer->get() != sb._ptbuffer->get() ) return false;
00595       }
00596       _ptbuffer->seekg(mark);
00597       sb._ptbuffer->seekg(sbmark);
00598    }
00599    return true;
00600 }
00601 
00602 inline
00603 bool MRAsbBase::operator == ( const MRAsbBase& rhs ) { return is_equal(rhs); }
00604 
00605 inline
00606 bool MRAsbBase::operator != ( const MRAsbBase& rhs ) { return !is_equal(rhs); }
00607 
00608 inline
00609 void MRAsbBase::clear() { _state = goodbit; }
00610 
00611 inline
00612 void MRAsbBase::setstate( int s ) { _state |= s; }
00613 
00614 inline
00615 void MRAsbBase::clrstate( int s ) { _state &= ~s; }
00616 
00617 inline
00618 int MRAsbBase::rdstate( int s ) { return (_state & s); }
00619 
00620 inline
00621 bool MRAsbBase::good() { return rdstate(goodbit) != 0; }
00622 
00623 inline
00624 bool MRAsbBase::fail() { return rdstate(failbit) != 0; }
00625 
00626 inline
00627 bool MRAsbBase::baddim() { return rdstate(baddimbit) != 0; }
00628 
00629 inline
00630 bool MRAsbBase::frag() { return rdstate(fragbit) != 0; }
00631 
00632 inline
00633 bool MRAsbBase::hdrfixed() { return rdstate(hdrfixedbit) != 0; }
00634 
00635 inline
00636 bool MRAsbBase::sbfixed() { return rdstate(sbfixedbit) != 0; }
00637 
00638 inline
00639 MRAsbBase& MRAsbBase::set_null() 
00640 { 
00641    _state = 0;
00642    _mpenc.set_null();
00643    _sbsizeb = 0;
00644    _sbn(0);
00645    _mspec(0);
00646    _datatypecode = 0;
00647    _process_sizeb = 3;
00648    _process_method = 0;
00649    _ptbuffer->erase();
00650    return *this;
00651 }
00652 
00653 inline
00654 bool MRAsbBase::is_null() { return (_sbsizeb == 0); }
00655 
00656 inline
00657 bool MRAsbBase::operator ! () { return is_null(); }
00658 
00659 inline
00660 MRAsbBase& MRAsbBase::set_empty() 
00661 { 
00662    clear();
00663    _ptbuffer->erase();
00664    fix_hdr();
00665    fix_sb();
00666    return *this;
00667 }
00668 
00669 inline
00670 void MRAsbBase::fix_hdr() { 
00671    if ( !hdrfixed() ) {
00672       bytepack bp;
00673       setstate(hdrfixedbit);
00674       _sbsizeb = hdrsizeb();
00675       _ptbuffer->seekp(0);
00676       _ptbuffer->write( bp( 0, 4 ) );
00677 
00678       *_ptbuffer << _mpenc;
00679       *_ptbuffer << _sbn;
00680       *_ptbuffer << _mspec;
00681       *_ptbuffer << _cspec;
00682 
00683       _ptbuffer->write( bp( _datatypecode, 1 ) );
00684       _ptbuffer->write( bp( _process_sizeb, 1 ) );
00685       _ptbuffer->write( bp( _process_method, 1 ) );
00686       for( int i = 0; i < _process_sizeb - 3; ++i ) {
00687          _ptbuffer->put( _process[i] );
00688       }
00689       _ptbuffer->write( bp( process_sizeb(), 1 ) );
00690    }
00691    else { setstate(failbit); }
00692 }
00693 
00694 inline
00695 void MRAsbBase::fix_sb()
00696 {
00697    if ( hdrfixed() && !sbfixed() ) {
00698       bytepack bp;
00699       append_null();
00700       setstate(sbfixedbit);
00701       _sbsizeb += 4;
00702       _ptbuffer->write( bp( _sbsizeb, 4 ) );
00703       _ptbuffer->seekp(0);
00704       _ptbuffer->write( bp( _sbsizeb, 4 ) );
00705       _ptbuffer->seekp(0,BufferBase::end);
00706    }
00707    else { setstate(failbit); }
00708 }
00709 
00710 inline
00711 void MRAsbBase::unfix_sb()
00712 {
00713    if ( hdrfixed() && sbfixed() ) {
00714       bytepack bp;
00715       _ptbuffer->seekp(0);
00716       _ptbuffer->write( bp( 0, 4 ) );
00717       MRAmp mp( _mpenc );
00718       _sbsizeb -= ( mp.nullsizeb() + 4 );
00719       _ptbuffer->seekp( _sbsizeb );
00720       clrstate(sbfixedbit);
00721    }
00722    else { setstate(failbit); }
00723 }
00724 
00725 inline
00726 void MRAsbBase::refix_hdr() { 
00727    if ( hdrfixed() ) {
00728       bytepack bp;
00729 //      setstate(hdrfixedbit);
00730 //      _sbsizeb = hdrsizeb();
00731       int save_putpos = _ptbuffer->tellp();
00732       _ptbuffer->seekp(0);
00733 
00734       if ( sbfixed() ) _ptbuffer->write( bp( _sbsizeb, 4 ) );
00735       else _ptbuffer->write( bp( 0, 4 ) );
00736 
00737       *_ptbuffer << _mpenc;
00738       *_ptbuffer << _sbn;
00739       *_ptbuffer << _mspec;
00740       *_ptbuffer << _cspec;
00741 
00742       _ptbuffer->write( bp( _datatypecode, 1 ) );
00743 
00744 // *** REWRITING process IS VERY DANGEROUS AND SHOULD NOT
00745 // *** BE DONE.  MORE REASON FOR CLASS REDESIGN
00746 //      _ptbuffer->write( bp( _process_sizeb, 1 ) );
00747 //      _ptbuffer->write( bp( _process_method, 1 ) );
00748 //      for( int i = 0; i < _process_sizeb - 3; ++i ) {
00749 //         _ptbuffer->put( _process[i] );
00750 //      }
00751 //      _ptbuffer->write( bp( process_sizeb(), 1 ) );
00752 
00753       _ptbuffer->seekp(save_putpos);
00754  
00755    }
00756    else { setstate(failbit); }
00757 }
00758 
00759 inline
00760 void MRAsbBase::set_sbn()
00761 {
00762    _sbn = 0;
00763    if ( hdrfixed() ) refix_hdr();
00764 }
00765 
00766 inline
00767 void MRAsbBase::set_sbn( const MRAsbn& sbn ) 
00768 { 
00769    _sbn = sbn;
00770    if ( hdrfixed() ) refix_hdr();
00771 }
00772 
00773 inline
00774 void MRAsbBase::set_sbn( int sbn )
00775 {
00776    _sbn = sbn;
00777    if ( hdrfixed() ) refix_hdr();
00778 }
00779 
00780 inline
00781 void MRAsbBase::set_mspec()
00782 {
00783    _mspec.mthis.mmin = MRAmlevel::mmin_limit;
00784    _mspec.mthis.mmax = MRAmlevel::mmax_limit;
00785 
00786    _mspec.mexist.mmin = MRAmlevel::mmin_limit;
00787    _mspec.mexist.mmax = MRAmlevel::mmax_limit;
00788 
00789    _mspec.mtheory.mmin = MRAmlevel::mmin_limit;
00790    _mspec.mtheory.mmax = MRAmlevel::mmax_limit;
00791    
00792    if ( hdrfixed() ) refix_hdr();
00793 }
00794 
00795 inline
00796 void MRAsbBase::set_mspec( const MRAmspec& mspec ) 
00797 { 
00798    _mspec = mspec; 
00799    if ( hdrfixed() ) refix_hdr();
00800 }
00801 
00802 inline
00803 void MRAsbBase::set_mspec( 
00804   const MRAmrange& mthis, const MRAmrange& mexist, const MRAmrange& mtheory
00805 )
00806 {
00807    _mspec.mthis = mthis;
00808    _mspec.mexist = mexist;
00809    _mspec.mtheory = mtheory;
00810    if ( hdrfixed() ) refix_hdr();
00811 }
00812 
00813 inline
00814 void MRAsbBase::set_mspec( const MRAmrange& mthis )
00815 {
00816    _mspec.mthis = mthis;
00817    if ( hdrfixed() ) refix_hdr();
00818 }
00819 
00820 inline
00821 void MRAsbBase::set_cspec()
00822 {
00823    _cspec.cthis.cmin = MRAclevel::cmin_limit;
00824    _cspec.cthis.cmax = MRAclevel::cmax_limit;
00825 
00826    _cspec.cexist.cmin = MRAclevel::cmin_limit;
00827    _cspec.cexist.cmax = MRAclevel::cmax_limit;
00828 
00829    _cspec.ctheory.cmin = MRAclevel::cmin_limit;
00830    _cspec.ctheory.cmax = MRAclevel::cmax_limit;
00831    if ( hdrfixed() ) refix_hdr();
00832 }
00833 
00834 inline
00835 void MRAsbBase::set_cspec( const MRAcspec& cspec ) 
00836 { 
00837    _cspec = cspec; 
00838    if ( hdrfixed() ) refix_hdr();
00839 }
00840 
00841 inline
00842 void MRAsbBase::set_cspec( 
00843   const MRAcrange& cthis, const MRAcrange& cexist, const MRAcrange& ctheory
00844 )
00845 {
00846    _cspec.cthis = cthis;
00847    _cspec.cexist = cexist;
00848    _cspec.ctheory = ctheory;
00849    if ( hdrfixed() ) refix_hdr();
00850 }
00851 
00852 inline
00853 void MRAsbBase::set_cspec( const MRAcrange& cthis )
00854 {
00855    _cspec.cthis = cthis;
00856    if ( hdrfixed() ) refix_hdr();
00857 }
00858 
00859 inline
00860 void MRAsbBase::set_datatypecode( int datatypecode ) 
00861 {
00862    _datatypecode = datatypecode;
00863    if ( hdrfixed() ) refix_hdr();
00864 }
00865 
00866 inline
00867 void MRAsbBase::write( BufferBase& buffer )
00868 {
00869    bytepack bp;
00870    _ptbuffer->erase();
00871    buffer >> bp(0,4); _sbsizeb = int(bp);
00872    _ptbuffer->write(bp);
00873    if ( _sbsizeb == 0 ) { 
00874       _ptbuffer->write(bp); 
00875    }
00876    else if ( _sbsizeb != -1 ) { 
00877       for( int i = 4; i < _sbsizeb; ++i ) _ptbuffer->put( buffer.get() );
00878    } else { 
00879       recover(buffer); 
00880    }
00881    clear();
00882    setstate(hdrfixedbit);
00883    setstate(sbfixedbit);
00884    synchronize();
00885 }
00886 
00887 inline
00888 MRAsbBase& MRAsbBase::operator << ( BufferBase& buffer ) 
00889 {
00890    write(buffer);
00891    return *this;
00892 }
00893 
00894 inline
00895 void MRAsbBase::read( BufferBase& buffer )
00896 {
00897    if ( !is_null() ) {
00898       _ptbuffer->seekg(0);
00899       for( int i = 0; i < _sbsizeb; ++i ) {
00900          buffer.put( _ptbuffer->get() );
00901       }
00902    }
00903    else {
00904       bytepack bp;
00905       buffer << bp(0,4);
00906       buffer << bp(0,4);
00907    }
00908 }
00909 
00910 inline
00911 MRAsbBase& MRAsbBase::operator >> ( BufferBase& buffer ) 
00912 {
00913    read(buffer);
00914    return *this;
00915 }
00916 
00917 inline
00918 void MRAsbBase::write( istream& is )
00919 {
00920    bytepack bp;
00921    _ptbuffer->erase();
00922    is >> bp(0,4); _sbsizeb = int(bp);
00923    _ptbuffer->write(bp);
00924    if ( _sbsizeb == 0 ) { _ptbuffer->write(bp); }
00925    else {
00926       if ( _sbsizeb != -1 ) {
00927          for( int i = 4; i < _sbsizeb; ++i ) _ptbuffer->put( is.get() );
00928       }
00929       else {
00930          recover(is);   
00931       }
00932    }
00933    clear();
00934    setstate(hdrfixedbit);
00935    setstate(sbfixedbit);
00936    synchronize();
00937 }
00938 
00939 inline
00940 void MRAsbBase::read( ostream& os )
00941 {
00942    if ( !is_null() ) {
00943       _ptbuffer->seekg(0);
00944       for( int i = 0; i < _sbsizeb; ++i ) {
00945          os.put( _ptbuffer->get() );
00946       }
00947    }
00948    else {
00949       bytepack bp;
00950       os << bp(0,4);
00951       os << bp(0,4);
00952    }
00953 }
00954 
00955 inline
00956 void MRAsbBase::recover( BufferBase& buffer ) { 
00957       bytepack bp;
00958       buffer >> _mpenc;
00959       *_ptbuffer << _mpenc;
00960 //      _mpenc.report();
00961 
00962       _sbn( _mpenc.grid_dim() );
00963       buffer >> _sbn; *_ptbuffer << _sbn;
00964 
00965       _mspec( _mpenc.grid_dim() );
00966       buffer >> _mspec; *_ptbuffer << _mspec;
00967 
00968       buffer >> _cspec; *_ptbuffer << _cspec;
00969 
00970       buffer >>  bp( 0, 1 ); _datatypecode = int(bp);
00971       _ptbuffer->write( bp( _datatypecode, 1 ) );
00972       buffer >>  bp( 0, 1 ); _process_sizeb = int(bp);
00973       _ptbuffer->write( bp( _process_sizeb, 1 ) );
00974       buffer >>  bp( 0, 1 ); _process_method = int(bp);
00975       _ptbuffer->write( bp( _process_method, 1 ) );
00976       for( int i = 0; i < _process_sizeb - 3; ++i ) {
00977          buffer.get( _process[i] );
00978          _ptbuffer->put( _process[i] );
00979       }
00980       buffer >>  bp( 0, 1 ); int tmp = int(bp);
00981       _ptbuffer->write( bp( tmp, 1 ) );
00982 
00983       _sbsizeb = hdrsizeb();
00984       int mpsizeb;
00985       do { 
00986          buffer >> bp( 0, _mpenc.bplen_mpsizeb() ); mpsizeb = int(bp);
00987          _ptbuffer->write( bp( mpsizeb, _mpenc.bplen_mpsizeb() ) );
00988          if ( mpsizeb != 0 ) {
00989             for( int i = 0; i < mpsizeb - _mpenc.bplen_mpsizeb(); ++i ) {
00990                _ptbuffer->put( buffer.get() );
00991             }
00992             _sbsizeb += mpsizeb;
00993          }
00994          else {
00995             buffer >> bp( 0, _mpenc.bplen_mpsizeb() );
00996             _ptbuffer->write( bp( 0, _mpenc.bplen_mpsizeb() ) );
00997             _sbsizeb += 2 * _mpenc.bplen_mpsizeb();
00998          }
00999       } while ( mpsizeb != 0 );
01000       buffer >> bp( 0, 4 );
01001       _sbsizeb += 4;
01002       _ptbuffer->write( bp( _sbsizeb, 4 ) );
01003       synchronize();
01004 }
01005 inline
01006 void MRAsbBase::recover( istream& is ) { 
01007       bytepack bp;
01008       is >> _mpenc;
01009       *_ptbuffer << _mpenc;
01010 //      _mpenc.report();
01011 
01012       _sbn( _mpenc.grid_dim() );
01013       is >> _sbn; *_ptbuffer << _sbn;
01014 
01015       _mspec( _mpenc.grid_dim() );
01016       is >> _mspec; *_ptbuffer << _mspec;
01017 
01018       is >> _cspec; *_ptbuffer << _cspec;
01019 
01020       is >>  bp( 0, 1 ); _datatypecode = int(bp);
01021       _ptbuffer->write( bp( _datatypecode, 1 ) );
01022       is >>  bp( 0, 1 ); _process_sizeb = int(bp);
01023       _ptbuffer->write( bp( _process_sizeb, 1 ) );
01024       is >>  bp( 0, 1 ); _process_method = int(bp);
01025       _ptbuffer->write( bp( _process_method, 1 ) );
01026       for( int i = 0; i < _process_sizeb - 3; ++i ) {
01027          is.get( _process[i] );
01028          _ptbuffer->put( _process[i] );
01029       }
01030       is >>  bp( 0, 1 ); int tmp = int(bp);
01031       _ptbuffer->write( bp( tmp, 1 ) );
01032 
01033       _sbsizeb = hdrsizeb();
01034       int mpsizeb;
01035       do { 
01036          is >> bp( 0, _mpenc.bplen_mpsizeb() ); mpsizeb = int(bp);
01037          _ptbuffer->write( bp( mpsizeb, _mpenc.bplen_mpsizeb() ) );
01038          if ( mpsizeb != 0 ) {
01039             for( int i = 0; i < mpsizeb - _mpenc.bplen_mpsizeb(); ++i ) {
01040                _ptbuffer->put( is.get() );
01041             }
01042             _sbsizeb += mpsizeb;
01043          }
01044          else {
01045             is >> bp( 0, _mpenc.bplen_mpsizeb() );
01046             _ptbuffer->write( bp( 0, _mpenc.bplen_mpsizeb() ) );
01047             _sbsizeb += 2 * _mpenc.bplen_mpsizeb();
01048          }
01049       } while ( mpsizeb != 0 );
01050       is >> bp( 0, 4 );
01051       _sbsizeb += 4;
01052       _ptbuffer->write( bp( _sbsizeb, 4 ) );
01053       synchronize();
01054 }
01055 
01056 
01057 inline
01058 MRAmpEncode& MRAsbBase::mpenc() { return _mpenc; }
01059 
01060 inline
01061 int MRAsbBase::sbsizeb() { return _sbsizeb; }
01062 
01063 inline
01064 MRAsbn& MRAsbBase::sbn() { return _sbn; }
01065 
01066 inline
01067 MRAmspec& MRAsbBase::mspec() { return _mspec; }
01068 
01069 inline
01070 MRAcspec& MRAsbBase::cspec() { return _cspec; }
01071 
01072 inline
01073 int MRAsbBase::datatypecode() { return _datatypecode; }
01074 
01075 inline
01076 int MRAsbBase::process_sizeb() { return _process_sizeb; }
01077 
01078 inline
01079 int MRAsbBase::process_method() { return _process_method; }
01080 
01081 inline
01082 char* MRAsbBase::process() { return _process; }
01083 
01084 inline
01085 char MRAsbBase::process( int i ) { return _process[i]; }
01086 
01087 inline
01088 int MRAsbBase::hdrsizeb() 
01089 {
01090    return 5 + _mpenc.sizeb() + _sbn.sizeb()
01091             + _mspec.sizeb() + _cspec.sizeb() 
01092             + _process_sizeb;
01093 }
01094 
01095 inline
01096 bool MRAsbBase::mmatch( MRAmrange mrange, MRAmpBase& mp )
01097 {
01098    MRAmlevel tmpmlevel( _mpenc.grid_dim() );
01099    for(int d = 0; d < _mpenc.grid_dim(); ++d ) tmpmlevel[d] = mp.mcode_to_m(d);
01100    return ( tmpmlevel <= mrange  );
01101 }
01102 
01103 inline
01104 MRAsbBase& MRAsbBase::append( MRAmpBase& mp )
01105 {
01106    if ( hdrfixed() && !sbfixed() ) {
01107       if ( _mpenc == mp.mpenc() ) {
01108          mp.read( *_ptbuffer );
01109          _sbsizeb += mp.mpsizeb();
01110       }
01111       else { setstate(failbit); }
01112    }
01113    else { setstate(failbit); }
01114    return *this;
01115 }
01116 
01117 inline
01118 MRAsbBase& MRAsbBase::append_null()
01119 {
01120    if ( hdrfixed() && !sbfixed() ) {
01121       MRAmp mp( mpenc() );
01122       mp.set_null();
01123       mp.read( *_ptbuffer ); 
01124       _sbsizeb += mp.nullsizeb();
01125    }
01126    else { setstate(failbit); }
01127    return *this;
01128 }
01129 
01130 inline
01131 MRAsbBase& MRAsbBase::append( MRAsbBase& sb ) 
01132 {
01133    if ( !sb.good() ) {
01134       clrstate(goodbit), setstate(failbit);
01135       return *this;
01136    }
01137    if ( _mpenc != sb._mpenc ) {
01138       clrstate(goodbit), setstate(failbit);
01139       return *this;
01140    }
01141    if ( _sbn != sb._sbn ) {
01142       clrstate(goodbit), setstate(failbit);
01143       return *this;
01144    }
01145 //   if ( !connected( _mspec.mthis, sb._mspec.mthis ) ) {
01146 //      clrstate(goodbit), setstate(failbit); setstate(fragbit);
01147 //      return *this;
01148 //   }
01149 //   if ( !disjoint( _mspec.mthis, sb._mspec.mthis ) ) {
01150 //      clrstate(goodbit), setstate(failbit); setstate(fragbit);
01151 //      return *this;
01152 //   }
01153    if ( _datatypecode != sb._datatypecode ) {
01154       clrstate(goodbit), setstate(failbit);
01155       return *this;
01156    }
01157    if ( _process_sizeb != sb._process_sizeb) {
01158       clrstate(goodbit), setstate(failbit);
01159       return *this;
01160    }
01161    if ( _process_method != sb._process_method) {
01162       clrstate(goodbit), setstate(failbit);
01163       return *this;
01164    }
01165    for( int i = 0; i < _process_sizeb - 3; ++i ) {
01166       if ( _process[i] != sb._process[i] ) {
01167          clrstate(goodbit), setstate(failbit);
01168          return *this;
01169       }
01170    }
01171  
01172    unfix_sb();
01173 
01174    MRAmp mp;
01175    for( MRAsbBase::iterator iter = sb.begin(); iter < sb.end(); ++iter ) {
01176       mp = *iter;
01177       append(mp);
01178    }
01179 
01180    fix_sb();
01181 
01182    set_mspec( _mspec.mthis + sb._mspec.mthis );
01183 
01184    return *this;
01185 }
01186 
01187 inline
01188 MRAsbBase& MRAsbBase::append( MRAsbBase& sb, MRAmrange mrange ) 
01189 {
01190    if ( !sb.good() ) {
01191       clrstate(goodbit), setstate(failbit);
01192       return *this;
01193    }
01194    if ( _mpenc != sb._mpenc ) {
01195       clrstate(goodbit), setstate(failbit);
01196       return *this;
01197    }
01198    if ( _sbn != sb._sbn ) {
01199       clrstate(goodbit), setstate(failbit);
01200       return *this;
01201    }
01202 //   if ( !connected( _mspec.mthis, mrange*sb._mspec.mthis ) ) {
01203 //      clrstate(goodbit), setstate(failbit); setstate(fragbit);
01204 //      return *this;
01205 //   }
01206 //   if ( !disjoint( _mspec.mthis, mrange*sb._mspec.mthis ) ) {
01207 //      clrstate(goodbit), setstate(failbit); setstate(fragbit);
01208 //      return *this;
01209 //   }
01210    if ( _datatypecode != sb._datatypecode ) {
01211       clrstate(goodbit), setstate(failbit);
01212       return *this;
01213    }
01214    if ( _process_sizeb != sb._process_sizeb) {
01215       clrstate(goodbit), setstate(failbit);
01216       return *this;
01217    }
01218    if ( _process_method != sb._process_method) {
01219       clrstate(goodbit), setstate(failbit);
01220       return *this;
01221    }
01222    for( int i = 0; i < _process_sizeb - 3; ++i ) {
01223       if ( _process[i] != sb._process[i] ) {
01224          clrstate(goodbit), setstate(failbit);
01225          return *this;
01226       }
01227    }
01228   
01229    unfix_sb();
01230 
01231    MRAmlevel mlevel( _mpenc.grid_dim() );
01232    MRAmp mp;
01233    for( MRAsbBase::iterator iter = sb.begin(); iter < sb.end(); ++iter ) {
01234       mp = *iter;
01235       for(int d=0; d < _mpenc.grid_dim(); ++d) mlevel[d] = mp.mcode_to_m(d);
01236       if ( mlevel <= mrange ) append(mp);
01237    }
01238 
01239    fix_sb();
01240 
01241    set_mspec( _mspec.mthis + mrange * sb._mspec.mthis );
01242 
01243    return *this;
01244 }
01245 
01246 inline
01247 MRAsbBase& MRAsbBase::append( MRAsbBase& sb, MRAcrange crange ) 
01248 {
01249 //this should becom part of class
01250    int (*castc)( bytepack );
01251    if ( _datatypecode == DataTypeCode_type<float>::code() ) {
01252       castc = castc_float;
01253    } else if ( _datatypecode == DataTypeCode_type<double>::code() ) {
01254       castc = castc_double;
01255    } else {
01256       castc = 0;
01257    }
01258 
01259    if ( !sb.good() ) {
01260       clrstate(goodbit), setstate(failbit);
01261       return *this;
01262    }
01263    if ( _mpenc != sb._mpenc ) {
01264       clrstate(goodbit), setstate(failbit);
01265       return *this;
01266    }
01267    if ( _sbn != sb._sbn ) {
01268       clrstate(goodbit), setstate(failbit);
01269       return *this;
01270    }
01271 //   if ( !connected( _mspec.mthis, mrange*sb._mspec.mthis ) ) {
01272 //      clrstate(goodbit), setstate(failbit); setstate(fragbit);
01273 //      return *this;
01274 //   }
01275 //   if ( !disjoint( _mspec.mthis, mrange*sb._mspec.mthis ) ) {
01276 //      clrstate(goodbit), setstate(failbit); setstate(fragbit);
01277 //      return *this;
01278 //   }
01279    if ( _datatypecode != sb._datatypecode ) {
01280       clrstate(goodbit), setstate(failbit);
01281       return *this;
01282    }
01283    if ( _process_sizeb != sb._process_sizeb) {
01284       clrstate(goodbit), setstate(failbit);
01285       return *this;
01286    }
01287    if ( _process_method != sb._process_method) {
01288       clrstate(goodbit), setstate(failbit);
01289       return *this;
01290    }
01291    for( int i = 0; i < _process_sizeb - 3; ++i ) {
01292       if ( _process[i] != sb._process[i] ) {
01293          clrstate(goodbit), setstate(failbit);
01294          return *this;
01295       }
01296    }
01297   
01298    unfix_sb();
01299 
01300 //   MRAmlevel mlevel( _mpenc.grid_dim() );
01301 //   MRAmp mp;
01302 //   for( MRAsbBase::iterator iter = sb.begin(); iter < sb.end(); ++iter ) {
01303 //      mp = *iter;
01304 //      for(int d=0; d < _mpenc.grid_dim(); ++d) mlevel[d] = mp.mcode_to_m(d);
01305 //      if ( mlevel <= mrange ) append(mp);
01306 //   }
01307 
01308    MRAmlevel mlevel( _mpenc.grid_dim() );
01309    MRAmp mp;
01310    MRAmp mp2(_mpenc);
01311    for( MRAsbBase::iterator iter = sb.begin(); iter < sb.end(); ++iter ) {
01312       mp = *iter;
01313       mp2 = mp;
01314       mp2.set_empty();
01315       mp2.fix_hdr();
01316       for(int d=0; d < _mpenc.grid_dim(); ++d) mlevel[d] = mp.mcode_to_m(d);
01317 
01318       MRAacoef acoef;
01319       MRAclevel clevel;
01320       for( MRAmpBase::iterator itmp=mp.begin(); itmp < mp.end(); ++itmp ) {
01321          acoef = *itmp;
01322 //         cout << "   " << acoef.a[0] << ":" << float(acoef.bpcoef)  << ' ' 
01323 //              << castc(acoef.bpcoef) << endl;
01324          clevel = castc(acoef.bpcoef);
01325          if ( clevel <= crange ) mp2.append( acoef.a, acoef.bpcoef );
01326       }
01327 
01328       mp2.fix_mp();
01329 
01330       append(mp2);
01331    }
01332 
01333 
01334    fix_sb();
01335 
01336 //   set_mspec( _mspec.mthis + mrange * sb._mspec.mthis );
01337    set_cspec( _cspec.cthis + crange * sb._cspec.cthis );
01338 
01339    return *this;
01340 }
01341 
01342 inline
01343 MRAsbBase& MRAsbBase::append(MRAsbBase& sb, MRAmrange mrange, MRAcrange crange) 
01344 {
01345 //this should becom part of class
01346    int (*castc)( bytepack );
01347    if ( _datatypecode == DataTypeCode_type<float>::code() ) {
01348       castc = castc_float;
01349    } else if ( _datatypecode == DataTypeCode_type<double>::code() ) {
01350       castc = castc_double;
01351    } else {
01352       castc = 0;
01353    }
01354 
01355    if ( !sb.good() ) {
01356       clrstate(goodbit), setstate(failbit);
01357       return *this;
01358    }
01359    if ( _mpenc != sb._mpenc ) {
01360       clrstate(goodbit), setstate(failbit);
01361       return *this;
01362    }
01363    if ( _sbn != sb._sbn ) {
01364       clrstate(goodbit), setstate(failbit);
01365       return *this;
01366    }
01367 //   if ( !connected( _mspec.mthis, mrange*sb._mspec.mthis ) ) {
01368 //      clrstate(goodbit), setstate(failbit); setstate(fragbit);
01369 //      return *this;
01370 //   }
01371 //   if ( !disjoint( _mspec.mthis, mrange*sb._mspec.mthis ) ) {
01372 //      clrstate(goodbit), setstate(failbit); setstate(fragbit);
01373 //      return *this;
01374 //   }
01375    if ( _datatypecode != sb._datatypecode ) {
01376       clrstate(goodbit), setstate(failbit);
01377       return *this;
01378    }
01379    if ( _process_sizeb != sb._process_sizeb) {
01380       clrstate(goodbit), setstate(failbit);
01381       return *this;
01382    }
01383    if ( _process_method != sb._process_method) {
01384       clrstate(goodbit), setstate(failbit);
01385       return *this;
01386    }
01387    for( int i = 0; i < _process_sizeb - 3; ++i ) {
01388       if ( _process[i] != sb._process[i] ) {
01389          clrstate(goodbit), setstate(failbit);
01390          return *this;
01391       }
01392    }
01393   
01394    unfix_sb();
01395 
01396 //   MRAmlevel mlevel( _mpenc.grid_dim() );
01397 //   MRAmp mp;
01398 //   for( MRAsbBase::iterator iter = sb.begin(); iter < sb.end(); ++iter ) {
01399 //      mp = *iter;
01400 //      for(int d=0; d < _mpenc.grid_dim(); ++d) mlevel[d] = mp.mcode_to_m(d);
01401 //      if ( mlevel <= mrange ) append(mp);
01402 //   }
01403    MRAmlevel mlevel( _mpenc.grid_dim() );
01404    MRAmp mp;
01405    MRAmp mp2(_mpenc);
01406    for( MRAsbBase::iterator iter = sb.begin(); iter < sb.end(); ++iter ) {
01407       mp = *iter;
01408       mp2 = mp;
01409       mp2.set_empty();
01410       mp2.fix_hdr();
01411       for(int d=0; d < _mpenc.grid_dim(); ++d) mlevel[d] = mp.mcode_to_m(d);
01412       if ( mlevel <= mrange ) {
01413          MRAacoef acoef;
01414          MRAclevel clevel;
01415          for( MRAmpBase::iterator itmp=mp.begin(); itmp < mp.end(); ++itmp ) {
01416          acoef = *itmp;
01417 //         cout << "   " << acoef.a[0] << ":" << float(acoef.bpcoef)  << ' ' 
01418 //              << castc(acoef.bpcoef) << endl;
01419             clevel = castc(acoef.bpcoef);
01420             if ( clevel <= crange ) mp2.append( acoef.a, acoef.bpcoef );
01421          }
01422 
01423          mp2.fix_mp();
01424 
01425          append(mp2);
01426       }
01427    }
01428 
01429 
01430    fix_sb();
01431 
01432    set_mspec( _mspec.mthis + mrange * sb._mspec.mthis );
01433    set_cspec( _cspec.cthis + crange * sb._cspec.cthis );
01434 
01435    return *this;
01436 }
01437 
01438 inline
01439 MRAsbBase::iterator MRAsbBase::begin() 
01440 {
01441    iterator iter(this);
01442    if ( hdrfixed() && sbfixed() ) {
01443       iter._pos = hdrsizeb();
01444    } else {
01445       iter.set_null();
01446    }
01447    return iter;
01448 }
01449 
01450 inline
01451 MRAsbBase::iterator MRAsbBase::end() 
01452 {
01453    iterator iter(this);
01454    if ( hdrfixed() && sbfixed() ) {
01455       iter._pos = _sbsizeb - 4 - _mpenc.bplen_mpsizeb() * 2;
01456    }  else {
01457       iter.set_null();
01458    }
01459    return iter;
01460 }
01461 
01462 inline
01463 void MRAsbBase::synchronize()
01464 {
01465    bytepack bp;
01466    int buffersizeb = _ptbuffer->size();
01467    _ptbuffer->seekg(0);
01468    _ptbuffer->read( bp(0,4) ); _sbsizeb = int(bp);
01469    if ( buffersizeb <= 8 ) { set_null(); }
01470    else {
01471       *_ptbuffer >> _mpenc;
01472 
01473       _sbn( _mpenc.grid_dim() );
01474       *_ptbuffer >> _sbn;
01475 
01476       _mspec( _mpenc.grid_dim() );
01477       *_ptbuffer >> _mspec;
01478 
01479       *_ptbuffer >> _cspec;
01480 
01481       _ptbuffer->read( bp(0,1) ); _datatypecode = int(bp);
01482       _ptbuffer->read( bp(0,1) ); _process_sizeb = int(bp);
01483       _ptbuffer->read( bp(0,1) ); _process_method = int(bp);
01484       for( int i = 0; i < _process_sizeb - 3; ++i ) 
01485          _process[i] = _ptbuffer->get();
01486       _ptbuffer->read( bp(0,1) );
01487       if ( _sbsizeb == -1 ) {
01488          int markp = _ptbuffer->tellp();
01489          int markg = _ptbuffer->tellg();
01490          _ptbuffer->seekg(-4,BufferBase::end);
01491          _ptbuffer->read( bp(0,4) ); _sbsizeb = int(bp);
01492          _ptbuffer->seekp(markp);
01493          _ptbuffer->seekg(markg);
01494       }
01495    }
01496 }
01497 
01498 // ##### MRAsbBase::iterator #####
01499 
01500 inline
01501 MRAsbBase::iterator::iterator( MRAsbBase* ptsb ) 
01502   : _pos(0), _ptsb(ptsb)
01503 {}
01504 
01505 inline
01506 MRAsbBase::iterator::~iterator() { _ptsb = 0; }
01507 
01508 inline
01509 MRAsbBase::iterator& MRAsbBase::iterator::operator ++ ()
01510 { 
01511    if ( !is_null() ) {
01512       MRAmp mp( _ptsb->_mpenc );
01513       int tmppos = _ptsb->_ptbuffer->tellg();
01514       _ptsb->_ptbuffer->seekg(_pos);
01515       mp.write( *(_ptsb->_ptbuffer) );
01516       _pos = _ptsb->_ptbuffer->tellg();
01517       _ptsb->_ptbuffer->seekg(tmppos);
01518    }
01519    return *this; 
01520 }
01521 
01522 inline
01523 MRAmp MRAsbBase::iterator::operator * () 
01524 { 
01525    MRAmp mp;
01526    if ( !is_null() ) {
01527       mp( _ptsb->_mpenc );
01528       int tmppos = _ptsb->_ptbuffer->tellg();
01529       _ptsb->_ptbuffer->seekg(_pos);
01530       mp.write( *(_ptsb->_ptbuffer) );
01531       _ptsb->_ptbuffer->seekg(tmppos);
01532    }
01533    return mp; 
01534 }
01535 
01536 inline
01537 void MRAsbBase::iterator::set_null() { _pos = 0; }
01538 
01539 inline
01540 bool MRAsbBase::iterator::is_null() { return ( _pos == 0 ); }
01541 
01542 inline
01543 bool MRAsbBase::iterator::operator ! () { return is_null(); }
01544 
01545 inline
01546 MRAsbBase::iterator::operator bool() { return !is_null(); }
01547 
01548 inline
01549 bool MRAsbBase::iterator::is_equal( const iterator& iter )
01550 {
01551   return ( _pos == iter._pos );
01552 }
01553 
01554 inline
01555 bool MRAsbBase::iterator::operator == ( const iterator& iter )
01556 {
01557   return is_equal(iter);
01558 }
01559 
01560 inline
01561 bool MRAsbBase::iterator::operator != ( const iterator& iter ) 
01562 { 
01563   return !is_equal(iter);
01564 } 
01565 
01566 inline
01567 bool MRAsbBase::iterator::operator > ( const iterator& iter )
01568 {
01569   return ( _pos > iter._pos );
01570 }
01571 
01572 inline
01573 bool MRAsbBase::iterator::operator < ( const iterator& iter )
01574 {
01575   return ( _pos < iter._pos );
01576 }
01577 
01578 inline
01579 bool MRAsbBase::iterator::operator >= ( const iterator& iter )
01580 {
01581    return ( ( *this > iter ) ||  ( *this == iter ) );
01582 }
01583 
01584 inline
01585 bool MRAsbBase::iterator::operator <= ( const iterator& iter )
01586 {
01587    return ( ( *this < iter ) ||  ( *this == iter ) );
01588 }
01589 
01590 // ##### friends #####
01591 
01592 inline
01593 BufferBase& operator << ( BufferBase& buffer, MRAsbBase& sb ) 
01594 {
01595    sb.read(buffer);
01596    return buffer;
01597 }
01598 
01599 inline
01600 BufferBase& operator>>( BufferBase& buffer, MRAsbBase& sb )
01601 {
01602    sb.write(buffer);
01603    return buffer;
01604 }
01605 
01606 inline
01607 ostream& operator << ( ostream& os, MRAsbBase& sb ) 
01608 {
01609    sb.read(os);
01610    return os;
01611 }
01612 
01613 inline
01614 istream& operator>>( istream& is, MRAsbBase& sb )
01615 {
01616    sb.write(is);
01617    return is;
01618 }
01619 
01620 #endif
01621 

Generated on Mon May 31 21:38:51 2004 for SR2k4 Assembler by doxygen 1.3.6