1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
// compile only: members only declared, not implemented
#include <string>
#include <iterator>
#include <iostream>
struct Data
{
class iterator;
class const_iterator;
using reverse_iterator = std::reverse_iterator<iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
private:
std::string *d_data;
size_t d_n;
public:
// ...
};
struct Data::iterator
{
using iterator_category = std::bidirectional_iterator_tag;
using difference_type = std::ptrdiff_t;
using value_type = std::string;
using pointer = value_type *;
using reference = value_type &;
friend class Data;
private:
pointer d_current;
public:
iterator() = default;
iterator &operator++();
iterator &operator--();
std::string &operator*();
private:
iterator(std::string *data, size_t idx);
friend class std::reverse_iterator<iterator>;
};
bool operator==(Data::iterator const &lhs, Data::iterator const &rhs);
struct Data::const_iterator: public Data::iterator
{
using const_pointer = value_type const *;
using const_reference = value_type const &;
friend class Data;
friend class std::reverse_iterator<const_iterator>;
const_iterator() = default;
const_iterator &operator++();
const_iterator &operator--();
const_reference operator*() const;
// or, in this case: std::string const &operator*() const;
private:
const_iterator(std::string const *data, size_t idx);
};
bool operator==(Data::const_iterator const &lhs,
Data::const_iterator const &rhs);
void demo()
{
Data::iterator iter;
Data::reverse_iterator riter(iter);
std::cout << *riter << '\n';
Data::const_iterator citer;
Data::const_reverse_iterator criter(citer);
std::cout << *criter << '\n';
};
|