25 #ifndef OR_TOOLS_UTIL_FILELINEITER_H_
26 #define OR_TOOLS_UTIL_FILELINEITER_H_
28 #include "absl/strings/match.h"
44 : next_position_after_eol_(0),
50 const std::string&
operator*()
const {
return line_; }
52 return file_ != other.file_;
57 bool HasOption(
int option)
const {
return options_ & option; }
61 if (file_ ==
nullptr)
return;
64 int i = next_position_after_eol_;
65 for (; i < buffer_size_; ++i) {
66 if (buffer_[i] ==
'\n')
break;
68 if (i == buffer_size_) {
69 line_.append(&buffer_[next_position_after_eol_],
70 i - next_position_after_eol_);
71 buffer_size_ = file_->
Read(&buffer_, kBufferSize);
72 if (buffer_size_ < 0) {
77 next_position_after_eol_ = 0;
78 if (buffer_size_ == 0) {
85 line_.append(&buffer_[next_position_after_eol_],
86 i - next_position_after_eol_ + 1);
87 next_position_after_eol_ = i + 1;
93 (line_.empty() || line_ ==
"\n"));
96 void PostProcessLine() {
98 line_.erase(std::remove(line_.begin(), line_.end(),
'\r'), line_.end());
100 const auto eol = std::find(line_.begin(), line_.end(),
'\n');
106 static constexpr
int kBufferSize = 5 * 1024;
107 char buffer_[kBufferSize];
108 int next_position_after_eol_;
117 FileLines(
const std::string& filename,
int options) : options_(options) {
137 #endif // OR_TOOLS_UTIL_FILELINEITER_H_