1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-27 00:34:46 +01:00
Files
OpenRCT2/src/openrct2/interface/ZoomLevel.h
2022-02-26 23:14:59 +01:00

109 lines
2.9 KiB
C++

/*****************************************************************************
* Copyright (c) 2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#pragma once
#include <cstdint>
struct ZoomLevel
{
private:
int8_t _level{};
public:
constexpr ZoomLevel() = default;
explicit constexpr ZoomLevel(int8_t level)
: _level(level)
{
}
constexpr ZoomLevel(const ZoomLevel& rhs)
: _level(rhs._level)
{
}
explicit constexpr operator int8_t() const
{
return _level;
}
ZoomLevel operator++(int);
ZoomLevel& operator++();
ZoomLevel operator--(int);
ZoomLevel& operator--();
ZoomLevel& operator=(const ZoomLevel& other);
ZoomLevel& operator+=(const ZoomLevel& rhs);
ZoomLevel& operator-=(const ZoomLevel& rhs);
friend ZoomLevel operator+(ZoomLevel lhs, const ZoomLevel& rhs);
friend ZoomLevel operator-(ZoomLevel lhs, const ZoomLevel& rhs);
friend ZoomLevel operator+(ZoomLevel lhs, int8_t rhs);
friend ZoomLevel operator-(ZoomLevel lhs, int8_t rhs);
friend constexpr bool operator==(const ZoomLevel& lhs, const ZoomLevel& rhs);
friend constexpr bool operator!=(const ZoomLevel& lhs, const ZoomLevel& rhs);
friend constexpr bool operator>=(const ZoomLevel& lhs, const ZoomLevel& rhs);
friend constexpr bool operator<=(const ZoomLevel& lhs, const ZoomLevel& rhs);
friend constexpr bool operator>(const ZoomLevel& lhs, const ZoomLevel& rhs);
friend constexpr bool operator<(const ZoomLevel& lhs, const ZoomLevel& rhs);
template<typename T> T ApplyTo(const T& lhs) const
{
if (_level < 0)
return lhs >> -_level;
return lhs << _level;
}
template<typename T> T ApplyInversedTo(const T& lhs) const
{
if (_level < 0)
return lhs << -_level;
return lhs >> _level;
}
static ZoomLevel min();
static constexpr ZoomLevel max()
{
return ZoomLevel{ 3 };
}
};
constexpr bool operator==(const ZoomLevel& lhs, const ZoomLevel& rhs)
{
return lhs._level == rhs._level;
}
constexpr bool operator!=(const ZoomLevel& lhs, const ZoomLevel& rhs)
{
return lhs._level != rhs._level;
}
constexpr bool operator>=(const ZoomLevel& lhs, const ZoomLevel& rhs)
{
return lhs._level >= rhs._level;
}
constexpr bool operator<=(const ZoomLevel& lhs, const ZoomLevel& rhs)
{
return lhs._level <= rhs._level;
}
constexpr bool operator>(const ZoomLevel& lhs, const ZoomLevel& rhs)
{
return lhs._level > rhs._level;
}
constexpr bool operator<(const ZoomLevel& lhs, const ZoomLevel& rhs)
{
return lhs._level < rhs._level;
}