Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

Core::PositionableStream Class Reference

#include <PositionableStream.h>

Inheritance diagram for Core::PositionableStream:

Inheritance graph
[legend]
Collaboration diagram for Core::PositionableStream:

Collaboration graph
[legend]
List of all members.

Public Member Functions

virtual StringclassName (void) const
 Answer receiver class name.
virtual SequenceableCollectioncontents (void)
 Answer content of the receiver.
virtual Objectnext (void) abstract
virtual SequenceableCollectionnext (long items)
virtual SequenceableCollectionnext (long items, SequenceableCollection *newColl, long index)
virtual bool peekFor (Object *obj)
virtual long position (void)
virtual void position (long position)
virtual void reset (void)
virtual void skip (long length)
virtual bool atEnd (void)
virtual bool isEmpty (void)
virtual bool notEmpty (void)
virtual bool isBinary (void)
virtual bool basicAtEnd (void)

Protected Member Functions

virtual void initialize (SequenceableCollection *coll)
virtual SequenceableCollectioncontentSpeciesFor (long items)

Protected Attributes

SequenceableCollectioncollection
long _position
long read_limit
long write_limit

Member Function Documentation

bool PositionableStream::atEnd void   )  [virtual]
 

Reimplemented from Core::Stream.

Reimplemented in Core::ExternalStream, and Core::ExternalWriteStream.

Definition at line 117 of file PositionableStream.cc.

References basicAtEnd().

Referenced by Tools::Filename::components(), next(), and peekFor().

00118 {
00119     return basicAtEnd();
00120 }

bool PositionableStream::basicAtEnd void   )  [virtual]
 

Reimplemented from Core::Stream.

Definition at line 138 of file PositionableStream.cc.

References _position, and read_limit.

Referenced by atEnd(), and Core::ExternalStream::atEnd().

00139 {
00140     return _position >= read_limit;
00141 }

String * PositionableStream::className void   )  const [virtual]
 

Answer receiver class name.

Because there isn't any standard way to obtain class name this method comes to place.

Every class should rewrite this method but many didn't (yet).

Reimplemented from Core::Object.

Reimplemented in Core::ExternalReadAppendStream, Core::ExternalReadStream, Core::ExternalStream, Core::ExternalWriteStream, Core::InternalStream, Core::ReadAppendStream, Core::ReadStream, and Core::WriteStream.

Definition at line 41 of file PositionableStream.cc.

00042 {
00043     return new String("PositionableStream");
00044 }

SequenceableCollection * PositionableStream::contents void   )  [virtual]
 

Answer content of the receiver.

In many cases it doesn't matter if it is ReadStream or WriteStream because they don't do any conversion. I does matter on streams like EncodedStream where some conversion takes place. In that case contents() always answer collection of encoded data (for ex. as it would be written to the disk). To get all data decoded you can use upToEnd() method.

Reimplemented from Core::Stream.

Reimplemented in Core::ExternalStream, Core::InternalStream, and Core::WriteStream.

Definition at line 47 of file PositionableStream.cc.

References collection, Core::SequenceableCollection::copy(), and read_limit.

00048 {
00049     return dynamic_cast<SequenceableCollection *>(collection->copy(0, read_limit - 1));
00050 }

SequenceableCollection * PositionableStream::contentSpeciesFor long  items  )  [protected, virtual]
 

Reimplemented from Core::Stream.

Definition at line 143 of file PositionableStream.cc.

References collection, and Core::Collection::copyEmpty().

Referenced by Core::ExternalStream::close(), and Core::ExternalStream::contents().

00144 {
00145     return (SequenceableCollection *) collection->copyEmpty(items);
00146 }

void PositionableStream::initialize SequenceableCollection coll  )  [protected, virtual]
 

Definition at line 33 of file PositionableStream.cc.

References _position, collection, read_limit, Core::SequenceableCollection::size(), and write_limit.

Referenced by Core::ExternalStream::ExternalStream(), and Core::InternalStream::InternalStream().

00034 {
00035     collection = coll;
00036     read_limit = write_limit = coll->size();
00037     _position = 0;
00038 }

bool PositionableStream::isBinary void   )  [virtual]
 

Reimplemented from Core::Stream.

Reimplemented in Core::ExternalStream.

Definition at line 132 of file PositionableStream.cc.

References collection, and Core::Collection::isByteArray().

00133 {
00134     return collection->isByteArray();
00135 }

bool PositionableStream::isEmpty void   )  [virtual]
 

Reimplemented from Core::Stream.

Definition at line 122 of file PositionableStream.cc.

References _position.

00123 {
00124     return _position == 0;
00125 }

SequenceableCollection * PositionableStream::next long  items,
SequenceableCollection newColl,
long  index
[virtual]
 

Reimplemented from Core::Stream.

Definition at line 52 of file PositionableStream.cc.

References _position, atEnd(), collection, next(), Core::SequenceableCollection::put(), read_limit, and Core::SequenceableCollection::replace().

00055 {
00056     if (items < 1) return newColl;
00057     if (atEnd())
00058         (new IncompleteNextCountError(__PRETTY_FUNCTION__, 0))->raiseFrom(this);
00059 
00060     /* Use next for the first read to make sure that the receiver is readable. */
00061     newColl->put(startIndex, next());
00062 
00063     long howManyRead = 1;
00064     while (howManyRead < items) {
00065         long increment, newHowManyRead;
00066         if (atEnd())
00067             (new IncompleteNextCountError(__PRETTY_FUNCTION__, howManyRead))->raiseFrom(this);
00068         long m1 = read_limit - _position;
00069         long m2 = items - howManyRead;
00070         increment = (m1 < m2) ? m1 : m2;
00071         newHowManyRead = howManyRead + increment;
00072         newColl->replace(startIndex + howManyRead, startIndex + newHowManyRead,
00073                          collection, _position);
00074         _position += increment;
00075         howManyRead = newHowManyRead;
00076     }
00077     return newColl;
00078 }

virtual SequenceableCollection* Core::PositionableStream::next long  items  )  [inline, virtual]
 

Reimplemented from Core::Stream.

Reimplemented in Core::ExternalReadStream.

Definition at line 53 of file PositionableStream.h.

References Core::Stream::next().

00054       { return Stream::next(items); }

virtual Object* Core::PositionableStream::next void   )  [virtual]
 

Reimplemented from Core::Stream.

Reimplemented in Core::ExternalReadStream, Core::ExternalWriteStream, Core::ReadStream, and Core::WriteStream.

Referenced by Core::ExternalStream::contents(), next(), Core::ExternalReadStream::next(), and peekFor().

bool PositionableStream::notEmpty void   )  [virtual]
 

Reimplemented from Core::Stream.

Definition at line 127 of file PositionableStream.cc.

References _position.

00128 {
00129     return _position > 0;
00130 }

bool PositionableStream::peekFor Object obj  )  [virtual]
 

Definition at line 80 of file PositionableStream.cc.

References atEnd(), Core::Object::isEqual(), next(), and skip().

Referenced by Tools::Filename::readBaseLocationFromStream().

00081 {
00082     if (atEnd()) return false;
00083     Object *element = next();
00084     if (element->isEqual(object)) return true;
00085     skip(-1);
00086     return false;
00087 }

void PositionableStream::position long  position  )  [virtual]
 

Reimplemented from Core::Stream.

Reimplemented in Core::ExternalReadAppendStream, Core::ExternalWriteStream, and Core::ReadAppendStream.

Definition at line 95 of file PositionableStream.cc.

References _position, Core::Stream::positionOutOfBoundsError(), and read_limit.

00096 {
00097     read_limit = (read_limit < _position) ? _position : read_limit;
00098     // PositionableStream::position(pos);
00099     if (pos >= 0 && pos <= read_limit)
00100         _position = pos;
00101     else
00102         positionOutOfBoundsError(new String(__PRETTY_FUNCTION__), pos);
00103 }

long PositionableStream::position void   )  [virtual]
 

Reimplemented from Core::Stream.

Reimplemented in Core::ExternalWriteStream.

Definition at line 90 of file PositionableStream.cc.

References _position.

Referenced by Core::ReadAppendStream::nextPut(), Core::ReadAppendStream::nextPutAll(), Core::ReadAppendStream::position(), Core::ExternalReadAppendStream::position(), skip(), and Core::ReadAppendStream::writePosition().

00091 {
00092     return _position;
00093 }

void PositionableStream::reset void   )  [virtual]
 

Reimplemented from Core::Stream.

Definition at line 105 of file PositionableStream.cc.

References _position, and read_limit.

00106 {
00107     read_limit = (read_limit < _position) ? _position : read_limit;
00108     _position = 0;
00109 }

void PositionableStream::skip long  length  )  [virtual]
 

Reimplemented from Core::Stream.

Reimplemented in Core::ExternalReadStream.

Definition at line 111 of file PositionableStream.cc.

References _position, and position().

Referenced by peekFor().

00112 {
00113     position(_position + length);
00114 }


Member Data Documentation

long Core::PositionableStream::_position [protected]
 

Definition at line 38 of file PositionableStream.h.

Referenced by Core::ExternalStream::atEnd(), basicAtEnd(), Core::ExternalWriteStream::closeConnection(), Core::ExternalStream::closeConnection(), Core::WriteStream::contents(), Core::InternalStream::contents(), Core::ExternalStream::ExternalStream(), Core::ExternalWriteStream::flush(), initialize(), isEmpty(), Core::ReadStream::next(), next(), Core::ExternalReadStream::next(), Core::ExternalStream::nextBuffer(), Core::WriteStream::nextPut(), Core::ExternalWriteStream::nextPut(), Core::InternalStream::nextPutAll(), notEmpty(), Core::ExternalStream::pastEnd(), Core::InternalStream::pastEndPut(), position(), Core::ReadStream::readPosition(), Core::ExternalStream::readPosition(), reset(), Core::ExternalStream::setPosition(), skip(), Core::ExternalReadStream::skip(), Core::InternalStream::upToEnd(), and Core::ExternalWriteStream::writePosition().

SequenceableCollection* Core::PositionableStream::collection [protected]
 

Definition at line 37 of file PositionableStream.h.

Referenced by Core::ExternalStream::close(), Core::WriteStream::contents(), contents(), Core::InternalStream::contents(), contentSpeciesFor(), Core::ExternalWriteStream::flush(), initialize(), isBinary(), Core::ReadStream::next(), next(), Core::ExternalReadStream::next(), Core::ExternalStream::nextBuffer(), Core::WriteStream::nextPut(), Core::ExternalWriteStream::nextPut(), Core::InternalStream::nextPutAll(), Core::ExternalStream::pastEnd(), Core::InternalStream::pastEndPut(), Core::ExternalStream::setPosition(), and Core::InternalStream::upToEnd().

long Core::PositionableStream::read_limit [protected]
 

Definition at line 39 of file PositionableStream.h.

Referenced by Core::ExternalStream::atEnd(), basicAtEnd(), Core::ExternalWriteStream::closeConnection(), Core::ExternalStream::closeConnection(), Core::WriteStream::contents(), contents(), Core::InternalStream::contents(), Core::ExternalStream::ExternalStream(), initialize(), Core::ReadStream::next(), next(), Core::ExternalReadStream::next(), Core::ExternalStream::nextBuffer(), Core::ReadAppendStream::nextPut(), Core::ReadAppendStream::nextPutAll(), Core::ExternalStream::pastEnd(), position(), reset(), Core::ExternalStream::setPosition(), Core::ExternalReadStream::skip(), and Core::InternalStream::upToEnd().

long Core::PositionableStream::write_limit [protected]
 

Definition at line 40 of file PositionableStream.h.

Referenced by Core::ExternalWriteStream::closeConnection(), Core::ExternalStream::closeConnection(), Core::ExternalStream::ExternalStream(), Core::ExternalWriteStream::flush(), initialize(), Core::WriteStream::nextPut(), Core::ExternalWriteStream::nextPut(), Core::InternalStream::nextPutAll(), and Core::InternalStream::pastEndPut().


The documentation for this class was generated from the following files:
Generated on Mon Nov 27 09:51:50 2006 for Smalltalk like C++ Class Library by  doxygen 1.4.2