From 7ea0654af6293418f486663b9c6c4bedc2b263db Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Fri, 23 Jul 2021 21:29:57 -0500 Subject: [PATCH] [ox/std] Add proper forward function --- deps/ox/src/ox/std/memory.hpp | 2 +- deps/ox/src/ox/std/typetraits.hpp | 3 +++ deps/ox/src/ox/std/utility.hpp | 19 +++++++++++++++++++ deps/ox/src/ox/std/vector.hpp | 3 ++- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/deps/ox/src/ox/std/memory.hpp b/deps/ox/src/ox/std/memory.hpp index 8a2158c7..97ed124b 100644 --- a/deps/ox/src/ox/std/memory.hpp +++ b/deps/ox/src/ox/std/memory.hpp @@ -116,7 +116,7 @@ constexpr bool operator!=(std::nullptr_t, const UniquePtr &p2) noexcept { template [[nodiscard]] constexpr auto make_unique(Args&&... args) { - return UniquePtr(new T(static_cast(args)...)); + return UniquePtr(new T(forward(args)...)); } } diff --git a/deps/ox/src/ox/std/typetraits.hpp b/deps/ox/src/ox/std/typetraits.hpp index 70012e7e..74074012 100644 --- a/deps/ox/src/ox/std/typetraits.hpp +++ b/deps/ox/src/ox/std/typetraits.hpp @@ -175,4 +175,7 @@ struct remove_reference { using type = T; }; +template +using remove_reference_t = typename remove_reference::type; + } diff --git a/deps/ox/src/ox/std/utility.hpp b/deps/ox/src/ox/std/utility.hpp index d55fce2a..9d76f5b9 100644 --- a/deps/ox/src/ox/std/utility.hpp +++ b/deps/ox/src/ox/std/utility.hpp @@ -12,9 +12,28 @@ namespace ox { +template +constexpr T &&forward(remove_reference_t &t) noexcept { + return static_cast(t); +} + +template +constexpr T &&forward(remove_reference_t &&t) noexcept { + return static_cast(t); +} + template constexpr typename remove_reference::type &&move(T &&t) noexcept { return static_cast::type&&>(t); } } + +#if !__has_include() +namespace std { +template +constexpr typename ox::remove_reference::type &&move(T &&t) noexcept { + return static_cast::type&&>(t); +} +} +#endif diff --git a/deps/ox/src/ox/std/vector.hpp b/deps/ox/src/ox/std/vector.hpp index 592bfa86..60f475c8 100644 --- a/deps/ox/src/ox/std/vector.hpp +++ b/deps/ox/src/ox/std/vector.hpp @@ -67,6 +67,7 @@ struct SmallVector { *items = bit_cast(new AllocAlias[cap]); } + [[maybe_unused]] constexpr void moveItemsFrom(T**, SmallVector&, const std::size_t, const std::size_t) noexcept { } @@ -488,7 +489,7 @@ void Vector::emplace_back(Args&&... args) { if (m_size == m_cap) { expandCap(m_cap ? m_cap * 2 : 100); } - new (&m_items[m_size]) T{static_cast(args)...}; + new (&m_items[m_size]) T{forward(args)...}; ++m_size; }