82 template <
typename ETYPE>
87 ETYPE *next =
new ETYPE[size];
88 const char *info = @encode(ETYPE);
90 memset( next,
'\000', size *
sizeof *next );
91 OOTrace(
@"0x%08lx %s [%lu] 0x%08lx = 0x%08lx %s",
171 template <
typename CNAME>
176 OOClassCtr( CNAME *ptr ) {
186 template <
typename CNAME>
188 class OOClassPtr :
public OOPointer<OOClassCtr<CNAME> *> {
190 class OOClassPtr :
public OOPointer<CNAME *> {
193 if ( !this->pget() ) {
198 return *this->pget()->ptr;
200 return *this->pget();
203 inline void replace(
id val );
207 return this->pset( val );
212 return *this->pset(
new OOClassCtr<CNAME>( cptr ) )->ptr;
214 return *this->pset( cptr );
219 oo_inline OOClassPtr( CNAME *cptr ) { *
this = cptr; }
220 oo_inline OOClassPtr( CNAME &cptr ) { *
this = &cptr; }
221 oo_inline OOClassPtr( NSValue *val ) { *
this = val; }
222 oo_inline OOClassPtr(
const OOClassPtr &val ) { *
this = val.get(); }
223 oo_inline OOClassPtr(
id val,
id next ) {
229 oo_inline OOClassPtr &operator = ( CNAME *cptr ) { cset( cptr );
return *
this; }
230 oo_inline OOClassPtr &operator = ( CNAME &cptr ) { cset( &cptr );
return *
this; }
231 oo_inline OOClassPtr &operator = ( NSValue *val ) { cset( val );
return *
this; }
232 oo_inline OOClassPtr &operator = (
const OOClassPtr &val ) { cset( val.get() );
return *
this; }
234 oo_inline CNAME &cget() {
return calloc(); }
237 oo_inline OOClassPtr<CNAME> operator ~ () {
238 OOClassPtr<CNAME> save = *
this;
261 template <
typename ETYPE>
262 class OOVector :
public OOClassPtr< OOBuffer<ETYPE> > {
271 for (
int i=0 ; i<size ; i++ )
272 (*
this)[i] = array[i];
275 int size = [array count];
277 for (
int i=0 ; i<size ; i++ )
278 (*
this)[i] = [array objectAtIndex:i];
285 return this->cget().used;
288 return size() ? &(*this)[0] : NULL;
291 return begin()+size();
301 return this->cget()[ sub ];
304 (*this)[this->cget().used] = value;
313 template <
typename ETYPE>
327 template <
typename ETYPE>
328 class OOCube :
public OOVector< OOBuffer< OOBuffer<ETYPE> > > {
331 oo_inline OOCube(
const OOCube &val ) { *
this = val; }
332 oo_inline OOCube &operator = ( NSValue *val ) { this->cset( val );
return *
this; }
333 oo_inline OOCube &operator = (
const OOCube &val ) { cset( val.get() );
return *
this; }
346 template <
typename RTYPE>
358 for (
int i=0 ; i<[array count] ; i++ )
359 (*
this)[i] = [array objectAtIndex:i];
367 for (
int i=0 ; i<count ; i++ )
394 for (
int i=0 ; i<[array count] ; i++ )
395 (*
this)[i] = (NSMutableString *)[array objectAtIndex:i];
403 for (
int i=0 ; i<count ; i++ )
411 template <
typename CNAME>
413 template <
typename CNAME>
416 template <
typename CNAME>
417 class OOArcArraySub :
public OOArraySub<OOClassPtr<CNAME> > {
418 friend class OOClassArray<CNAME>;
419 friend class OOArcDictSub<CNAME>;
421 oo_inline OOArcArraySub( OOClassArray<CNAME> *root, NSInteger idx ) :
422 OOArraySub<OOClassPtr<CNAME> >( root, idx ) {
424 oo_inline OOArcArraySub( OOArraySub<NSMutableArray *> *ref, NSInteger sub ) :
425 OOArraySub<OOClassPtr<CNAME> >( ref, sub ) {
427 oo_inline OOArcArraySub( OODictionarySub<NSMutableArray *> *ref, NSInteger sub ) :
428 OOArraySub<OOClassPtr<CNAME> >( ref, sub ) {
432 OOClassPtr<CNAME> tmp( this->
get( NO ), val );
433 return OOArraySub<OOClassPtr<CNAME> >::set( val );
437 oo_inline OOArcArraySub &operator = ( CNAME *ptr ) {
438 this->
set( OOClassPtr<CNAME>( ptr ) );
441 oo_inline OOArcArraySub<CNAME> operator [] (
int sub )
const {
442 return OOArcArraySub<CNAME>( (OOArraySub<NSMutableArray *> *)
this, sub );
444 oo_inline OOArcDictSub<CNAME> operator [] (
id sub )
const {
445 return OOArcDictSub<CNAME>( (OOArraySub<NSMutableDictionary *> *)
this, sub );
447 oo_inline OOArcDictSub<CNAME> operator [] ( CFStringRef sub )
const {
450 oo_inline OOArcDictSub<CNAME> operator [] ( const
char *sub )
const {
451 return (*
this)[(id)*
OOString( sub )];
453 oo_inline OOClassPtr<CNAME> operator ~ () {
454 OOClassPtr<CNAME> save( this->
get( NO ), nil );
455 return OOArraySub<OOClassPtr<CNAME> >::operator ~();
459 template <
typename CNAME>
462 template <
typename CNAME>
463 class OOArcDictSub :
public OODictionarySub<OOClassPtr<CNAME> > {
464 friend class OOClassDict<CNAME>;
465 friend class OOArcArraySub<CNAME>;
467 oo_inline OOArcDictSub(
const OOClassDict<CNAME> *root,
id key ) :
468 OODictionarySub<OOClassPtr<CNAME> >( root, key ) {
470 oo_inline OOArcDictSub( OOArraySub<NSMutableDictionary *> *ref,
id sub ) :
471 OODictionarySub<OOClassPtr<CNAME> >( ref, sub ) {
473 oo_inline OOArcDictSub( OODictionarySub<NSMutableDictionary *> *ref,
id sub ) :
474 OODictionarySub<OOClassPtr<CNAME> >( ref, sub ) {
478 OOClassPtr<CNAME> tmp( this->
get( NO ), val );
479 return OODictionarySub<OOClassPtr<CNAME> >::set( val );
483 oo_inline OOArcDictSub &operator = ( CNAME *ptr ) {
484 this->
set( OOClassPtr<CNAME>( ptr ) );
487 oo_inline OOArcArraySub<CNAME> operator [] (
int sub )
const {
488 return OOArcArraySub<CNAME>( (OODictionarySub<NSMutableArray *> *)
this, sub );
490 oo_inline OOArcDictSub<CNAME> operator [] (
id sub )
const {
491 return OOArcDictSub<CNAME>( (OODictionarySub<NSMutableDictionary *> *)
this, sub );
493 oo_inline OOArcDictSub<CNAME> operator [] ( CFStringRef sub )
const {
496 oo_inline OOArcDictSub<CNAME> operator [] ( const
char *sub )
const {
499 oo_inline OOClassPtr<CNAME> operator ~ () {
500 OOClassPtr<CNAME> save( this->
get( NO ), nil );
501 return OODictionarySub<OOClassPtr<CNAME> >::operator ~();
535 template <
typename CNAME>
536 class OOClassArray :
public OOArray<OOClassPtr<CNAME> > {
540 NSMutableArray *old = !*
this ? nil : this->
get();
541 if ( old && val != old && [old retainCount] == 1 )
549 oo_inline OOClassArray( NSMutableArray *val ) { this->
set( val ); }
550 oo_inline OOClassArray(
const OOClassArray &val ) { this->
set( val.get() ); }
551 oo_inline ~OOClassArray() { this->destruct(); }
553 oo_inline OOArcArraySub<CNAME> operator[] ( NSInteger idx ) {
554 return OOArcArraySub<CNAME>(
this, idx );
556 oo_inline OOArcArraySub<CNAME> operator [] (
long sub )
const {
557 return OOArcArraySub<CNAME>(
this, sub );
560 oo_inline OOClassArray &operator = ( NSMutableArray *val ) { this->
set( val );
return *
this; };
561 oo_inline OOClassArray &operator = ( OOClassArray *val ) { this->
set( val.get() );
return *
this; };
564 while ( [this->
get() count] )
567 oo_inline OOClassArray<CNAME> operator ~ () {
568 OOClassArray<CNAME> save = this->
get();
585 template <
typename CNAME>
586 class OOClassDict :
public OODictionary<OOClassPtr<CNAME> > {
591 NSMutableDictionary *old = !*
this ? nil : this->
get();
592 if ( old && val != old && [old retainCount] == 1 )
600 oo_inline OOClassDict( NSMutableDictionary *val ) { this->
set( val ); }
601 oo_inline OOClassDict(
const OOClassDict &val ) { this->
set( val.get() ); }
602 oo_inline ~OOClassDict() { this->destruct(); }
604 oo_inline OOClassDict &operator = ( NSMutableArray *val ) { this->
set( val );
return *
this; };
605 oo_inline OOClassDict &operator = (
const OOClassDict &val ) { this->
set( val.get() );
return *
this; };
607 oo_inline OOArcDictSub<CNAME> operator[] (
id key )
const {
608 return OOArcDictSub<CNAME>(
this, key );
610 oo_inline OOArcDictSub<CNAME> operator [] (
const char *sub )
const {
614 return (*
this)[*sub];
616 oo_inline OOArcDictSub<CNAME> operator [] (
const CFStringRef sub )
const {
623 for (
id key in [old allKeys] )
626 for (
int i=0 ; i<keys ; i++ )
630 oo_inline OOClassDict<CNAME> operator ~ () {
631 OOClassDict<CNAME> save = this->
get();
637 template <
typename CNAME>
638 inline void OOClassPtr<CNAME>::replace(
id next ) {
639 BOOL isClassValue = [*
this isKindOfClass:[NSValue
class]];
641 if ( next && [next isKindOfClass:[NSValue
class]] )
642 ((OOClassCtr<CNAME> *)[next pointerValue])->ctr++;
643 BOOL shouldDelete = isClassValue ? this->pget()->ctr-- == 1 : !!*
this;
645 BOOL shouldDelete = [*
this retainCount] == 1;
650 if ( isClassValue ) {
655 else if ( [*
this isKindOfClass:[NSArray
class]] )
656 OOClassArray<CNAME>( (id)this->
get() ).clear();
657 else if ( [*
this isKindOfClass:[NSDictionary
class]] )
658 OOClassDict<CNAME>( (id)this->
get() ).clear();
660 OOWarn(
@"Invalid class released %@", NSStringFromClass( [this->
get()
class] ) );
666 template <
typename CNAME>
669 template <
typename CNAME>
671 friend class OOCounted<CNAME>;
676 this->references = 1;
683 if ( --references == 0 ) {
690 template <
typename CNAME>
692 OOCounter<CNAME> *counter;
698 counter =
new OOCounter<CNAME>( ptr );
700 oo_inline OOCounted(
const OOCounted &counted ) {
701 counter = counted.counter->retain();
703 oo_inline OOCounted &operator = (
const OOCounted &counted ) {
704 OOCounter<CNAME> *old = counter;
705 counter = counted.counter->retain();
714 return *counter->ptr;