44 #ifndef AI_IOSTREAMBUFFER_H_INC
45 #define AI_IOSTREAMBUFFER_H_INC
48 # pragma GCC system_header
126 std::vector<T> m_cache;
134 : m_stream( nullptr )
136 , m_cacheSize( cache )
141 m_cache.resize( cache );
142 std::fill( m_cache.begin(), m_cache.end(),
'\n' );
155 if (
nullptr != m_stream ) {
160 if (
nullptr == stream ) {
166 if ( m_filesize == 0 ) {
169 if ( m_filesize < m_cacheSize ) {
170 m_cacheSize = m_filesize;
173 m_numBlocks = m_filesize / m_cacheSize;
174 if ( ( m_filesize % m_cacheSize ) > 0 ) {
184 if (
nullptr == m_stream ) {
215 size_t readLen = m_stream->Read( &m_cache[ 0 ],
sizeof( T ), m_cacheSize );
216 if ( readLen == 0 ) {
219 if ( readLen < m_cacheSize ) {
220 m_cacheSize = readLen;
222 m_filePos += m_cacheSize;
250 buffer.resize( m_cacheSize );
251 if ( m_cachePos >= m_cacheSize || 0 == m_filePos ) {
252 if ( !readNextBlock() ) {
257 bool continuationFound(
false );
260 if ( continuationToken == m_cache[ m_cachePos ] ) {
261 continuationFound =
true;
264 if ( IsLineEnd( m_cache[ m_cachePos ] ) ) {
265 if ( !continuationFound ) {
270 while ( m_cache[m_cachePos] !=
'\n') {
274 continuationFound =
false;
278 buffer[ i ] = m_cache[ m_cachePos ];
281 if (m_cachePos >= size()) {
284 if ( m_cachePos >= m_cacheSize ) {
285 if ( !readNextBlock() ) {
297 static AI_FORCE_INLINE
298 bool isEndOfCache(
size_t pos,
size_t cacheSize ) {
299 return ( pos == cacheSize );
305 buffer.resize(m_cacheSize);
306 if ( isEndOfCache( m_cachePos, m_cacheSize ) || 0 == m_filePos) {
307 if (!readNextBlock()) {
312 if (IsLineEnd(m_cache[m_cachePos])) {
314 while (m_cache[m_cachePos] !=
'\n') {
318 if ( isEndOfCache( m_cachePos, m_cacheSize ) ) {
319 if ( !readNextBlock() ) {
326 while (!IsLineEnd(m_cache[ m_cachePos ])) {
327 buffer[i] = m_cache[ m_cachePos ];
330 if (m_cachePos >= m_cacheSize) {
331 if (!readNextBlock()) {
346 if ( 0 != m_cachePos ) {
347 buffer = std::vector<T>( m_cache.begin() + m_cachePos, m_cache.end() );
350 if ( !readNextBlock() ) {
354 buffer = std::vector<T>(m_cache.begin(), m_cache.end());
362 #endif // AI_IOSTREAMBUFFER_H_INC