#include "precompiled.h" #include "0ad_warning_disable.h" # include "sr_array_pt.h" //====================== SrArrayPtBase ========================== SrArrayPtBase::SrArrayPtBase ( SrClassManagerBase* m ) { _man = m; _man->ref(); } SrArrayPtBase::SrArrayPtBase ( const SrArrayPtBase& a ) { _man = a._man; _man->ref(); *this = a; // calls copy operator } SrArrayPtBase::~SrArrayPtBase () { init (); _man->unref(); // must be called after init()! } void SrArrayPtBase::init () { while ( SrArray::size()>0 ) _man->free ( SrArray::pop() ); } void SrArrayPtBase::size ( int ns ) { int i, s = SrArray::size(); if ( ns>s ) { SrArray::size(ns); for ( i=s; i::set ( i, _man->alloc() ); } else if ( nsfree ( SrArray::get(i) ); SrArray::size(ns); } } void SrArrayPtBase::capacity ( int nc ) { int i, s = SrArray::size(); if ( nc<0 ) nc=0; if ( ncfree ( SrArray::get(i) ); } SrArray::capacity(nc); } void SrArrayPtBase::compress () { capacity ( size() ); } void SrArrayPtBase::swap ( int i, int j ) { void *pti = SrArray::get(i); void *ptj = SrArray::get(j); SrArray::set ( i, ptj ); SrArray::set ( j, pti ); } void SrArrayPtBase::set ( int i, const void* pt ) { SR_ASSERT ( i>=0 && ifree ( SrArray::get(i) ); SrArray::set ( i, _man->alloc(pt) ); } void* SrArrayPtBase::get ( int i ) const { SR_ASSERT ( i>=0 && i::get(i); } const void* SrArrayPtBase::const_get ( int i ) const { SR_ASSERT ( i>=0 && i::const_get(i); } void* SrArrayPtBase::top () const { if ( size()==0 ) return 0; return SrArray::get ( size()-1 ); } void SrArrayPtBase::pop () { if ( size()>0 ) _man->free ( SrArray::pop() ); } void SrArrayPtBase::push () { SrArray::push() = _man->alloc (); } void SrArrayPtBase::insert ( int i, int dp ) { SrArray::insert ( i, dp ); int j; for ( j=0; j::set ( i+j, _man->alloc() ); } void SrArrayPtBase::remove ( int i, int dp ) { int j; for ( j=0; jfree( SrArray::get(i+j) ); SrArray::remove ( i, dp ); } void* SrArrayPtBase::extract ( int i ) { void *pt = SrArray::get(i); SrArray::remove ( i ); return pt; } void SrArrayPtBase::operator = ( const SrArrayPtBase& a ) { init (); // deletes all data SrArray::size ( a.size() ); SrArray::compress(); int i; for ( i=0; i::set ( i, _man->alloc(a[i]) ); } static SrClassManagerBase* StaticManager = 0; // This is not thread safe... static int fcmp ( const void* pt1, const void* pt2 ) { typedef const intptr_t* cint; return StaticManager->compare( (const void*)*cint(pt1), (const void*)*cint(pt2) ); } int SrArrayPtBase::insort ( const void* pt, bool allowdup ) { int pos; pos = SrArray::insort ( (void *const&)pt, (int(*)(void *const *,void *const *))fcmp, allowdup ); if ( pos>=0 ) SrArray::get(pos) = _man->alloc(pt); return pos; } void SrArrayPtBase::sort () { StaticManager = _man; SrArray::sort ( (int(*)(void *const *,void *const *))fcmp ); } int SrArrayPtBase::lsearch ( const void* pt ) const { StaticManager = _man; return SrArray::lsearch ( (void *const&)pt, (int(*)(void *const *,void *const *))fcmp ); } int SrArrayPtBase::bsearch ( const void* pt, int *pos ) { StaticManager = _man; return SrArray::bsearch ( (void *const&)pt, (int(*)(void *const *,void *const *))fcmp, pos ); } void SrArrayPtBase::take_data ( SrArrayPtBase& a ) { size(0); capacity(0); SrArray::take_data(a); } SrOutput& operator<< ( SrOutput& o, const SrArrayPtBase& a ) { int i, m; m = a.size()-1; o << '['; for ( i=0; i<=m; i++ ) { a._man->output ( o, a[i] ); if ( i> ( SrInput& in, SrArrayPtBase& a ) { a.size(0); in.get_token(); while (true) { in.get_token(); if ( in.last_token()[0]==']' ) break; in.unget_token (); a.push (); a._man->input ( in, a.top() ); } return in; } //=========================== EOF ===============================