00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <stlib/InternalStream.h>
00025 #include <stlib/SequenceableCollection.h>
00026 #include <stlib/String.h>
00027
00028 InternalStream::InternalStream(SequenceableCollection *coll)
00029 {
00030 PositionableStream::initialize(coll);
00031 }
00032
00033
00034 String *InternalStream::className(void) const
00035 {
00036 return new String("InternalStream");
00037 }
00038
00039
00040 SequenceableCollection *InternalStream::contents(void)
00041 {
00042 read_limit = (read_limit < _position) ? _position : read_limit;
00043 return dynamic_cast<SequenceableCollection *>(collection->copy(0, read_limit));
00044 }
00045
00046 void InternalStream::nextPutAll(const SequenceableCollection *coll,
00047 long size, long startIndex)
00048 {
00049 if (size <= 1) {
00050 PositionableStream::nextPutAll(coll, size, startIndex);
00051 return;
00052 }
00053
00054 nextPut(coll->at(startIndex));
00055
00056 long newPosition = _position + size - 1;
00057 if (newPosition > write_limit) {
00058 collection->growToAtLeast(newPosition);
00059 write_limit = collection->size();
00060 }
00061
00062 collection->replace(_position, newPosition, coll, startIndex+1);
00063 _position = newPosition;
00064 }
00065
00066 SequenceableCollection *InternalStream::upToEnd(void)
00067 {
00068 SequenceableCollection *res;
00069 read_limit = (read_limit < _position) ? _position : read_limit;
00070 res = dynamic_cast<SequenceableCollection *>(collection->copy(_position, read_limit));
00071 _position = read_limit;
00072 return res;
00073 }
00074
00075
00076 void InternalStream::pastEndPut(Object *object)
00077 {
00078 collection->growToAtLeast(collection->size() + 1);
00079 write_limit = collection->size();
00080 collection->put(_position++, object);
00081 }