00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _framing_SequenceSet_h
00022 #define _framing_SequenceSet_h
00023
00024 #include <ostream>
00025 #include <list>
00026 #include "amqp_types.h"
00027 #include "Buffer.h"
00028 #include "SequenceNumber.h"
00029 #include "qpid/framing/reply_exceptions.h"
00030
00031 namespace qpid {
00032 namespace framing {
00033
00034 class SequenceSet
00035 {
00036 struct Range
00037 {
00038 SequenceNumber start;
00039 SequenceNumber end;
00040
00041 Range(SequenceNumber s, SequenceNumber e);
00042 bool contains(SequenceNumber i) const;
00043 bool intersects(const Range& r) const;
00044 bool merge(const Range& r);
00045 bool mergeable(const SequenceNumber& r) const;
00046 void encode(Buffer& buffer) const;
00047 };
00048
00049 typedef std::list<Range> Ranges;
00050 Ranges ranges;
00051
00052 public:
00053 SequenceSet() {}
00054 SequenceSet(const SequenceNumber& s) { add(s); }
00055
00056 void encode(Buffer& buffer) const;
00057 void decode(Buffer& buffer);
00058 uint32_t size() const;
00059
00060 bool contains(const SequenceNumber& s) const;
00061 void add(const SequenceNumber& s);
00062 void add(const SequenceNumber& start, const SequenceNumber& end);
00063 void add(const SequenceSet& set);
00064 void remove(const SequenceNumber& s);
00065 void remove(const SequenceNumber& start, const SequenceNumber& end);
00066 void remove(const SequenceSet& set);
00067
00068 void clear();
00069 bool empty() const;
00070
00071 template <class T>
00072 void for_each(T& t) const
00073 {
00074 for (Ranges::const_iterator i = ranges.begin(); i != ranges.end(); i++) {
00075 t(i->start, i->end);
00076 }
00077 }
00078
00079 friend std::ostream& operator<<(std::ostream&, const SequenceSet&);
00080 };
00081
00082
00083 }}
00084
00085
00086 #endif