OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::ReverseLineReader Class Reference
Collaboration diagram for Slic3r::ReverseLineReader:

Public Types

using pos_type = boost::nowide::ifstream::pos_type

Public Member Functions

 ReverseLineReader (boost::nowide::ifstream &ifs, pos_type file_start)
bool getline (std::string &out)

Private Attributes

boost::nowide::ifstream & m_ifs
std::vector< char > m_block
size_t m_block_size = 65536
size_t m_block_len = 0
pos_type m_file_start
pos_type m_file_pos = 0

Detailed Description

Member Typedef Documentation

◆ pos_type

using Slic3r::ReverseLineReader::pos_type = boost::nowide::ifstream::pos_type

Constructor & Destructor Documentation

◆ ReverseLineReader()

Slic3r::ReverseLineReader::ReverseLineReader ( boost::nowide::ifstream & ifs,
pos_type file_start )
inline
1344 : m_ifs(ifs), m_file_start(file_start)
1345 {
1346 m_ifs.seekg(0, m_ifs.end);
1347 m_file_pos = m_ifs.tellg();
1348 m_block.assign(m_block_size, 0);
1349 }
pos_type m_file_pos
Definition Config.cpp:1398
pos_type m_file_start
Definition Config.cpp:1397
size_t m_block_size
Definition Config.cpp:1395
boost::nowide::ifstream & m_ifs
Definition Config.cpp:1393
std::vector< char > m_block
Definition Config.cpp:1394

References m_block, m_block_size, m_file_pos, m_file_start, and m_ifs.

Member Function Documentation

◆ getline()

bool Slic3r::ReverseLineReader::getline ( std::string & out)
inline
1351 {
1352 out.clear();
1353 for (;;) {
1354 if (m_block_len == 0) {
1355 // Read the next block.
1356 m_block_len = size_t(std::min<std::fstream::pos_type>(m_block_size, m_file_pos - m_file_start));
1357 if (m_block_len == 0)
1358 return false;
1360 m_ifs.seekg(m_file_pos, m_ifs.beg);
1361 if (! m_ifs.read(m_block.data(), m_block_len))
1362 return false;
1363 }
1364
1365 assert(m_block_len > 0);
1366 // Non-empty buffer. Find another LF.
1367 int i = int(m_block_len) - 1;
1368 for (; i >= 0; -- i)
1369 if (m_block[i] == '\n')
1370 break;
1371 // i is position of LF or -1 if not found.
1372 if (i == -1) {
1373 // LF not found. Just make a backup of the buffer and continue.
1374 out.insert(out.begin(), m_block.begin(), m_block.begin() + m_block_len);
1375 m_block_len = 0;
1376 } else {
1377 assert(i >= 0);
1378 // Copy new line to the output. It may be empty.
1379 out.insert(out.begin(), m_block.begin() + i + 1, m_block.begin() + m_block_len);
1380 // Block length without the newline.
1381 m_block_len = i;
1382 // Remove CRLF from the end of the block.
1383 if (m_block_len > 0 && m_block[m_block_len - 1] == '\r')
1384 -- m_block_len;
1385 return true;
1386 }
1387 }
1388 assert(false);
1389 return false;
1390 }
size_t m_block_len
Definition Config.cpp:1396

References m_block, m_block_len, m_block_size, m_file_pos, m_file_start, and m_ifs.

Member Data Documentation

◆ m_block

std::vector<char> Slic3r::ReverseLineReader::m_block
private

Referenced by ReverseLineReader(), and getline().

◆ m_block_len

size_t Slic3r::ReverseLineReader::m_block_len = 0
private

Referenced by getline().

◆ m_block_size

size_t Slic3r::ReverseLineReader::m_block_size = 65536
private

Referenced by ReverseLineReader(), and getline().

◆ m_file_pos

pos_type Slic3r::ReverseLineReader::m_file_pos = 0
private

Referenced by ReverseLineReader(), and getline().

◆ m_file_start

pos_type Slic3r::ReverseLineReader::m_file_start
private

Referenced by ReverseLineReader(), and getline().

◆ m_ifs

boost::nowide::ifstream& Slic3r::ReverseLineReader::m_ifs
private

Referenced by ReverseLineReader(), and getline().


The documentation for this class was generated from the following file:
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/Config.cpp