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
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <type_traits>
namespace Common {
// Represents a point within a 2D space.
template <typename T>
struct Point {
static_assert(std::is_arithmetic_v<T>, "T must be an arithmetic type!");
T x{};
T y{};
#define ARITHMETIC_OP(op, compound_op) \
friend constexpr Point operator op(const Point& lhs, const Point& rhs) noexcept { \
return { \
.x = static_cast<T>(lhs.x op rhs.x), \
.y = static_cast<T>(lhs.y op rhs.y), \
}; \
} \
friend constexpr Point operator op(const Point& lhs, T value) noexcept { \
return { \
.x = static_cast<T>(lhs.x op value), \
.y = static_cast<T>(lhs.y op value), \
}; \
} \
friend constexpr Point operator op(T value, const Point& rhs) noexcept { \
return { \
.x = static_cast<T>(value op rhs.x), \
.y = static_cast<T>(value op rhs.y), \
}; \
} \
friend constexpr Point& operator compound_op(Point& lhs, const Point& rhs) noexcept { \
lhs.x = static_cast<T>(lhs.x op rhs.x); \
lhs.y = static_cast<T>(lhs.y op rhs.y); \
return lhs; \
} \
friend constexpr Point& operator compound_op(Point& lhs, T value) noexcept { \
lhs.x = static_cast<T>(lhs.x op value); \
lhs.y = static_cast<T>(lhs.y op value); \
return lhs; \
}
ARITHMETIC_OP(+, +=)
ARITHMETIC_OP(-, -=)
ARITHMETIC_OP(*, *=)
ARITHMETIC_OP(/, /=)
#undef ARITHMETIC_OP
friend constexpr bool operator==(const Point&, const Point&) = default;
};
} // namespace Common
|