file_sorting/src/file_reader.cpp

63 lines
1.2 KiB
C++

#include <vector>
#include "../include/file_reader.hpp"
void FileReader::refill_buffer()
{
current_pos_ = 0;
valid_items_ = 0;
for (size_t i = 0; i < buffer_.size(); ++i) {
Record record;
if (!(stream_ >> record)) {
break;
}
buffer_[i] = record;
valid_items_ = i + 1;
}
}
FileReader::FileReader(const std::string& filename, size_t buffer_size)
: stream_(filename)
, buffer_(buffer_size)
, current_pos_(0)
, valid_items_(0)
, total_reads_(0)
{
refill_buffer();
}
std::optional<Record> FileReader::read()
{
if (current_pos_ >= valid_items_) {
refill_buffer();
}
if (valid_items_ == 0) {
return std::nullopt;
}
Record record = buffer_[current_pos_];
current_pos_++;
total_reads_++;
return record;
}
size_t FileReader::read_chunk(std::span<Record>& chunk)
{
size_t count = 0;
for (size_t i = 0; i < chunk.size(); i++) {
auto record = read();
if (!record.has_value()) {
break;
}
chunk[count] = record.value();
count++;
}
return count;
}
size_t FileReader::total_reads() const
{
return total_reads_;
}