libE57Format 3.1.1
C++ library to read & write the E57 file format for point cloud data
Loading...
Searching...
No Matches
e57::CompressedVectorReader Class Reference

An iterator object keeping track of a read in progress from a CompressedVectorNode. More...

#include <E57Format.h>

Public Member Functions

 CompressedVectorReader ()=delete
 
void checkInvariant (bool doRecurse=true)
 Check whether CompressedVectorReader class invariant is true.
 
void close ()
 End the read operation.
 
CompressedVectorNode compressedVectorNode () const
 Return the CompressedVectorNode being read.
 
void dump (int indent=0, std::ostream &os=std::cout) const
 Diagnostic function to print internal state of object to output stream in an indented format.
 
bool isOpen ()
 Test whether CompressedVectorReader is still open for reading.
 
unsigned read ()
 Request transfer of blocks of data from CompressedVectorNode into previously designated destination buffers.
 
unsigned read (std::vector< SourceDestBuffer > &dbufs)
 Request transfer of block of data from CompressedVectorNode into given destination buffers.
 
void seek (int64_t recordNumber)
 Set record number of CompressedVectorNode where next read will start.
 

Detailed Description

An iterator object keeping track of a read in progress from a CompressedVectorNode.

A CompressedVectorReader object is a block iterator that reads blocks of records from a CompressedVectorNode and stores them in memory buffers (SourceDestBuffers). Blocks of records are processed rather than a single record-at-a-time for efficiency reasons. The CompressedVectorReader class encapsulates all the state that must be saved in between the processing of one record block and the next (e.g. partially read disk pages, or data decompression state). New memory buffers can be used for each record block read, or the previous buffers can be reused.

CompressedVectorReader objects have an open/closed state. Initially a newly created CompressedVectorReader is in the open state. After the API user calls CompressedVectorReader::close, the object will be in the closed state and no more data transfers will be possible.

There is no CompressedVectorReader constructor in the API. The function CompressedVectorNode::reader returns an already constructed CompressedVectorReader object with given memory buffers (SourceDestBuffers) already associated.

It is recommended to call CompressedVectorReader::close to gracefully end the transfer. Unlike the CompressedVectorWriter, not all fields in the record of the CompressedVectorNode are required to be read at one time.

Class Invariant

A class invariant is a list of statements about an object that are always true before and after any operation on the object. An invariant is useful for testing correct operation of an implementation. Statements in an invariant can involve only externally visible state, or can refer to internal implementation-specific state that is not visible to the API user. The following C++ code checks externally visible state for consistency and throws an exception if the invariant is violated:

void CompressedVectorReader::checkInvariant( bool /*doRecurse*/ )
{
// If this CompressedVectorReader is not open, can't test invariant (almost
// every call would throw)
if ( !isOpen() )
{
return;
}
// If destImageFile not open, can't test invariant (almost every call would
// throw)
if ( !imf.isOpen() )
{
return;
}
// Associated CompressedVectorNode must be attached to ImageFile
if ( !cv.isAttached() )
{
throw E57_EXCEPTION1( ErrorInvarianceViolation );
}
// Dest ImageFile must have at least 1 reader (this one)
if ( imf.readerCount() < 1 )
{
throw E57_EXCEPTION1( ErrorInvarianceViolation );
}
// Dest ImageFile can't have any writers
if ( imf.writerCount() != 0 )
{
throw E57_EXCEPTION1( ErrorInvarianceViolation );
}
}
An E57 element containing ordered vector of child nodes, stored in an efficient binary format.
Definition: E57Format.h:476
ImageFile destImageFile() const
Get the ImageFile that was declared as the destination for the node when it was created.
Definition: CompressedVectorNode.cpp:254
bool isAttached() const
Has node been attached into the tree of an ImageFile.
Definition: CompressedVectorNode.cpp:261
void checkInvariant(bool doRecurse=true)
Check whether CompressedVectorReader class invariant is true.
Definition: CompressedVectorReader.cpp:49
CompressedVectorNode compressedVectorNode() const
Return the CompressedVectorNode being read.
Definition: CompressedVectorReader.cpp:336
bool isOpen()
Test whether CompressedVectorReader is still open for reading.
Definition: CompressedVectorReader.cpp:316
An ASTM E57 3D format file object.
Definition: E57Format.h:729
bool isOpen() const
Test whether ImageFile is still open for accessing.
Definition: ImageFile.cpp:386
int writerCount() const
Get current number of open CompressedVectorWriter objects writing to ImageFile.
Definition: ImageFile.cpp:440
int readerCount() const
Get current number of open CompressedVectorReader objects reading from ImageFile.
Definition: ImageFile.cpp:462
@ ErrorInvarianceViolation
class invariance constraint violation in debug mode
Definition: E57Exception.h:133
See also
CompressedVectorNode, CompressedVectorWriter

Constructor & Destructor Documentation

◆ CompressedVectorReader()

e57::CompressedVectorReader::CompressedVectorReader ( )
delete

Member Function Documentation

◆ checkInvariant()

void CompressedVectorReader::checkInvariant ( bool  doRecurse = true)

Check whether CompressedVectorReader class invariant is true.

This function checks at least the assertions in the documented class invariant description (see class reference page for this object). Other internal invariants that are implementation-dependent may also be checked. If any invariant clause is violated, an ErrorInvarianceViolation E57Exception is thrown.

Postcondition
No visible state is modified.

◆ close()

void CompressedVectorReader::close ( )

End the read operation.

It is recommended that this function be called to gracefully end a transfer to a CompressedVectorNode. It is not an error to call this function if the CompressedVectorReader is already closed. This function will cause the CompressedVectorReader to enter the closed state, and any further transfers requests will fail.

Exceptions
ErrorInternalAll objects in undocumented state
See also
CompressedVectorReader::isOpen, CompressedVectorNode::reader

◆ compressedVectorNode()

CompressedVectorNode CompressedVectorReader::compressedVectorNode ( ) const

Return the CompressedVectorNode being read.

It is not an error if this CompressedVectorReader is closed.

Precondition
The associated ImageFile must be open.
Returns
A smart CompressedVectorNode handle referencing the underlying object being read from.
Exceptions
ErrorImageFileNotOpen
ErrorInternalAll objects in undocumented state
See also
CompressedVectorReader::close, CompressedVectorNode::reader

◆ dump()

void CompressedVectorReader::dump ( int  indent = 0,
std::ostream &  os = std::cout 
) const

Diagnostic function to print internal state of object to output stream in an indented format.

Parameters
[in]indentNumber of spaces to indent all the printed lines of this object.
[in]osOutput stream to print on.

All objects in the E57 Foundation API (with exception of E57Exception) support a dump() function. These functions print out to the console a detailed listing of the internal state of objects. The content of these printouts is not documented, and is really of interest only to implementation developers/maintainers or the really adventurous users. In implementations of the API other than the Reference Implementation, the dump() functions may produce no output (although the functions should still be defined). The output format may change from version to version.

Postcondition
No visible object state is modified.
Exceptions
NoE57Exceptions

◆ isOpen()

bool CompressedVectorReader::isOpen ( )

Test whether CompressedVectorReader is still open for reading.

Precondition
The associated ImageFile must be open.
Exceptions
ErrorImageFileNotOpen
ErrorInternalAll objects in undocumented state
See also
CompressedVectorReader::close, CompressedVectorNode::reader

◆ read() [1/2]

unsigned CompressedVectorReader::read ( )

Request transfer of blocks of data from CompressedVectorNode into previously designated destination buffers.

The SourceDestBuffers used are previously designated either in CompressedVectorNode::reader where this object was created, or in the last call to CompressedVectorReader::read(std::vector<SourceDestBuffer>&) where new buffers were designated. The function will always return the full number of records requested (the capacity of the SourceDestBuffers) unless it has reached the end of the CompressedVectorNode, in which case it will return less than the capacity of the SourceDestBuffers. Partial reads will store the records at the beginning of the SourceDestBuffers. It is not an error to call this function after all records in the CompressedVectorNode have been read (the function returns 0).

If a conversion or bounds error occurs during the transfer, the CompressedVectorReader is left in an undocumented state (it can't be used any further). If a file I/O or checksum error occurs during the transfer, both the CompressedVectorReader and the associated ImageFile are left in an undocumented state (they can't be used any further).

The API user is responsible for ensuring that the underlying memory buffers represented in the SourceDestBuffers still exist when this function is called. The E57 Foundation Implementation cannot detect that a memory buffer been destroyed.

Precondition
The associated ImageFile must be open.
This CompressedVectorReader must be open (i.e isOpen())
Returns
The number of records read.
Exceptions
ErrorImageFileNotOpen
ErrorReaderNotOpen
ErrorConversionRequiredThis CompressedVectorReader in undocumented state
ErrorValueNotRepresentableThis CompressedVectorReader in undocumented state
ErrorScaledValueNotRepresentableThis CompressedVectorReader in undocumented state
ErrorReal64TooLargeThis CompressedVectorReader in undocumented state
ErrorExpectingNumericThis CompressedVectorReader in undocumented state
ErrorExpectingUStringThis CompressedVectorReader in undocumented state
ErrorBadCVPacketThis CompressedVectorReader, associated ImageFile in undocumented state
ErrorSeekFailedThis CompressedVectorReader, associated ImageFile in undocumented state
ErrorReadFailedThis CompressedVectorReader, associated ImageFile in undocumented state
ErrorBadChecksumThis CompressedVectorReader, associated ImageFile in undocumented state
ErrorInternalAll objects in undocumented state
See also
CompressedVectorReader::read(std::vector<SourceDestBuffer>&), CompressedVectorNode::reader, SourceDestBuffer, CompressedVectorReader::read(std::vector<SourceDestBuffer>&)

◆ read() [2/2]

unsigned CompressedVectorReader::read ( std::vector< SourceDestBuffer > &  dbufs)

Request transfer of block of data from CompressedVectorNode into given destination buffers.

Parameters
[in]dbufsVector of memory buffers that will receive data read from a CompressedVectorNode.

The dbufs must all have the same capacity.

The specified dbufs must have same number of elements as previously designated SourceDestBuffer vector. The each SourceDestBuffer within dbufs must be identical to the previously designated SourceDestBuffer except for capacity and buffer address.

The dbufs locations are saved so that a later call to CompressedVectorReader::read() can be used without having to re-specify the SourceDestBuffers.

The function will always return the full number of records requested (the capacity of the SourceDestBuffers) unless it has reached the end of the CompressedVectorNode, in which case it will return less than the capacity of the SourceDestBuffers. Partial reads will store the records at the beginning of the SourceDestBuffers. It is not an error to call this function after all records in the CompressedVectorNode have been read (the function returns 0).

If a conversion or bounds error occurs during the transfer, the CompressedVectorReader is left in an undocumented state (it can't be used any further). If a file I/O or checksum error occurs during the transfer, both the CompressedVectorReader and the associated ImageFile are left in an undocumented state (they can't be used any further).

The API user is responsible for ensuring that the underlying memory buffers represented in the SourceDestBuffers still exist when this function is called. The E57 Foundation Implementation cannot detect that a memory buffer been destroyed.

Precondition
The associated ImageFile must be open.
This CompressedVectorReader must be open (i.e isOpen())
Returns
The number of records read.
Exceptions
ErrorImageFileNotOpen
ErrorReaderNotOpen
ErrorPathUndefined
ErrorBufferSizeMismatch
ErrorBufferDuplicatePathName
ErrorConversionRequiredThis CompressedVectorReader in undocumented state
ErrorValueNotRepresentableThis CompressedVectorReader in undocumented state
ErrorScaledValueNotRepresentableThis CompressedVectorReader in undocumented state
ErrorReal64TooLargeThis CompressedVectorReader in undocumented state
ErrorExpectingNumericThis CompressedVectorReader in undocumented state
ErrorExpectingUStringThis CompressedVectorReader in undocumented state
ErrorBadCVPacketThis CompressedVectorReader, associated ImageFile in undocumented state
ErrorSeekFailedThis CompressedVectorReader, associated ImageFile in undocumented state
ErrorReadFailedThis CompressedVectorReader, associated ImageFile in undocumented state
ErrorBadChecksumThis CompressedVectorReader, associated ImageFile in undocumented state
ErrorInternalAll objects in undocumented state
See also
CompressedVectorReader::read(), CompressedVectorNode::reader, SourceDestBuffer

◆ seek()

void CompressedVectorReader::seek ( int64_t  recordNumber)

Set record number of CompressedVectorNode where next read will start.

Parameters
[in]recordNumberThe index of record in CompressedVectorNode where next read using this CompressedVectorReader will start.

This function may be called at any time (as long as ImageFile and CompressedVectorReader are open). The next read will start at the given recordNumber. It is not an error to seek to recordNumber = childCount() (i.e. to one record past end of CompressedVectorNode).

Precondition
recordNumber <= childCount() of CompressedVectorNode.
The associated ImageFile must be open.
This CompressedVectorReader must be open (i.e isOpen())
Exceptions
ErrorBadAPIArgument
ErrorImageFileNotOpen
ErrorReaderNotOpen
ErrorBadCVPacket
ErrorSeekFailed
ErrorReadFailed
ErrorBadChecksum
ErrorInternalAll objects in undocumented state
See also
CompressedVectorNode::reader

The documentation for this class was generated from the following files: