From d3a3bd9c12c8caa1ccc11f798130b1bee41979e5 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 22 Oct 2016 21:03:11 +0200 Subject: [PATCH] BUgfixes regarding filepos setupBUgfixes regarding filepos setup. --- code/DefaultIOStream.h | 2 - code/IOStreamBuffer.h | 191 ++++++++++++++++++++++++----------------- 2 files changed, 111 insertions(+), 82 deletions(-) diff --git a/code/DefaultIOStream.h b/code/DefaultIOStream.h index 83bd3a9d4..ecca1a79b 100644 --- a/code/DefaultIOStream.h +++ b/code/DefaultIOStream.h @@ -114,7 +114,6 @@ private: mutable size_t mCachedSize; }; - // ---------------------------------------------------------------------------------- inline DefaultIOStream::DefaultIOStream () : mFile (NULL), @@ -124,7 +123,6 @@ inline DefaultIOStream::DefaultIOStream () : // empty } - // ---------------------------------------------------------------------------------- inline DefaultIOStream::DefaultIOStream (FILE* pFile, const std::string &strFilename) : diff --git a/code/IOStreamBuffer.h b/code/IOStreamBuffer.h index d6365cfac..5b00ef5d6 100644 --- a/code/IOStreamBuffer.h +++ b/code/IOStreamBuffer.h @@ -41,91 +41,22 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include -#include -namespace Assimp { +#include -class IOStream; +#include + +namespace Assimp { template class IOStreamBuffer { public: - IOStreamBuffer( size_t cache = 4096 ) - : m_stream( nullptr ) - , m_filesize( 0 ) - , m_cacheSize( cache ) - , m_cachePos( 0 ) - , m_filePos( 0 ) { - m_cache.resize( cache ); - std::fill( m_cache.begin(), m_cache.end(), '\0' ); - } - - ~IOStreamBuffer() { - } - - bool open( IOStream *stream ) { - if ( nullptr == stream ) { - return false; - } - - m_stream = stream; - m_filesize = m_stream->FileSize(); - if ( m_filesize == 0 ) { - return false; - } - - return true; - } - - bool close() { - if ( nullptr == m_stream ) { - return false; - } - - m_stream = nullptr; - m_filesize =0; - - return true; - } - - size_t size() const { - return m_filesize; - } - - bool readNextBlock() { - m_stream->Seek( m_filePos, aiOrigin_SET ); - size_t readLen = m_stream->Read( &m_cache[ 0 ], sizeof( T ), m_cacheSize ); - if ( readLen == 0 ) { - return false; - } - m_filePos += m_cacheSize; - m_cachePos = 0; - return true; - } - - bool getNextLine( std::vector &buffer ) { - buffer.resize( m_cacheSize ); - ::memset( &buffer[ 0 ], ' ', m_cacheSize ); - - if ( m_cachePos == m_cacheSize || 0 == m_filePos ) { - if ( !readNextBlock() ) { - return false; - } - } - size_t i = 0; - while ( !IsLineEnd( m_cache[ m_cachePos ] ) ) { - buffer[ i ] = m_cache[ m_cachePos ]; - m_cachePos++; - i++; - if ( m_cachePos >= m_cacheSize ) { - if ( !readNextBlock() ) { - return false; - } - } - } - buffer[ i ]='\n'; - m_cachePos++; - return true; - } + IOStreamBuffer( size_t cache = 4096 * 4096 ); + ~IOStreamBuffer(); + bool open( IOStream *stream ); + bool close(); + size_t size() const; + bool readNextBlock(); + bool getNextLine( std::vector &buffer ); private: IOStream *m_stream; @@ -136,4 +67,104 @@ private: size_t m_filePos; }; +template +inline +IOStreamBuffer::IOStreamBuffer( size_t cache = 4096 * 4096 ) + : m_stream( nullptr ) + , m_filesize( 0 ) + , m_cacheSize( cache ) + , m_cachePos( 0 ) + , m_filePos( 0 ) { + m_cache.resize( cache ); + std::fill( m_cache.begin(), m_cache.end(), '\0' ); +} + +template +inline +IOStreamBuffer::~IOStreamBuffer() { + // empty +} + +template +inline +bool IOStreamBuffer::open( IOStream *stream ) { + if ( nullptr == stream ) { + return false; + } + + m_stream = stream; + m_filesize = m_stream->FileSize(); + if ( m_filesize == 0 ) { + return false; + } + if ( m_filesize < m_cacheSize ) { + m_cacheSize = m_filesize; + } + + return true; +} + +template +inline +bool IOStreamBuffer::close() { + if ( nullptr == m_stream ) { + return false; + } + + m_stream = nullptr; + m_filesize = 0; + + return true; +} + +template +inline +size_t IOStreamBuffer::size() const { + return m_filesize; +} + +template +inline +bool IOStreamBuffer::readNextBlock() { + m_stream->Seek( m_filePos, aiOrigin_SET ); + size_t readLen = m_stream->Read( &m_cache[ 0 ], sizeof( T ), m_cacheSize ); + if ( readLen == 0 ) { + return false; + } + if ( readLen < m_cacheSize ) { + m_cacheSize = readLen; + } + m_filePos += m_cacheSize; + m_cachePos = 0; + + return true; +} + +template +inline +bool IOStreamBuffer::getNextLine( std::vector &buffer ) { + buffer.resize( m_cacheSize ); + ::memset( &buffer[ 0 ], '\n', m_cacheSize ); + + if ( m_cachePos == m_cacheSize || 0 == m_filePos ) { + if ( !readNextBlock() ) { + return false; + } + } + size_t i = 0; + while ( !IsLineEnd( m_cache[ m_cachePos ] ) ) { + buffer[ i ] = m_cache[ m_cachePos ]; + m_cachePos++; + i++; + if ( m_cachePos >= m_cacheSize ) { + if ( !readNextBlock() ) { + return false; + } + } + } + m_cachePos++; + + return true; +} + } // !ns Assimp