ostream& operator<<(ostream& out, const PastIntervals &i)
{
- assert(i.past_intervals);
- return i.past_intervals->print(out);
+ if (i.past_intervals) {
+ return i.past_intervals->print(out);
+ } else {
+ return out << "(empty)";
+ }
}
ostream& operator<<(ostream& out, const PastIntervals::PriorSet &i)
void PastIntervals::decode(bufferlist::iterator &bl)
{
DECODE_START(1, bl);
- __u8 classic = 0;
- ::decode(classic, bl);
- if (classic) {
+ __u8 type = 0;
+ ::decode(type, bl);
+ switch (type) {
+ case 0:
+ break;
+ case 1:
past_intervals.reset(new pi_simple_rep);
- } else {
+ past_intervals->decode(bl);
+ break;
+ case 2:
past_intervals.reset(new pi_compact_rep);
+ past_intervals->decode(bl);
+ break;
}
- past_intervals->decode(bl);
DECODE_FINISH(bl);
}
}
void encode(bufferlist &bl) const {
- assert(past_intervals);
ENCODE_START(1, 1, bl);
- __u8 classic = is_classic();
- ::encode(classic, bl);
- past_intervals->encode(bl);
+ if (past_intervals) {
+ __u8 type = is_classic() ? 1 : 2;
+ ::encode(type, bl);
+ past_intervals->encode(bl);
+ } else {
+ ::encode((__u8)0, bl);
+ }
ENCODE_FINISH(bl);
}
void encode_classic(bufferlist &bl) const {
- assert(past_intervals);
- assert(past_intervals->is_classic());
- past_intervals->encode(bl);
+ if (past_intervals) {
+ assert(past_intervals->is_classic());
+ past_intervals->encode(bl);
+ } else {
+ // it's a map<>
+ ::encode((uint32_t)0, bl);
+ }
}
void decode(bufferlist::iterator &bl);