Squashed 'deps/nostalgia/' changes from a3d6a58c..d68e6493
d68e6493 [nostalgia/core/studio/tilesheeteditor] Add support for dragging palette to palette selector 1cbc5762 [studio] Complete drag/drop support for files 500b9356 [studio] Make new dir window OK on Enter key 800ca851 [ox/std] Fix possible error that occurs with appending on boundary of small string size cc466a9f [studio] Add support for adding and deleting directories 9d115584 [nostalgia] Rename player from 'nostalgia' to 'Nostalgia' a2139c09 [studio] Cleanup unused member a3e5f27a [ox/std] Fix Mac build 643f95ec [studio] Add confirmation dialog for file deletion, move deletion to Project 69241476 [studio] Add ability to add file through dir context menu 6e2b4fa7 [nostalgia] Cleanup player run in Makefile 4e5c7499 [studio] Add support for deleting files 66229de7 [ox/fs] FileSystem fixes with removing files 7eb37c53 [nostalgia/core/studio/paletteeditor] Fix adding page if there is no existing page 7a21b207 [nostalgia/core] Replace ContextDeleter with safeDelete(Context*) 894be237 [ox/std] Drop ox:: qualifier from safeDelete function for pointee 92e9d9cb [keel,studio] Add support for New Item templates b29b9a9b [ox/std] Add UAnyPtr 721f8442 [nostalgia/core/studio/tilesheeteditor] Fix subsheet and palette scrolling git-subtree-dir: deps/nostalgia git-subtree-split: d68e64931b37d7d8bbaff7b43bf131c7acf2aa97
This commit is contained in:
91
deps/ox/src/ox/std/anyptr.hpp
vendored
91
deps/ox/src/ox/std/anyptr.hpp
vendored
@@ -15,18 +15,22 @@
|
||||
|
||||
namespace ox {
|
||||
|
||||
class AnyPtr {
|
||||
namespace detail {
|
||||
|
||||
template<bool unique>
|
||||
class AnyPtrT {
|
||||
private:
|
||||
struct WrapBase {
|
||||
virtual constexpr ~WrapBase() = default;
|
||||
virtual constexpr WrapBase *copyTo(ox::Span<char> s) noexcept = 0;
|
||||
virtual constexpr operator bool() const noexcept = 0;
|
||||
virtual void free() noexcept = 0;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct Wrap: public WrapBase {
|
||||
struct Wrap final: WrapBase {
|
||||
T *data{};
|
||||
constexpr Wrap(T *pData) noexcept: data(pData) {
|
||||
explicit constexpr Wrap(T *pData) noexcept: data(pData) {
|
||||
}
|
||||
constexpr WrapBase *copyTo(ox::Span<char> s) noexcept override {
|
||||
oxAssert(s.size() >= sizeof(Wrap), "too small buffer");
|
||||
@@ -39,39 +43,60 @@ class AnyPtr {
|
||||
constexpr operator bool() const noexcept override {
|
||||
return data != nullptr;
|
||||
}
|
||||
constexpr void free() noexcept override {
|
||||
safeDelete(data);
|
||||
data = {};
|
||||
}
|
||||
};
|
||||
|
||||
WrapBase *m_wrapPtr{};
|
||||
ox::Array<char, sizeof(Wrap<void*>)> m_wrapData;
|
||||
|
||||
public:
|
||||
constexpr AnyPtr() noexcept = default;
|
||||
constexpr AnyPtrT() noexcept = default;
|
||||
|
||||
template<typename T>
|
||||
constexpr AnyPtr(T *ptr) noexcept {
|
||||
constexpr AnyPtrT(T *ptr) noexcept {
|
||||
if (std::is_constant_evaluated()) {
|
||||
m_wrapPtr = new Wrap(ptr);
|
||||
m_wrapPtr = new Wrap<T>(ptr);
|
||||
} else {
|
||||
m_wrapPtr = new(m_wrapData.data()) Wrap(ptr);
|
||||
m_wrapPtr = new(m_wrapData.data()) Wrap<T>(ptr);
|
||||
}
|
||||
}
|
||||
|
||||
constexpr AnyPtr(AnyPtr const&other) noexcept {
|
||||
constexpr AnyPtrT(AnyPtrT const&other) noexcept {
|
||||
if (other) {
|
||||
m_wrapPtr = other.m_wrapPtr->copyTo(m_wrapData);
|
||||
}
|
||||
}
|
||||
|
||||
constexpr ~AnyPtr() noexcept {
|
||||
constexpr AnyPtrT(AnyPtrT &&other) noexcept {
|
||||
if (other) {
|
||||
m_wrapPtr = other.m_wrapPtr->copyTo(m_wrapData);
|
||||
if (std::is_constant_evaluated()) {
|
||||
ox::safeDelete(m_wrapPtr);
|
||||
}
|
||||
other.m_wrapPtr = {};
|
||||
}
|
||||
}
|
||||
|
||||
constexpr ~AnyPtrT() noexcept {
|
||||
if constexpr(unique) {
|
||||
free();
|
||||
}
|
||||
if (std::is_constant_evaluated()) {
|
||||
ox::safeDelete(m_wrapPtr);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
constexpr AnyPtr &operator=(T *ptr) noexcept {
|
||||
if (std::is_constant_evaluated()) {
|
||||
constexpr AnyPtrT &operator=(T *ptr) noexcept {
|
||||
if constexpr(unique) {
|
||||
free();
|
||||
} else if (std::is_constant_evaluated()) {
|
||||
ox::safeDelete(m_wrapPtr);
|
||||
}
|
||||
if (std::is_constant_evaluated()) {
|
||||
m_wrapPtr = new Wrap(ptr);
|
||||
} else {
|
||||
m_wrapPtr = new(m_wrapData.data()) Wrap(ptr);
|
||||
@@ -79,10 +104,14 @@ class AnyPtr {
|
||||
return *this;
|
||||
}
|
||||
|
||||
constexpr AnyPtr &operator=(AnyPtr const&ptr) noexcept {
|
||||
constexpr AnyPtrT &operator=(AnyPtrT const&ptr) noexcept {
|
||||
if (this != &ptr) {
|
||||
if (ptr) {
|
||||
if constexpr(unique) {
|
||||
free();
|
||||
} else if (std::is_constant_evaluated()) {
|
||||
ox::safeDelete(m_wrapPtr);
|
||||
}
|
||||
if (ptr) {
|
||||
m_wrapPtr = ptr.m_wrapPtr->copyTo(m_wrapData);
|
||||
} else {
|
||||
m_wrapPtr = nullptr;
|
||||
@@ -91,10 +120,40 @@ class AnyPtr {
|
||||
return *this;
|
||||
}
|
||||
|
||||
constexpr AnyPtrT &operator=(AnyPtrT &&ptr) noexcept {
|
||||
if (this != &ptr) {
|
||||
if constexpr(unique) {
|
||||
free();
|
||||
} else if (std::is_constant_evaluated()) {
|
||||
ox::safeDelete(m_wrapPtr);
|
||||
}
|
||||
if (ptr) {
|
||||
m_wrapPtr = ptr.m_wrapPtr->copyTo(m_wrapData);
|
||||
if (std::is_constant_evaluated()) {
|
||||
ox::safeDelete(ptr.m_wrapPtr);
|
||||
ptr.m_wrapPtr = nullptr;
|
||||
}
|
||||
} else {
|
||||
m_wrapPtr = nullptr;
|
||||
}
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
constexpr operator bool() const noexcept {
|
||||
return m_wrapPtr && *m_wrapPtr;
|
||||
}
|
||||
|
||||
constexpr void free() noexcept {
|
||||
if (m_wrapPtr) {
|
||||
m_wrapPtr->free();
|
||||
}
|
||||
if (std::is_constant_evaluated()) {
|
||||
ox::safeDelete(m_wrapPtr);
|
||||
}
|
||||
m_wrapPtr = nullptr;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
[[nodiscard]]
|
||||
constexpr T *get() const noexcept {
|
||||
@@ -104,6 +163,12 @@ class AnyPtr {
|
||||
return dynamic_cast<Wrap<T>*>(m_wrapPtr)->data;
|
||||
#endif
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
using AnyPtr = detail::AnyPtrT<false>;
|
||||
using UAnyPtr = detail::AnyPtrT<true>;
|
||||
|
||||
}
|
8
deps/ox/src/ox/std/string.hpp
vendored
8
deps/ox/src/ox/std/string.hpp
vendored
@@ -423,9 +423,10 @@ constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operato
|
||||
const std::size_t strLen = src.len();
|
||||
const auto currentLen = len();
|
||||
BasicString<SmallStringSize_v> cpy(currentLen + strLen);
|
||||
cpy.m_buff.resize(m_buff.size() + strLen);
|
||||
cpy.m_buff.resize(m_buff.size() + strLen + 1);
|
||||
ox::listcpy(&cpy.m_buff[0], m_buff.data(), currentLen);
|
||||
ox::listcpy(&cpy.m_buff[currentLen], src.data(), strLen + 1);
|
||||
ox::listcpy(&cpy.m_buff[currentLen], src.data(), strLen);
|
||||
cpy.m_buff[cpy.m_buff.size() - 1] = 0;
|
||||
return cpy;
|
||||
}
|
||||
|
||||
@@ -436,7 +437,8 @@ constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operato
|
||||
BasicString<SmallStringSize_v> cpy(currentLen + strLen);
|
||||
cpy.m_buff.resize(m_buff.size() + strLen);
|
||||
ox::listcpy(&cpy.m_buff[0], m_buff.data(), currentLen);
|
||||
ox::listcpy(&cpy.m_buff[currentLen], src.data(), strLen + 1);
|
||||
ox::listcpy(&cpy.m_buff[currentLen], src.data(), strLen);
|
||||
cpy.m_buff[cpy.m_buff.size() - 1] = 0;
|
||||
return cpy;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user