/****************************************************************************** * File: RangeMap.impl.h * Date: 17.5.2018 *****************************************************************************/ #include "Grinder.h" #include "RangeMap.h" #include "util/StringConv.h" template<typename ValType> void RangeMap<ValType>::add(value_type at, range_type range) { _rangeMap[at] += range; } template<typename ValType> void RangeMap<ValType>::remove(value_type at, range_type range) { if (_rangeMap.find(at) != _rangeMap.end()) { _rangeMap[at] -= range; if (_rangeMap[at].empty()) _rangeMap.erase(at); } } template<typename ValType> bool RangeMap<ValType>::contains(value_type at, value_type value) const { if (_rangeMap.find(at) != _rangeMap.end()) return _rangeMap.at(at).contains(value); else return false; } template<typename ValType> auto RangeMap<ValType>::bounds() const { std::pair<value_type, value_type> boundsX{std::numeric_limits<value_type>::max(), std::numeric_limits<value_type>::min()}; std::pair<value_type, value_type> boundsY{std::numeric_limits<value_type>::max(), std::numeric_limits<value_type>::min()}; for (auto it = _rangeMap.cbegin(); it != _rangeMap.cend(); ++it) { // Get bounds in x direction auto rangeBounds = it->second.bounds(); if (rangeBounds.first < boundsX.first) boundsX.first = rangeBounds.first; if (rangeBounds.second > boundsX.second) boundsX.second = rangeBounds.second; // Get bounds in y direction if (it->first < boundsY.first) boundsY.first = it->first; if (it->first > boundsY.second) boundsY.second = it->first; } return std::make_pair(boundsX, boundsY); } template<typename ValType> QString RangeMap<ValType>::toString() const { QStringList rangeMap; for (auto it = _rangeMap.cbegin(); it != _rangeMap.cend(); ++it) rangeMap << QString{"%1:%2"}.arg(StringConv::convertValue(it->first)).arg(it->second.toString()); return rangeMap.join("|"); } template<typename ValType> void RangeMap<ValType>::fromString(const QString& str) { _rangeMap.clear(); for (auto rangeVector : str.split("|", QString::SkipEmptyParts)) { QStringList tokens = rangeVector.split(":"); if (tokens.size() == 2) _rangeMap[StringConv::convertString<value_type>(tokens[0])] = tokens[1]; } }