diff options
Diffstat (limited to 'freebsdtvision/lib/TCollection.cc')
-rw-r--r-- | freebsdtvision/lib/TCollection.cc | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/freebsdtvision/lib/TCollection.cc b/freebsdtvision/lib/TCollection.cc new file mode 100644 index 0000000..133121f --- /dev/null +++ b/freebsdtvision/lib/TCollection.cc @@ -0,0 +1,233 @@ +/* + * TCollection.cc + * + * Turbo Vision - Version 2.0 + * + * Copyright (c) 1994 by Borland International + * All Rights Reserved. + * + * Modified by Sergio Sigala <sergio@sigala.it> + */ + +#define Uses_TNSCollection +#define Uses_opstream +#define Uses_ipstream +#define Uses_TCollection +#include <tvision/tv.h> + +#include <stdlib.h> +#include <string.h> + +TNSCollection::TNSCollection( ccIndex aLimit, ccIndex aDelta ) : + items( 0 ), + count( 0 ), + limit( 0 ), + delta( aDelta ), + shouldDelete( True ) +{ + setLimit( aLimit ); +} + +TNSCollection::TNSCollection() : + items( 0 ), + count( 0 ), + limit( 0 ), + delta( 0 ), + shouldDelete( True ) +{ +} + +TNSCollection::~TNSCollection() +{ + delete items; +} + +void TNSCollection::shutDown() +{ + if( shouldDelete ) + freeAll(); + else + removeAll(); + setLimit(0); + TObject::shutDown(); +} + +void *TNSCollection::at( ccIndex index ) +{ + if( index < 0 || index >= count ) + error(1,0); + return items[index]; +} + +void TNSCollection::atRemove( ccIndex index ) +{ + if( index < 0 || index >= count ) + error(1,0); + + count--; + memmove( &items[index], &items[index+1], (count-index)*sizeof(void *) ); +} + +void TNSCollection::atFree( ccIndex index ) +{ + void *item = at( index ); + atRemove( index ); + freeItem( item ); +} + +void TNSCollection::atInsert(ccIndex index, void *item) +{ + if( index < 0 ) + error(1,0); + if( count == limit ) + setLimit(count + delta); + + memmove( &items[index+1], &items[index], (count-index)*sizeof(void *) ); + count++; + + items[index] = item; +} + +void TNSCollection::atPut( ccIndex index, void *item ) +{ + if( index >= count ) + error(1,0); + + items[index] = item; +} + +void TNSCollection::remove( void *item ) +{ + atRemove( indexOf(item) ); +} + +void TNSCollection::removeAll() +{ + count = 0; +} + +void TNSCollection::error( ccIndex code, ccIndex ) +{ + exit(212 - code); +} + +void *TNSCollection::firstThat( ccTestFunc Test, void *arg ) +{ + for( ccIndex i = 0; i < count; i++ ) + { + if( Test( items[i], arg ) == True ) + return items[i]; + } + return 0; +} + +void *TNSCollection::lastThat( ccTestFunc Test, void *arg ) +{ + for( ccIndex i = count; i > 0; i-- ) + { + if( Test( items[i-1], arg ) == True ) + return items[i-1]; + } + return 0; +} + +void TNSCollection::forEach( ccAppFunc action, void *arg ) +{ + for( ccIndex i = 0; i < count; i++ ) + action( items[i], arg ); +} + +void TNSCollection::free( void *item ) +{ + remove( item ); + freeItem( item ); +} + +void TNSCollection::freeAll() +{ + for( ccIndex i = 0; i < count; i++ ) + freeItem( at(i) ); + count = 0; +} + +void TNSCollection::freeItem( void *item ) +{ + delete item; +} + +ccIndex TNSCollection::indexOf(void *item) +{ + for( ccIndex i = 0; i < count; i++ ) + if( item == items[i] ) + return i; + + error(1,0); + return (ccIndex)0; +} + +ccIndex TNSCollection::insert( void *item ) +{ + ccIndex loc = count; + atInsert( count, item ); + return loc; +} + +void TNSCollection::pack() +{ + void **curDst = items; + void **curSrc = items; + void **last = items + count; + while( curSrc < last ) + { + if( *curSrc != 0 ) + *curDst++ = *curSrc; +// *curSrc++; /* XXX */ + curSrc++; /* XXX */ + } +} + +void TNSCollection::setLimit(ccIndex aLimit) +{ + if( aLimit < count ) + aLimit = count; + if( aLimit > maxCollectionSize) + aLimit = maxCollectionSize; + if( aLimit != limit ) + { + void **aItems; + if (aLimit == 0 ) + aItems = 0; + else + { + aItems = new void *[aLimit]; + if( count != 0 && aItems != 0 && items != 0 ) + memcpy( aItems, items, count*sizeof(void *) ); + } + delete items; + items = aItems; + limit = aLimit; + } +} + + +void TCollection::write( opstream& os ) +{ + os << count << limit << delta; + for( ccIndex idx = 0; idx < count; idx++ ) + writeItem( items[idx], os ); +} + +void *TCollection::read( ipstream& is ) +{ + int savedLimit; + is >> count >> savedLimit >> delta; + setLimit(savedLimit); + for( ccIndex idx = 0; idx < count; idx++ ) + items[idx] = readItem( is ); + return this; +} + + +TCollection::TCollection( StreamableInit ) +{ +} |