[ox/std] Enable small string optimization by default
This commit is contained in:
parent
457b97afba
commit
2c8f4cec2c
2
deps/ox/src/ox/std/string.cpp
vendored
2
deps/ox/src/ox/std/string.cpp
vendored
@ -10,6 +10,6 @@
|
||||
|
||||
namespace ox {
|
||||
|
||||
template class BasicString<0>;
|
||||
template class BasicString<8>;
|
||||
|
||||
}
|
||||
|
16
deps/ox/src/ox/std/string.hpp
vendored
16
deps/ox/src/ox/std/string.hpp
vendored
@ -20,7 +20,7 @@
|
||||
|
||||
namespace ox {
|
||||
|
||||
template<std::size_t SmallStringSize = 8>
|
||||
template<std::size_t SmallStringSize>
|
||||
class BasicString {
|
||||
private:
|
||||
Vector<char, SmallStringSize> m_buff;
|
||||
@ -208,9 +208,11 @@ constexpr BasicString<SmallStringSize>::BasicString() noexcept {
|
||||
}
|
||||
|
||||
template<std::size_t SmallStringSize>
|
||||
constexpr BasicString<SmallStringSize>::BasicString(std::size_t cap) noexcept {
|
||||
m_buff.resize(cap + 1);
|
||||
m_buff[0] = 0;
|
||||
constexpr BasicString<SmallStringSize>::BasicString(std::size_t cap) noexcept: m_buff(cap + 1) {
|
||||
// GCC complains if you don't do this pretty unnecessary size check
|
||||
if (m_buff.size()) {
|
||||
m_buff[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
template<std::size_t SmallStringSize>
|
||||
@ -247,7 +249,7 @@ constexpr BasicString<SmallStringSize>::BasicString(const BasicString &other) no
|
||||
|
||||
template<std::size_t SmallStringSize>
|
||||
constexpr BasicString<SmallStringSize>::BasicString(BasicString &&other) noexcept {
|
||||
m_buff = move(other.m_buff);
|
||||
m_buff = std::move(other.m_buff);
|
||||
}
|
||||
|
||||
template<std::size_t SmallStringSize>
|
||||
@ -499,8 +501,8 @@ constexpr std::size_t BasicString<SmallStringSize>::len() const noexcept {
|
||||
return length;
|
||||
}
|
||||
|
||||
extern template class BasicString<0>;
|
||||
extern template class BasicString<8>;
|
||||
|
||||
using String = BasicString<0>;
|
||||
using String = BasicString<8>;
|
||||
|
||||
}
|
||||
|
23
deps/ox/src/ox/std/vector.hpp
vendored
23
deps/ox/src/ox/std/vector.hpp
vendored
@ -21,7 +21,7 @@ namespace ox {
|
||||
|
||||
namespace detail {
|
||||
|
||||
template<typename T, std::size_t Size = 100>
|
||||
template<typename T, std::size_t Size>
|
||||
struct SmallVector {
|
||||
private:
|
||||
std::allocator<T> m_allocator;
|
||||
@ -45,18 +45,20 @@ struct SmallVector {
|
||||
const auto dstItems = reinterpret_cast<T*>(m_data);
|
||||
const auto srcItems = reinterpret_cast<T*>(src.m_data);
|
||||
for (auto i = 0u; i < count; ++i) {
|
||||
new (&dstItems[i]) T(move(srcItems[i]));
|
||||
new (&dstItems[i]) T(std::move(srcItems[i]));
|
||||
}
|
||||
*items = reinterpret_cast<T*>(m_data);
|
||||
}
|
||||
}
|
||||
|
||||
constexpr void moveItemsFrom(T **items, SmallVector &src, const std::size_t count, const std::size_t cap) noexcept {
|
||||
if (cap <= Size) {
|
||||
// this totally idiotic redundant check (&& count <= Size) is required to address a bug in devkitARM,
|
||||
// try removing it later
|
||||
if (cap <= Size && count <= Size) {
|
||||
const auto dstItems = reinterpret_cast<T*>(m_data);
|
||||
const auto srcItems = reinterpret_cast<T*>(src.m_data);
|
||||
for (auto i = 0u; i < count; ++i) {
|
||||
dstItems[i] = move(srcItems[i]);
|
||||
for (std::size_t i = 0; i < count; ++i) {
|
||||
dstItems[i] = std::move(srcItems[i]);
|
||||
}
|
||||
*items = reinterpret_cast<T*>(m_data);
|
||||
}
|
||||
@ -101,7 +103,7 @@ struct SmallVector<T, 0> {
|
||||
|
||||
}
|
||||
|
||||
template<typename T, std::size_t SmallVectorSize = 0>
|
||||
template<typename T, std::size_t SmallVectorSize = 1>
|
||||
class Vector: detail::SmallVector<T, SmallVectorSize> {
|
||||
|
||||
public:
|
||||
@ -603,12 +605,9 @@ constexpr void Vector<T, SmallVectorSize>::expandCap(std::size_t cap) {
|
||||
m_cap = cap;
|
||||
this->allocate(&m_items, cap);
|
||||
if (oldItems) { // move over old items
|
||||
const auto itRange = cap > m_size ? m_size : cap;
|
||||
for (std::size_t i = 0; i < itRange; i++) {
|
||||
new (&m_items[i]) T(move(oldItems[i]));
|
||||
}
|
||||
for (std::size_t i = itRange; i < m_cap; i++) {
|
||||
new (&m_items[i]) T;
|
||||
const auto itRange = ox::min(cap, m_size);
|
||||
for (std::size_t i = 0; i < itRange; ++i) {
|
||||
new (&m_items[i]) T(std::move(oldItems[i]));
|
||||
}
|
||||
this->deallocate(oldItems, m_cap);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user