[nostalgia/geo] Add comparison operators to Vec
This commit is contained in:
parent
0e041a666a
commit
60e259ca34
@ -18,8 +18,33 @@
|
||||
|
||||
namespace nostalgia::geo {
|
||||
|
||||
struct Vec2 {
|
||||
using value_type = float;
|
||||
template<typename T = float>
|
||||
struct Vec2Base {
|
||||
public:
|
||||
using value_type = T;
|
||||
T x = 0;
|
||||
T y = 0;
|
||||
|
||||
constexpr Vec2Base() noexcept = default;
|
||||
|
||||
constexpr Vec2Base(T pX, T pY) noexcept: x(pX), y(pY) {
|
||||
}
|
||||
|
||||
#if __has_include(<imgui.h>)
|
||||
explicit inline operator ImVec2() const noexcept {
|
||||
return {x, y};
|
||||
}
|
||||
#endif
|
||||
|
||||
protected:
|
||||
constexpr T *start() noexcept {
|
||||
return &x;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Base>
|
||||
struct Vec: Base {
|
||||
using value_type = typename Base::value_type;
|
||||
using size_type = std::size_t;
|
||||
|
||||
static constexpr auto TypeName = "net.drinkingtea.nostalgia.geo.Point";
|
||||
@ -131,79 +156,80 @@ struct Vec2 {
|
||||
|
||||
};
|
||||
|
||||
float x = 0;
|
||||
float y = 0;
|
||||
constexpr Vec() noexcept = default;
|
||||
|
||||
constexpr Vec2() noexcept = default;
|
||||
|
||||
constexpr Vec2(float pX, float pY) noexcept: x(pX), y(pY) {
|
||||
constexpr Vec(value_type pX, value_type pY) noexcept: Base(pX, pY) {
|
||||
}
|
||||
|
||||
#if __has_include(<imgui.h>)
|
||||
explicit constexpr Vec2(const ImVec2 &v) noexcept: x(v.x), y(v.y) {
|
||||
explicit constexpr Vec(const ImVec2 &v) noexcept: Base(v.x, v.y) {
|
||||
}
|
||||
#endif
|
||||
|
||||
[[nodiscard]]
|
||||
constexpr iterator<> begin() noexcept {
|
||||
return {&x, 0, size()};
|
||||
return {Base::start(), 0, size()};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
constexpr iterator<> end() noexcept {
|
||||
return {&x, size(), size()};
|
||||
return {Base::start(), size(), size()};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
constexpr iterator<const value_type&, const value_type*> begin() const noexcept {
|
||||
return {&x, 0, size()};
|
||||
return {Base::start(), 0, size()};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
constexpr iterator<const value_type&, const value_type*> end() const noexcept {
|
||||
return {&x, size(), size()};
|
||||
return {Base::start(), size(), size()};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
constexpr iterator<value_type&, value_type*, true> rbegin() noexcept {
|
||||
return {&x, size() - 1, size()};
|
||||
return {Base::start(), size() - 1, size()};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
constexpr iterator<value_type&, value_type*, true> rend() noexcept {
|
||||
return {&x, ox::MaxValue<size_type>, size()};
|
||||
return {Base::start(), ox::MaxValue<size_type>, size()};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
constexpr iterator<const value_type&, const value_type*, true> rbegin() const noexcept {
|
||||
return {&x, size() - 1, size()};
|
||||
return {Base::start(), size() - 1, size()};
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
constexpr iterator<const value_type&, const value_type*, true> rend() const noexcept {
|
||||
return {&x, ox::MaxValue<size_type>, size()};
|
||||
return {Base::start(), ox::MaxValue<size_type>, size()};
|
||||
}
|
||||
|
||||
constexpr auto &operator[](std::size_t i) noexcept {
|
||||
return (&x)[i];
|
||||
return Base::start()[i];
|
||||
}
|
||||
|
||||
constexpr const auto &operator[](std::size_t i) const noexcept {
|
||||
return (&x)[i];
|
||||
return Base::start()[i];
|
||||
}
|
||||
|
||||
constexpr auto operator==(const Vec &v) const noexcept {
|
||||
return Base::x == v.x && Base::y == v.y;
|
||||
}
|
||||
|
||||
constexpr auto operator!=(const Vec &v) const noexcept {
|
||||
return Base::x != v.x || Base::y != v.y;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
constexpr std::size_t size() const noexcept {
|
||||
return 2;
|
||||
}
|
||||
|
||||
#if __has_include(<imgui.h>)
|
||||
explicit operator ImVec2() const noexcept {
|
||||
return {x, y};
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
using Vec2 = Vec<Vec2Base<float>>;
|
||||
|
||||
oxModelBegin(Vec2)
|
||||
oxModelField(x)
|
||||
oxModelField(y)
|
||||
|
Loading…
x
Reference in New Issue
Block a user