diff --git a/src/data.cpp b/src/data.cpp index f404ce12..40116640 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include //////////////////////////////////////////////////////////////////////////////// @@ -430,6 +431,44 @@ std::vector flatten ( return all; } +//////////////////////////////////////////////////////////////////////////////// +// Simply merges a vector of ranges, without data loss. +static bool rangeCompare (Range left, Range right) +{ + return left.start < right.start; +} + +std::vector merge ( + const std::vector & ranges) +{ + // Short cut. + if (ranges.size () < 2) + return ranges; + + std::vector sorted {ranges}; + std::sort (sorted.begin (), sorted.end (), rangeCompare); + + unsigned int cursor = 0; + int merges = 0; + for (unsigned int i = 0; i < sorted.size (); ++i) + { + if (cursor && sorted[cursor - 1].overlap (sorted[i])) + { + sorted[cursor - 1] = sorted[cursor - 1].combine (sorted[i]); + ++merges; + } + else + { + ++cursor; + } + } + + if (merges) + sorted.resize (ranges.size () - merges); + + return sorted; +} + //////////////////////////////////////////////////////////////////////////////// // Subset both ranges and additions by limits, and combine. std::vector addRanges ( diff --git a/src/timew.h b/src/timew.h index 5011bdec..124becbb 100644 --- a/src/timew.h +++ b/src/timew.h @@ -45,6 +45,7 @@ std::vector subset (const Interval&, const std::vector subset (const Range&, const std::vector &); std::vector subset (const Range&, const std::vector &); std::vector flatten (const Interval&, const std::vector &); +std::vector merge (const std::vector &); std::vector addRanges (const Range&, const std::vector &, const std::vector &); std::vector subtractRanges (const std::vector &, const std::vector &); Range outerRange (const std::vector &);