From d3ea370d34325741f0d764306f436031987ce01e Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Sat, 25 May 2024 21:29:54 -0500 Subject: [PATCH] [ox/std] Add conversion functions for geo types, cleanup --- .../deps/ox/src/ox/std/CMakeLists.txt | 1 + deps/nostalgia/deps/ox/src/ox/std/bit.hpp | 2 +- deps/nostalgia/deps/ox/src/ox/std/conv.hpp | 45 ++++++++++++ deps/nostalgia/deps/ox/src/ox/std/point.hpp | 1 + deps/nostalgia/deps/ox/src/ox/std/size.hpp | 1 + deps/nostalgia/deps/ox/src/ox/std/std.hpp | 1 + .../deps/ox/src/ox/std/typetraits.hpp | 2 + deps/nostalgia/deps/ox/src/ox/std/vec.hpp | 71 +++++++++++++++---- 8 files changed, 108 insertions(+), 16 deletions(-) create mode 100644 deps/nostalgia/deps/ox/src/ox/std/conv.hpp diff --git a/deps/nostalgia/deps/ox/src/ox/std/CMakeLists.txt b/deps/nostalgia/deps/ox/src/ox/std/CMakeLists.txt index 0aface6..32cdf7c 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/CMakeLists.txt +++ b/deps/nostalgia/deps/ox/src/ox/std/CMakeLists.txt @@ -96,6 +96,7 @@ install( buildinfo.hpp byteswap.hpp concepts.hpp + conv.hpp def.hpp defer.hpp defines.hpp diff --git a/deps/nostalgia/deps/ox/src/ox/std/bit.hpp b/deps/nostalgia/deps/ox/src/ox/std/bit.hpp index 6573ab0..250d087 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/bit.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/bit.hpp @@ -32,7 +32,7 @@ constexpr To bit_cast(const From &src) noexcept requires(sizeof(To) == sizeof(Fr namespace ox { template -constexpr typename enable_if::type cbit_cast(From src) noexcept { +constexpr To cbit_cast(From src) noexcept requires(sizeof(To) == sizeof(From)) { To dst = {}; ox::memcpy(&dst, &src, sizeof(src)); return dst; diff --git a/deps/nostalgia/deps/ox/src/ox/std/conv.hpp b/deps/nostalgia/deps/ox/src/ox/std/conv.hpp new file mode 100644 index 0000000..4329f86 --- /dev/null +++ b/deps/nostalgia/deps/ox/src/ox/std/conv.hpp @@ -0,0 +1,45 @@ +/* + * Copyright 2015 - 2024 gary@drinkingtea.net + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include "point.hpp" +#include "size.hpp" +#include "vec.hpp" + +namespace ox { + +constexpr Vec2::operator Point() const noexcept { + return { + static_cast(x), + static_cast(y), + }; +} + +constexpr Vec2::operator Size() const noexcept { + return { + static_cast(x), + static_cast(y), + }; +} + +constexpr Point::operator Vec2() const noexcept { + return { + static_cast(x), + static_cast(y), + }; +} + +constexpr Size::operator Vec2() const noexcept { + return { + static_cast(width), + static_cast(height), + }; +} + +} \ No newline at end of file diff --git a/deps/nostalgia/deps/ox/src/ox/std/point.hpp b/deps/nostalgia/deps/ox/src/ox/std/point.hpp index e902f5e..94062e1 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/point.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/point.hpp @@ -64,6 +64,7 @@ class Point { constexpr bool operator!=(const Point&) const noexcept; + explicit constexpr operator class Vec2() const noexcept; }; constexpr Point::Point(int x, int y) noexcept { diff --git a/deps/nostalgia/deps/ox/src/ox/std/size.hpp b/deps/nostalgia/deps/ox/src/ox/std/size.hpp index 368fe45..6684008 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/size.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/size.hpp @@ -64,6 +64,7 @@ class Size { constexpr bool operator!=(const Size&) const noexcept; + explicit constexpr operator class Vec2() const noexcept; }; constexpr Size::Size(int width, int height) noexcept { diff --git a/deps/nostalgia/deps/ox/src/ox/std/std.hpp b/deps/nostalgia/deps/ox/src/ox/std/std.hpp index 6b95d6d..a88416d 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/std.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/std.hpp @@ -16,6 +16,7 @@ #include "istring.hpp" #include "byteswap.hpp" #include "concepts.hpp" +#include "conv.hpp" #include "cstringview.hpp" #include "cstrops.hpp" #include "def.hpp" diff --git a/deps/nostalgia/deps/ox/src/ox/std/typetraits.hpp b/deps/nostalgia/deps/ox/src/ox/std/typetraits.hpp index 3bfee6a..9207bab 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/typetraits.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/typetraits.hpp @@ -185,6 +185,8 @@ struct enable_if { using type = T; }; +template +using enable_if_t = typename enable_if::type; template struct is_pointer { diff --git a/deps/nostalgia/deps/ox/src/ox/std/vec.hpp b/deps/nostalgia/deps/ox/src/ox/std/vec.hpp index 1d22c69..22a78ad 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/vec.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/vec.hpp @@ -23,17 +23,16 @@ namespace ox { -template -struct Vec { +class Vec2 { public: - using value_type = T; + using value_type = float; using size_type = std::size_t; static constexpr auto TypeName = "net.drinkingtea.ox.Point"; static constexpr auto TypeVersion = 1; - T x = 0; - T y = 0; + float x = 0; + float y = 0; template struct iterator: public ox::Iterator { @@ -141,14 +140,14 @@ struct Vec { }; - constexpr Vec() noexcept = default; + constexpr Vec2() noexcept = default; template - constexpr Vec(T pX, T pY) noexcept: x(pX), y(pY) { + constexpr Vec2(float pX, float pY) noexcept: x(pX), y(pY) { } #if __has_include() - explicit constexpr Vec(const ImVec2 &v) noexcept: Vec(v.x, v.y) { + explicit constexpr Vec2(const ImVec2 &v) noexcept: Vec2(v.x, v.y) { } explicit inline operator ImVec2() const noexcept { @@ -228,7 +227,7 @@ struct Vec { } } - constexpr auto operator==(const Vec &v) const noexcept { + constexpr auto operator==(const Vec2 &v) const noexcept { for (auto i = 0u; i < v.size(); ++i) { if ((*this)[i] != v[i]) { return false; @@ -237,29 +236,71 @@ struct Vec { return true; } - constexpr auto operator!=(const Vec &v) const noexcept { + constexpr auto operator!=(const Vec2 &v) const noexcept { return !operator==(v); } + explicit constexpr operator class Point() const noexcept; + + explicit constexpr operator class Size() const noexcept; + [[nodiscard]] constexpr std::size_t size() const noexcept { return 2; } + constexpr Vec2 operator+(float i) const noexcept { + return {x + i, y + i}; + } + + constexpr Vec2 operator+=(float i) noexcept { + x += i; + y += i; + return *this; + } + + constexpr Vec2 operator-(float i) const noexcept { + return {x - i, y - i}; + } + + constexpr Vec2 operator-=(float i) noexcept { + x -= i; + y -= i; + return *this; + } + + constexpr Vec2 operator*(float i) const noexcept { + return {x * i, y * i}; + } + + constexpr Vec2 operator*=(float i) noexcept { + x *= i; + y *= i; + return *this; + } + + constexpr Vec2 operator/(float i) const noexcept { + return {x / i, y / i}; + } + + constexpr Vec2 operator/=(float i) noexcept { + x /= i; + y /= i; + return *this; + } + protected: [[nodiscard]] - constexpr T *start() noexcept { - return &x; + constexpr float *start() noexcept { + return&x; } [[nodiscard]] - constexpr const T *start() const noexcept { + constexpr const float *start() const noexcept { return &x; } }; -using Vec2 = Vec; - template constexpr Error model(T *io, ox::CommonPtrWith auto *obj) noexcept { oxReturnError(io->template setTypeInfo());