diff options
author | Lane Kolbly <lane.kolbly@ni.com> | 2022-03-09 14:54:31 -0600 |
---|---|---|
committer | Aaron Rossetto <aaron.rossetto@ni.com> | 2022-03-14 15:49:41 -0500 |
commit | 74f371fcd3ec126d132fdf69b4f504e6157a6147 (patch) | |
tree | b899c401c83ec7fdaae74c42dd310ac0b795aa73 /host/lib | |
parent | b14480265ddeb1e6b4ad9d52c11b4c39e36fd379 (diff) | |
download | uhd-74f371fcd3ec126d132fdf69b4f504e6157a6147.tar.gz uhd-74f371fcd3ec126d132fdf69b4f504e6157a6147.tar.bz2 uhd-74f371fcd3ec126d132fdf69b4f504e6157a6147.zip |
host: Create meta_range_t::as_monotonic
In order to perform certain operations (start/stop/step), meta_range_t
objects must be "monotonic", meaning that the subranges composing it
are sorted and non-overlapping. This commit creates a method which
takes a non-monotonic meta_range_t containing no non-continuous
subranges and converts it into a monotonic meta_range_t.
Diffstat (limited to 'host/lib')
-rw-r--r-- | host/lib/types/ranges.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/host/lib/types/ranges.cpp b/host/lib/types/ranges.cpp index 16edeccca..5a5beb2e6 100644 --- a/host/lib/types/ranges.cpp +++ b/host/lib/types/ranges.cpp @@ -92,6 +92,35 @@ meta_range_t::meta_range_t(double start, double stop, double step) /* NOP */ } +meta_range_t meta_range_t::as_monotonic() const +{ + meta_range_t result; + for (const auto& range : *this) { + if (range.step() != 0.0) { + throw uhd::value_error("Cannot monotonize meta_range which contains non-continuous subranges"); + } + result.push_back(range); + } + + std::sort(result.begin(), result.end(), [](const range_t& a, const range_t& b) { + return a.start() < b.start(); + }); + + // Merge overlapping + size_t i = 1; + while (i < result.size()) { + if (result[i - 1].stop() > result[i].start()) { + const auto new_stop = std::max(result[i - 1].stop(), result[i].stop()); + result[i - 1] = range_t(result[i - 1].start(), new_stop, 0.0); + result.erase(result.begin() + i); + } else { + i++; + } + } + + return result; +} + double meta_range_t::start(void) const { check_meta_range_monotonic(*this); |