#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 : identity_based_inplace_combine<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;
}
CiNpbmNsdWRlIDxib29zdC9pY2wvaW50ZXJ2YWxfbWFwLmhwcD4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjppY2w7CgovLyBpbnRlcnZhbF9tYXAgY29tYmluZXIgZnVuY3RvcjogYXNzaWducyBuZXcgdmFsdWUgaWYga2V5IGV4aXN0cwp0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4Kc3RydWN0IGlucGxhY2VfcmVwbGFjZSA6IGlkZW50aXR5X2Jhc2VkX2lucGxhY2VfY29tYmluZTxUeXBlPiB7CiAgdm9pZCBvcGVyYXRvcigpKFR5cGUgJm9iamVjdCwgY29uc3QgVHlwZSAmb3BlcmFuZCkgY29uc3QgeyBvYmplY3QgPSBvcGVyYW5kOyB9Cn07Cgp0ZW1wbGF0ZTw+CmlubGluZSBzdGQ6OnN0cmluZyB1bmFyeV90ZW1wbGF0ZV90b19zdHJpbmc8aW5wbGFjZV9yZXBsYWNlPjo6YXBwbHkoKSB7CglyZXR1cm4gIj0iOwp9CgovKiBXaGVuIGFkZGluZywgaWYgaW50ZXJ2YWwgZXhpc3RzLCByZXBsYWNlcyB2YWx1ZS4KICogV2hlbiBzdWJ0cmFjdGluZywgaWYgaW50ZXJ2YWwgZXhpc3RzLCByZW1vdmVzIHZhbHVlLgogKi8KdXNpbmcgaXZhbF9tYXAgPQogICAgaW50ZXJ2YWxfbWFwPHVuc2lnbmVkLCAgICAgICAgIC8vIEtleQogICAgICAgICAgICAgICAgIHVuc2lnbmVkLCAgICAgICAgIC8vIFZhbHVlCiAgICAgICAgICAgICAgICAgcGFydGlhbF9lbnJpY2hlciwgLy8gVW5tYXBwZWQgaW50ZXJ2YWxzIGhhdmUgdW5rb3duIHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIGlkZW50aXR5IHZhbHVlcwogICAgICAgICAgICAgICAgIHN0ZDo6bGVzcywgICAgICAgIC8vIENvbXBhcmF0b3IKICAgICAgICAgICAgICAgICBpbnBsYWNlX3JlcGxhY2UsICAvLyBDb21iaW5hdGlvbiBvcGVyYXRvcgogICAgICAgICAgICAgICAgIGlucGxhY2VfZXJhc3VyZSwgIC8vIEV4dHJhY3Rpb24gb3BlcmF0b3IKICAgICAgICAgICAgICAgICBjbG9zZWRfaW50ZXJ2YWw8dW5zaWduZWQsIHN0ZDo6bGVzcz4gLy8gSW50ZXJ2YWwgdHlwZQogICAgICAgICAgICAgICAgID47Cgp1c2luZyBpdmFsID0gaXZhbF9tYXA6OmludGVydmFsX3R5cGU7CgpzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgaXZhbF9tYXAgJm0pIHsKICBmb3IgKGF1dG8gJmVudHJ5IDogbSkgewogICAgb3MgPDwgZW50cnkuZmlyc3QgPDwgIiA6ICIgPDwgZW50cnkuc2Vjb25kIDw8ICJcbiI7CiAgfQogIHJldHVybiBvczsKfQoKaW50IG1haW4oKSB7CiAgaXZhbF9tYXAgbTsKICAKICBtLmFkZChzdGQ6Om1ha2VfcGFpcihpdmFsKDAsIDkpLCAxKSk7CiAgc3RkOjpjb3V0IDw8IG0gPDwgIlxuXG4iOwoKICBtLmFkZChzdGQ6Om1ha2VfcGFpcihpdmFsKDMsIDYpLCAzKSk7CiAgc3RkOjpjb3V0IDw8IG0gPDwgIlxuXG4iOwoKICBtLmFkZChzdGQ6Om1ha2VfcGFpcihpdmFsKDMsIDYpLCAxKSk7CiAgc3RkOjpjb3V0IDw8IG0gPDwgIlxuXG4iOwoKICBtLnN1YnRyYWN0KHN0ZDo6bWFrZV9wYWlyKGl2YWwoMywgNiksIDMpKTsKICBzdGQ6OmNvdXQgPDwgbSA8PCAiXG5cbiI7CgogIG0uc3VidHJhY3Qoc3RkOjptYWtlX3BhaXIoaXZhbCgzLCA2KSwgMSkpOwogIHN0ZDo6Y291dCA8PCBtIDw8ICJcblxuIjsKCiAgcmV0dXJuIDA7Cn0K
[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