- if (!v2Size)
- rv.appendRange(v1.begin(), v1.end());
- else {
- size_t i1 = 0, i2 = 0;
- rv.appendRange(v1.begin(), v1.end());
-
- while (i1 < rv.size() && i2 < v2Size) {
- ShapeInterval<T>& interval1 = rv[i1];
- const ShapeInterval<T>& interval2 = v2[i2];
-
- if (interval2.x1() <= interval1.x1() && interval2.x2() >= interval1.x2())
- rv.remove(i1);
- else if (interval2.x2() < interval1.x1())
- i2 += 1;
- else if (interval2.x1() > interval1.x2())
- i1 += 1;
- else if (interval2.x1() > interval1.x1() && interval2.x2() < interval1.x2()) {
- rv.insert(i1, ShapeInterval(interval1.x1(), interval2.x1()));
- interval1.set(interval2.x2(), interval1.x2());
- i2 += 1;
- } else if (interval2.x1() <= interval1.x1()) {
- interval1.set(interval2.x2(), interval1.x2());
- i2 += 1;
- } else { // (interval2.x2() >= interval1.x2())
- interval1.set(interval1.x1(), interval2.x1());
- i1 += 1;
+ if (b.isEmpty()) {
+ result.appendRange(a.begin(), a.end());
+ return;
+ }
+
+ const_iterator aNext = a.begin();
+ const_iterator bNext = b.begin();
+ ShapeInterval<T> aValue = *aNext;
+ ShapeInterval<T> bValue = *bNext;
+
+ while (aNext != a.end() && bNext != b.end()) {
+ if (bValue.contains(aValue)) {
+ aValue = *++aNext;
+ } else if (aValue.contains(bValue)) {
+ if (bValue.x1() > aValue.x1())
+ result.append(ShapeInterval<T>(aValue.x1(), bValue.x1()));
+ if (aValue.x2() > bValue.x2())
+ aValue.setX1(bValue.x2());
+ else
+ aValue = *++aNext;
+ bValue = *++bNext;
+ } else if (aValue.overlaps(bValue)) {
+ if (aValue.x1() < bValue.x1()) {
+ result.append(ShapeInterval<T>(aValue.x1(), bValue.x1()));
+ aValue = *++aNext;
+ } else {
+ aValue.setX1(bValue.x2());
+ bValue = *++bNext;