Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/******************************************************************************
* 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];
}
}