00001
00002
00003
00004
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
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();
00096
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
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450 inline
00451 MRAsbBase& MRAsbBase::copy( MRAsbBase& sb, MRAcrange crange )
00452 {
00453
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
00495
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
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
00557
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
00730
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
00745
00746
00747
00748
00749
00750
00751
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
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
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
01146
01147
01148
01149
01150
01151
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
01203
01204
01205
01206
01207
01208
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
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
01272
01273
01274
01275
01276
01277
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
01301
01302
01303
01304
01305
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
01323
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
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
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
01368
01369
01370
01371
01372
01373
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
01397
01398
01399
01400
01401
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
01418
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
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
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