#include <boost/icl/interval_map.hpp>
#include <iostream>
using namespace boost::icl;
// interval_map combiner functor: assigns new value if key exists
template <class Type>
struct inplace_replace {
typedef void result_type;
typedef Type& first_argument_type;
typedef const Type& second_argument_type;
void operator()(Type &object, const Type &operand) const { object = operand; }
};
template<>
inline std::string unary_template_to_string<inplace_replace>::apply() {
return "=";
}
/* When adding, if interval exists, replaces value.
* When subtracting, if interval exists, removes value.
*/
using ival_map =
interval_map<unsigned, // Key
unsigned, // Value
partial_enricher, // Unmapped intervals have unkown value;
// store identity values
std::less, // Comparator
inplace_replace, // Combination operator
inplace_erasure, // Extraction operator
closed_interval<unsigned, std::less> // Interval type
>;
using ival = ival_map::interval_type;
std::ostream &operator<<(std::ostream &os, const ival_map &m) {
for (auto &entry : m) {
os << entry.first << " : " << entry.second << "\n";
}
return os;
}
int main() {
ival_map m;
m.add(std::make_pair(ival(0, 9), 1));
std::cout << m << "\n\n";
m.add(std::make_pair(ival(3, 6), 3));
std::cout << m << "\n\n";
m.add(std::make_pair(ival(3, 6), 1));
std::cout << m << "\n\n";
m.subtract(std::make_pair(ival(3, 6), 3));
std::cout << m << "\n\n";
m.subtract(std::make_pair(ival(3, 6), 1));
std::cout << m << "\n\n";
return 0;
}
CiNpbmNsdWRlIDxib29zdC9pY2wvaW50ZXJ2YWxfbWFwLmhwcD4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjppY2w7CgovLyBpbnRlcnZhbF9tYXAgY29tYmluZXIgZnVuY3RvcjogYXNzaWducyBuZXcgdmFsdWUgaWYga2V5IGV4aXN0cwp0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4Kc3RydWN0IGlucGxhY2VfcmVwbGFjZSB7CiAgdHlwZWRlZiB2b2lkIHJlc3VsdF90eXBlOwogIHR5cGVkZWYgVHlwZSYgZmlyc3RfYXJndW1lbnRfdHlwZTsKICB0eXBlZGVmIGNvbnN0IFR5cGUmIHNlY29uZF9hcmd1bWVudF90eXBlOwogIHZvaWQgb3BlcmF0b3IoKShUeXBlICZvYmplY3QsIGNvbnN0IFR5cGUgJm9wZXJhbmQpIGNvbnN0IHsgb2JqZWN0ID0gb3BlcmFuZDsgfQp9OwoKdGVtcGxhdGU8PgppbmxpbmUgc3RkOjpzdHJpbmcgdW5hcnlfdGVtcGxhdGVfdG9fc3RyaW5nPGlucGxhY2VfcmVwbGFjZT46OmFwcGx5KCkgewoJcmV0dXJuICI9IjsKfQoKLyogV2hlbiBhZGRpbmcsIGlmIGludGVydmFsIGV4aXN0cywgcmVwbGFjZXMgdmFsdWUuCiAqIFdoZW4gc3VidHJhY3RpbmcsIGlmIGludGVydmFsIGV4aXN0cywgcmVtb3ZlcyB2YWx1ZS4KICovCnVzaW5nIGl2YWxfbWFwID0KICAgIGludGVydmFsX21hcDx1bnNpZ25lZCwgICAgICAgICAvLyBLZXkKICAgICAgICAgICAgICAgICB1bnNpZ25lZCwgICAgICAgICAvLyBWYWx1ZQogICAgICAgICAgICAgICAgIHBhcnRpYWxfZW5yaWNoZXIsIC8vIFVubWFwcGVkIGludGVydmFscyBoYXZlIHVua293biB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSBpZGVudGl0eSB2YWx1ZXMKICAgICAgICAgICAgICAgICBzdGQ6Omxlc3MsICAgICAgICAvLyBDb21wYXJhdG9yCiAgICAgICAgICAgICAgICAgaW5wbGFjZV9yZXBsYWNlLCAgLy8gQ29tYmluYXRpb24gb3BlcmF0b3IKICAgICAgICAgICAgICAgICBpbnBsYWNlX2VyYXN1cmUsICAvLyBFeHRyYWN0aW9uIG9wZXJhdG9yCiAgICAgICAgICAgICAgICAgY2xvc2VkX2ludGVydmFsPHVuc2lnbmVkLCBzdGQ6Omxlc3M+IC8vIEludGVydmFsIHR5cGUKICAgICAgICAgICAgICAgICA+OwoKdXNpbmcgaXZhbCA9IGl2YWxfbWFwOjppbnRlcnZhbF90eXBlOwoKc3RkOjpvc3RyZWFtICZvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IGl2YWxfbWFwICZtKSB7CiAgZm9yIChhdXRvICZlbnRyeSA6IG0pIHsKICAgIG9zIDw8IGVudHJ5LmZpcnN0IDw8ICIgOiAiIDw8IGVudHJ5LnNlY29uZCA8PCAiXG4iOwogIH0KICByZXR1cm4gb3M7Cn0KCmludCBtYWluKCkgewogIGl2YWxfbWFwIG07CiAgCiAgbS5hZGQoc3RkOjptYWtlX3BhaXIoaXZhbCgwLCA5KSwgMSkpOwogIHN0ZDo6Y291dCA8PCBtIDw8ICJcblxuIjsKCiAgbS5hZGQoc3RkOjptYWtlX3BhaXIoaXZhbCgzLCA2KSwgMykpOwogIHN0ZDo6Y291dCA8PCBtIDw8ICJcblxuIjsKCiAgbS5hZGQoc3RkOjptYWtlX3BhaXIoaXZhbCgzLCA2KSwgMSkpOwogIHN0ZDo6Y291dCA8PCBtIDw8ICJcblxuIjsKCiAgbS5zdWJ0cmFjdChzdGQ6Om1ha2VfcGFpcihpdmFsKDMsIDYpLCAzKSk7CiAgc3RkOjpjb3V0IDw8IG0gPDwgIlxuXG4iOwoKICBtLnN1YnRyYWN0KHN0ZDo6bWFrZV9wYWlyKGl2YWwoMywgNiksIDEpKTsKICBzdGQ6OmNvdXQgPDwgbSA8PCAiXG5cbiI7CgogIHJldHVybiAwOwp9Cg==
[0,9] : 1
[0,2] : 1
[3,6] : 3
[7,9] : 1
[0,9] : 1
[0,9] : 1
[0,2] : 1
[3,6] : 0
[7,9] : 1