00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _AccumulatedAck_
00022 #define _AccumulatedAck_
00023
00024 #include <algorithm>
00025 #include <functional>
00026 #include <list>
00027 #include <ostream>
00028 #include "SequenceNumber.h"
00029 #include "SequenceNumberSet.h"
00030
00031 namespace qpid {
00032 namespace framing {
00033
00034 struct Range
00035 {
00036 SequenceNumber start;
00037 SequenceNumber end;
00038
00039 Range(SequenceNumber s, SequenceNumber e);
00040 bool contains(SequenceNumber i) const;
00041 bool intersect(const Range& r) const;
00042 bool merge(const Range& r);
00043 bool mergeable(const SequenceNumber& r) const;
00044 };
00049 class AccumulatedAck {
00050 public:
00054 SequenceNumber mark;
00059 std::list<Range> ranges;
00060
00061 explicit AccumulatedAck(SequenceNumber r = SequenceNumber());
00062 void update(SequenceNumber firstTag, SequenceNumber lastTag);
00063 void consolidate();
00064 void clear();
00065 bool covers(SequenceNumber tag) const;
00066 void collectRanges(SequenceNumberSet& set) const;
00067 void update(const SequenceNumber cumulative, const SequenceNumberSet& range);
00068 void operator()(SequenceNumber first, SequenceNumber last) { update(first, last); }
00069 };
00070 std::ostream& operator<<(std::ostream&, const Range&);
00071 std::ostream& operator<<(std::ostream&, const AccumulatedAck&);
00072 }
00073 }
00074
00075
00076 #endif