##// END OF EJS Templates
Separate the initialization of the properties of the graph of the update of the units of the graph....
Separate the initialization of the properties of the graph of the update of the units of the graph. The initialization of the properties is carried out when adding a variable in the graph, the update of the units is carried out when loading the data of this variable

File last commit:

r696:cb05b478d08e
r1254:41b7c6aab8be
Show More
DataSeriesMergeHelper.h
83 lines | 2.6 KiB | text/x-c | CLexer
/ core / include / Data / DataSeriesMergeHelper.h
#ifndef SCIQLOP_DATASERIESMERGEHELPER_H
#define SCIQLOP_DATASERIESMERGEHELPER_H
template <int Dim>
class DataSeries;
namespace detail {
/**
* Scope that can be used for a merge operation
* @tparam FEnd the type of function that will be executed at the end of the scope
*/
template <typename FEnd>
struct MergeScope {
explicit MergeScope(FEnd end) : m_End{end} {}
virtual ~MergeScope() noexcept { m_End(); }
FEnd m_End;
};
/**
* Creates a scope for merge operation
* @tparam end the function executed at the end of the scope
*/
template <typename FEnd>
MergeScope<FEnd> scope(FEnd end)
{
return MergeScope<FEnd>{end};
}
} // namespace detail
/// Helper used to merge two DataSeries
/// @sa DataSeries
struct DataSeriesMergeHelper {
/// Merges the source data series into the dest data series. Data of the source data series are
/// consumed
template <int Dim>
static void merge(DataSeries<Dim> &source, DataSeries<Dim> &dest)
{
// Creates a scope to clear source data series at the end of the merge
auto _ = detail::scope([&source]() { source.clear(); });
// Case : source data series is empty -> no merge is made
if (source.isEmpty()) {
return;
}
// Case : dest data series is empty -> we simply swap the data
if (dest.isEmpty()) {
std::swap(dest.m_XAxisData, source.m_XAxisData);
std::swap(dest.m_ValuesData, source.m_ValuesData);
return;
}
auto destMin = dest.cbegin()->x();
auto destMax = (--dest.cend())->x();
auto sourceBegin = source.cbegin();
auto sourceEnd = source.cend();
auto sourceMin = sourceBegin->x();
auto sourceMax = (--source.cend())->x();
// Case : source bounds are inside dest bounds -> no merge is made
if (sourceMin >= destMin && sourceMax <= destMax) {
return;
}
// Default case :
// - prepend to dest the values of source that are lower than min value of dest
// - append to dest the values of source that are greater than max value of dest
auto lowerIt
= std::lower_bound(sourceBegin, sourceEnd, destMin,
[](const auto &it, const auto &val) { return it.x() < val; });
auto upperIt
= std::upper_bound(lowerIt, sourceEnd, destMax,
[](const auto &val, const auto &it) { return val < it.x(); });
dest.insert(sourceBegin, lowerIt, true);
dest.insert(upperIt, sourceEnd);
}
};
#endif // SCIQLOP_DATASERIESMERGEHELPER_H