25 #ifndef OR_TOOLS_UTIL_FILELINEITER_H_
26 #define OR_TOOLS_UTIL_FILELINEITER_H_
32 #include "absl/status/statusor.h"
33 #include "absl/strings/match.h"
50 : next_position_after_eol_(0),
56 const std::string&
operator*()
const {
return line_; }
58 return file_ != other.file_;
63 bool HasOption(
int option)
const {
return options_ & option; }
67 if (file_ ==
nullptr)
return;
70 int i = next_position_after_eol_;
71 for (; i < buffer_size_; ++i) {
72 if (buffer_[i] ==
'\n')
break;
74 if (i == buffer_size_) {
75 line_.append(&buffer_[next_position_after_eol_],
76 i - next_position_after_eol_);
77 buffer_size_ = file_->
Read(&buffer_, kBufferSize);
78 if (buffer_size_ < 0) {
79 LOG(WARNING) <<
"Error while reading file.";
83 next_position_after_eol_ = 0;
84 if (buffer_size_ == 0) {
91 line_.append(&buffer_[next_position_after_eol_],
92 i - next_position_after_eol_ + 1);
93 next_position_after_eol_ = i + 1;
99 (line_.empty() || line_ ==
"\n"));
102 void PostProcessLine() {
104 line_.erase(std::remove(line_.begin(), line_.end(),
'\r'), line_.end());
106 const auto eol = std::find(line_.begin(), line_.end(),
'\n');
112 static constexpr
int kBufferSize = 5 * 1024;
113 char buffer_[kBufferSize];
114 int next_position_after_eol_;
115 int64_t buffer_size_;
137 : file_(
file), options_(options) {
155 LOG(WARNING) <<
"Could not open: " << filename;
size_t Read(void *const buff, size_t size)
bool operator!=(const FileLineIterator &other) const
FileLineIterator(File *file, int options)
const std::string & operator*() const
FileLineIterator end() const
FileLines(const std::string &filename, File *const file, const int options=FileLineIterator::DEFAULT)
FileLines & operator=(const FileLines &)=delete
FileLines(const FileLines &)=delete
FileLines(const std::string &filename, int options=FileLineIterator::DEFAULT)
absl::Status Open(const absl::string_view &filename, const absl::string_view &mode, File **f, int flags)