Database: Add forward/reverse iterator

This allows the database to be treated as a single collection of strings, but
can be used to avoid loading the entire database when only interested in recent
entries.

Related to issue #245.
This commit is contained in:
Shaun Ruffell 2019-12-23 04:04:45 -06:00 committed by lauft
parent ea3bbd0e85
commit 557fd4cb34
2 changed files with 245 additions and 0 deletions

View file

@ -38,6 +38,60 @@
class Database
{
public:
class iterator
{
private:
friend class Database;
typedef std::vector <Datafile>::iterator files_iterator;
typedef std::vector <std::string>::const_iterator lines_iterator;
typedef std::string value_type;
files_iterator files_it;
files_iterator files_end;
lines_iterator lines_it;
lines_iterator lines_end;
iterator (files_iterator fbegin, files_iterator fend);
public:
iterator& operator++ ();
iterator& operator++ (int);
iterator& operator-- ();
bool operator== (const iterator & other) const;
bool operator!= (const iterator & other) const;
const value_type& operator* () const;
const value_type* operator-> () const;
};
class reverse_iterator
{
private:
friend class Database;
typedef std::vector <Datafile>::reverse_iterator files_iterator;
typedef std::vector <std::string>::const_reverse_iterator lines_iterator;
typedef std::string value_type;
files_iterator files_it;
files_iterator files_end;
lines_iterator lines_it;
lines_iterator lines_end;
reverse_iterator(files_iterator fbegin, files_iterator fend);
public:
reverse_iterator& operator++ ();
reverse_iterator& operator++ (int);
reverse_iterator& operator-- ();
bool operator== (const reverse_iterator & other) const;
bool operator!= (const reverse_iterator & other) const;
const value_type& operator* () const;
const value_type* operator-> () const;
};
public:
Database () = default;
void initialize (const std::string&, Journal& journal);
@ -53,6 +107,11 @@ public:
std::string dump () const;
iterator begin ();
iterator end ();
reverse_iterator rbegin ();
reverse_iterator rend ();
private:
unsigned int getDatafile (int, int);
std::vector <Range> segmentRange (const Range&);