#ifndef RIPPLE_RANGESET_H #define RIPPLE_RANGESET_H class RangeSet { public: static const uint32 RangeSetAbsent = static_cast(-1); protected: std::map mRanges; // First is lowest value in range, last is highest value in range typedef std::map::const_iterator const_iterator; typedef std::map::const_reverse_iterator const_reverse_iterator; typedef std::map::value_type value_type; typedef std::map::iterator iterator; static bool contains(value_type const& it, uint32 v) { return (it.first <= v) && (it.second >= v); } void simplify(); public: RangeSet() { ; } bool hasValue(uint32) const; uint32 getFirst() const; uint32 getNext(uint32) const; uint32 getLast() const; uint32 getPrev(uint32) const; uint32 prevMissing(uint32) const; // largest number not in the set that is less than the given number void setValue(uint32); void setRange(uint32, uint32); void clearValue(uint32); std::string toString() const; }; // VFALCO TODO these parameters should not be const references. template T range_check_cast(const U& value, const T& minimum, const T& maximum) { if ((value < minimum) || (value > maximum)) throw std::runtime_error("Value out of range"); return static_cast(value); } #endif // vim:ts=4