Listing 3: A partial implementation of MutableSegmentSet
#include <set>
#include "segment.h"
class MutableSegmentSet;
class fCompare
{
public:
fCompare(const MutableSegmentSet& set) : m_set(set) {}
bool operator() (const Segment& lhs, const Segment& rhs) const;
private:
const MutableSegmentSet& m_set;
};
class MutableSegmentSet
{
public:
typedef std::set<Segment, fCompare> SegSet;
typedef SegSet::iterator iterator;
typedef SegSet::const_iterator const_iterator;
MutableSegmentSet() : m_set(fCompare(*this)), m_scan_pos(0) {}
void set_coord(int x)
{
m_scan_pos = x;
reorder();
}
int get_coord() const { return m_scan_pos; }
// methods begin, end
// methods insert, erase, find
private:
std::set<Segment, fCompare> m_set;
int m_scan_pos;
class MutableIter : public SegSet::iterator
{
public:
typedef SegSet::iterator BaseIter;
// constructors
Segment& operator*()
{
return const_cast<Segment&>(this->BaseIter::operator*());
}
MutableIter& operator++();
const MutableIter operator++(int);
MutableIter& operator--();
const MutableIter operator--(int);
bool operator==( const MutableIter& rhs);
bool operator!=( const MutableIter& rhs);
Segment* operator->();
};
void reorder();
void reverse(iterator first, iterator last);
iterator get_intersecting_segs(iterator first, iterator last);
};