Squashed 'deps/nostalgia/' changes from f624c720..17f28d43
17f28d43 [ox/clargs] Replace C string with StringView 043df533 [ox] Cleanup string len handling bec75d2e [ox/std] Fix memory leak in Vector git-subtree-dir: deps/nostalgia git-subtree-split: 17f28d43d12c12389d409fec1c7e322af5335855
This commit is contained in:
2
deps/ox/src/ox/std/CMakeLists.txt
vendored
2
deps/ox/src/ox/std/CMakeLists.txt
vendored
@@ -45,7 +45,7 @@ add_library(
|
||||
if(NOT MSVC)
|
||||
target_compile_options(OxStd PRIVATE -Wsign-conversion)
|
||||
target_compile_options(OxStd PRIVATE -Wconversion)
|
||||
if(${OX_OS_LINUX})
|
||||
if(${OX_OS_LINUX} AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
target_compile_options(OxStd PUBLIC -export-dynamic)
|
||||
#target_link_options(OxStd PUBLIC -W1,-E)
|
||||
elseif(${OX_OS_FREEBSD})
|
||||
|
56
deps/ox/src/ox/std/istring.hpp
vendored
56
deps/ox/src/ox/std/istring.hpp
vendored
@@ -85,7 +85,9 @@ class IString {
|
||||
* Returns the capacity of bytes for this string.
|
||||
*/
|
||||
[[nodiscard]]
|
||||
constexpr std::size_t cap() const noexcept;
|
||||
constexpr static std::size_t cap() noexcept {
|
||||
return StrCap;
|
||||
}
|
||||
};
|
||||
|
||||
template<std::size_t size>
|
||||
@@ -113,7 +115,7 @@ constexpr IString<size> &IString<size>::operator=(Integer_c auto i) noexcept {
|
||||
|
||||
template<std::size_t size>
|
||||
constexpr IString<size> &IString<size>::operator=(ox::CRStringView str) noexcept {
|
||||
std::size_t strLen = str.bytes() + 1;
|
||||
std::size_t strLen = str.len();
|
||||
if (cap() < strLen) {
|
||||
strLen = cap();
|
||||
}
|
||||
@@ -126,14 +128,7 @@ constexpr IString<size> &IString<size>::operator=(ox::CRStringView str) noexcept
|
||||
|
||||
template<std::size_t size>
|
||||
constexpr IString<size> &IString<size>::operator=(const char *str) noexcept {
|
||||
std::size_t strLen = ox::strlen(str) + 1;
|
||||
if (cap() < strLen) {
|
||||
strLen = cap();
|
||||
}
|
||||
m_size = strLen;
|
||||
ox::listcpy(m_buff.data(), str, strLen);
|
||||
// make sure last element is a null terminator
|
||||
m_buff[cap()] = 0;
|
||||
operator=(ox::StringView{str});
|
||||
return *this;
|
||||
}
|
||||
|
||||
@@ -170,30 +165,21 @@ constexpr char &IString<StrCap>::operator[](std::size_t i) noexcept {
|
||||
template<std::size_t StrCap>
|
||||
constexpr Error IString<StrCap>::append(const char *str, std::size_t strLen) noexcept {
|
||||
Error err{};
|
||||
auto currentLen = len();
|
||||
if (cap() < currentLen + strLen + 1) {
|
||||
auto const currentLen = len();
|
||||
if (cap() < currentLen + strLen) {
|
||||
strLen = cap() - currentLen;
|
||||
err = OxError(1, "Insufficient space for full string");
|
||||
}
|
||||
ox::strncpy(m_buff.data() + currentLen, str, strLen);
|
||||
// make sure last element is a null terminator
|
||||
m_buff[currentLen + strLen] = 0;
|
||||
m_size += strLen;
|
||||
return err;
|
||||
}
|
||||
|
||||
template<std::size_t StrCap>
|
||||
constexpr Error IString<StrCap>::append(ox::StringView str) noexcept {
|
||||
auto strLen = str.len();
|
||||
Error err{};
|
||||
auto currentLen = len();
|
||||
if (cap() < currentLen + strLen + 1) {
|
||||
strLen = cap() - currentLen;
|
||||
err = OxError(1, "Insufficient space for full string");
|
||||
}
|
||||
ox::strncpy(m_buff.data() + currentLen, str, strLen);
|
||||
// make sure last element is a null terminator
|
||||
m_buff[currentLen + strLen] = 0;
|
||||
return err;
|
||||
return append(str.data(), str.len());
|
||||
}
|
||||
|
||||
template<std::size_t StrCap>
|
||||
@@ -214,27 +200,12 @@ constexpr const char *IString<StrCap>::c_str() const noexcept {
|
||||
|
||||
template<std::size_t StrCap>
|
||||
constexpr std::size_t IString<StrCap>::len() const noexcept {
|
||||
std::size_t length = 0;
|
||||
for (std::size_t i = 0; i < StrCap; i++) {
|
||||
auto const b = static_cast<uint8_t>(m_buff[i]);
|
||||
if (b) {
|
||||
const auto asciiChar = (b & 128) == 0;
|
||||
const auto utf8Char = (b & (256 << 6)) == (256 << 6);
|
||||
if (asciiChar || utf8Char) {
|
||||
length++;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return length;
|
||||
return m_size;
|
||||
}
|
||||
|
||||
template<std::size_t StrCap>
|
||||
constexpr std::size_t IString<StrCap>::bytes() const noexcept {
|
||||
std::size_t i = 0;
|
||||
for (i = 0; i < StrCap && m_buff[i]; i++);
|
||||
return i + 1; // add one for null terminator
|
||||
return m_size + 1;
|
||||
}
|
||||
|
||||
template<std::size_t StrCap>
|
||||
@@ -249,11 +220,6 @@ constexpr ox::Error IString<StrCap>::resize(size_t sz) noexcept {
|
||||
return {};
|
||||
}
|
||||
|
||||
template<std::size_t StrCap>
|
||||
constexpr std::size_t IString<StrCap>::cap() const noexcept {
|
||||
return StrCap;
|
||||
}
|
||||
|
||||
template<size_t sz>
|
||||
struct MaybeView<ox::IString<sz>> {
|
||||
using type = ox::StringView;
|
||||
|
2
deps/ox/src/ox/std/memops.hpp
vendored
2
deps/ox/src/ox/std/memops.hpp
vendored
@@ -33,7 +33,7 @@ template<typename T1, typename T2>
|
||||
constexpr T1 *listcpy(T1 *dest, T2 *src, std::size_t maxLen) noexcept {
|
||||
using T1Type = typename ox::remove_reference<decltype(dest[0])>::type;
|
||||
std::size_t i = 0;
|
||||
while (i < maxLen && src[i]) {
|
||||
while (i < maxLen) {
|
||||
dest[i] = static_cast<T1Type>(src[i]);
|
||||
++i;
|
||||
}
|
||||
|
20
deps/ox/src/ox/std/string.hpp
vendored
20
deps/ox/src/ox/std/string.hpp
vendored
@@ -515,7 +515,7 @@ constexpr char &BasicString<SmallStringSize_v>::operator[](std::size_t i) noexce
|
||||
|
||||
template<std::size_t SmallStringSize_v>
|
||||
constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::substr(std::size_t pos) const noexcept {
|
||||
return BasicString(m_buff.data() + pos, m_buff.size() - pos);
|
||||
return BasicString(m_buff.data() + pos, m_buff.size() - pos - 1);
|
||||
}
|
||||
|
||||
template<std::size_t SmallStringSize_v>
|
||||
@@ -531,26 +531,12 @@ constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::substr(
|
||||
|
||||
template<std::size_t SmallStringSize_v>
|
||||
constexpr std::size_t BasicString<SmallStringSize_v>::bytes() const noexcept {
|
||||
std::size_t i;
|
||||
for (i = 0; i < m_buff.size() && m_buff[i]; ++i);
|
||||
return i + 1; // add one for null terminator
|
||||
return m_buff.size();
|
||||
}
|
||||
|
||||
template<std::size_t SmallStringSize_v>
|
||||
constexpr std::size_t BasicString<SmallStringSize_v>::len() const noexcept {
|
||||
std::size_t length = 0;
|
||||
for (const auto c : m_buff) {
|
||||
const auto b = static_cast<uint8_t>(c);
|
||||
if (b) {
|
||||
// normal ASCII character or start of UTF-8 character
|
||||
if ((b & 128) == 0 || (b & (256 << 6)) == (256 << 6)) {
|
||||
++length;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return length;
|
||||
return m_buff.size() - 1;
|
||||
}
|
||||
|
||||
template<std::size_t SmallStringSize_v>
|
||||
|
1
deps/ox/src/ox/std/test/tests.cpp
vendored
1
deps/ox/src/ox/std/test/tests.cpp
vendored
@@ -109,6 +109,7 @@ static std::map<ox::StringView, ox::Error(*)()> tests = {
|
||||
oxAssert(ox::StringView("Write") != ox::String(""), "String / StringView comparison broken");
|
||||
oxAssert(ox::String("Write") != ox::StringView(""), "String / StringView comparison broken");
|
||||
oxAssert(ox::String("Write") == ox::StringView("Write"), "String / StringView comparison broken");
|
||||
oxExpect(ox::String("asdf").substr(1, 3), "sd");
|
||||
oxAssert(
|
||||
ox::String(ox::StringView("Write")) == ox::StringView("Write"),
|
||||
"String / StringView comparison broken");
|
||||
|
5
deps/ox/src/ox/std/uuid.hpp
vendored
5
deps/ox/src/ox/std/uuid.hpp
vendored
@@ -176,9 +176,10 @@ class UUID {
|
||||
[[nodiscard]]
|
||||
constexpr UUIDStr toString() const noexcept {
|
||||
UUIDStr out;
|
||||
ox::CharBuffWriter bw(out.data(), out.cap());
|
||||
std::ignore = out.resize(UUIDStr::cap());
|
||||
ox::CharBuffWriter bw(out.data(), UUIDStr::cap());
|
||||
std::ignore = toString(bw);
|
||||
out[out.cap()] = 0;
|
||||
out[UUIDStr::cap()] = 0;
|
||||
return out;
|
||||
}
|
||||
};
|
||||
|
2
deps/ox/src/ox/std/vector.hpp
vendored
2
deps/ox/src/ox/std/vector.hpp
vendored
@@ -85,6 +85,8 @@ struct VectorAllocator {
|
||||
constexpr void deallocate(T *items, std::size_t cap) noexcept {
|
||||
// small vector optimization cannot be done it constexpr, but it doesn't really matter in constexpr
|
||||
if (std::is_constant_evaluated()) {
|
||||
Allocator{}.deallocate(items, cap);
|
||||
} else {
|
||||
if (items && static_cast<void*>(items) != static_cast<void*>(m_data.data())) {
|
||||
Allocator{}.deallocate(items, cap);
|
||||
}
|
||||
|
Reference in New Issue
Block a user