[nostalgia/geo] Add comparison operators to Vec

This commit is contained in:
Gary Talent 2022-02-14 01:37:00 -06:00
parent 0e041a666a
commit 60e259ca34

View File

@ -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)