Prusa Slicer 2.6.0
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
869 : m_ifs(ifs), m_file_start(file_start)
870 {
871 m_ifs.seekg(0, m_ifs.end);
872 m_file_pos = m_ifs.tellg();
873 m_block.assign(m_block_size, 0);
874 }
pos_type m_file_pos
Definition Config.cpp:924
pos_type m_file_start
Definition Config.cpp:923
size_t m_block_size
Definition Config.cpp:921
boost::nowide::ifstream & m_ifs
Definition Config.cpp:919
std::vector< char > m_block
Definition Config.cpp:920

Member Function Documentation

◆ getline()

bool Slic3r::ReverseLineReader::getline ( std::string &  out)
inline
876 {
877 out.clear();
878 for (;;) {
879 if (m_block_len == 0) {
880 // Read the next block.
881 m_block_len = size_t(std::min<std::fstream::pos_type>(m_block_size, m_file_pos - m_file_start));
882 if (m_block_len == 0)
883 return false;
885 m_ifs.seekg(m_file_pos, m_ifs.beg);
886 if (! m_ifs.read(m_block.data(), m_block_len))
887 return false;
888 assert(m_block_len == m_ifs.gcount());
889 }
890
891 assert(m_block_len > 0);
892 // Non-empty buffer. Find another LF.
893 int i = int(m_block_len) - 1;
894 for (; i >= 0; -- i)
895 if (m_block[i] == '\n')
896 break;
897 // i is position of LF or -1 if not found.
898 if (i == -1) {
899 // LF not found. Just make a backup of the buffer and continue.
900 out.insert(out.begin(), m_block.begin(), m_block.begin() + m_block_len);
901 m_block_len = 0;
902 } else {
903 assert(i >= 0);
904 // Copy new line to the output. It may be empty.
905 out.insert(out.begin(), m_block.begin() + i + 1, m_block.begin() + m_block_len);
906 // Block length without the newline.
907 m_block_len = i;
908 // Remove CRLF from the end of the block.
909 if (m_block_len > 0 && m_block[m_block_len - 1] == '\r')
910 -- m_block_len;
911 return true;
912 }
913 }
914 assert(false);
915 return false;
916 }
size_t m_block_len
Definition Config.cpp:922

Referenced by Slic3r::ConfigBase::load_from_gcode_file().

+ Here is the caller graph for this function:

Member Data Documentation

◆ m_block

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

◆ m_block_len

size_t Slic3r::ReverseLineReader::m_block_len = 0
private

◆ m_block_size

size_t Slic3r::ReverseLineReader::m_block_size = 65536
private

◆ m_file_pos

pos_type Slic3r::ReverseLineReader::m_file_pos = 0
private

◆ m_file_start

pos_type Slic3r::ReverseLineReader::m_file_start
private

◆ m_ifs

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

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