Skip to content
Snippets Groups Projects
RangeMap.impl.h 2.24 KiB
Newer Older
/******************************************************************************
 * 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];
	}
}