Hi,
I have a class modeling a record-based read-only binary file and I have
written a random access iterator based on iterator_facade to iterate
over the records. The class looks like this:
class my_binary_file {
public:
typedef std::string key_type;
typedef unsigned int value_type;
typedef std::pair record_type;
private:
class my_binary_file_iterator : public boost::iterator_facade<
my_binary_file_iterator,
my_binary_file::record_type const,
boost::random_access_traversal_tag,
my_binary_file::record_type&,
int>
{
public:
my_binary_file_iterator() : rec_num_(0), ff_ptr_(0) { }
explicit my_binary_file_iterator(my_binary_file* ff, unsigned int
n) : ff_ptr_(ff), rec_num_(n) { }
private:
friend class boost::iterator_core_access;
unsigned int rec_num_;
my_binary_file* ff_ptr_;
mutable my_binary_file::record_type record;
void increment() { ++rec_num_; }
void decrement() { --rec_num_; }
void advance(int n) { rec_num_ += n; }
int distance_to(const my_binary_file_iterator z) const {
return z.rec_num_ - this->rec_num_;
}
bool equal(my_binary_file_iterator const& other) const {
return this->ff_ptr_ == other.ff_ptr_ && this->rec_num_ ==
other.rec_num_;
}
const my_binary_file::record_type
dereference() const {
ff_ptr_->seekg(rec_num_);
my_binary_file::key_type key;
my_binary_file::value_type val;
ff_ptr_->get_record(key, val);
record = std::make_pair(key, val);
return record;
}
};
public:
typedef my_binary_file_iterator iterator;
iterator begin() const { return iterator(this, 0); }
iterator end() const { return iterator(this, num_records_); }
// Opens a binary file for reading
explicit my_binary_file(const std::string& path);
~my_binary_file();
operator void*() const;
bool operator!() const;
// Reads the record at the current position
bool get_record(key_type& k, value_type& v);
std::ios::pos_type tellg() const { return fs_.tellg(); }
void seekg(unsigned int n) {
fs_.seekg(start_record_ + std::ios::off_type(n * record_size_),
std::ios::beg);
}
private:
boost::filesystem::path pathname_;
mutable boost::filesystem::fstream fs_;
std::streampos start_record_;
key_type::size_type key_size_;
unsigned int record_size_, num_records_;
};
Unfortunately, when I try to compile my project, I get the following
error:
error: invalid conversion from 'const frequency_file* const' to
'frequency_file*'
I have tried several variants of my code, but without success.
I think I'm missing something pretty obvious in my definition of
my_binary_file_iterator, but I can't get out of it. Anyone can help?
Regards
Nicola