Squashed 'deps/nostalgia/' changes from c7bc2a95..e27eee50
e27eee50 [teagba] Add set and scroll background offset functions fd610454 [nostalgia/gfx] Fix compiler warning e61d4647 [nostalgia/gfx] Fix BG tilesheet loading, add background offset functions c275c5f5 [hull] Disable building hull for now fbf49ba5 [ox/std] Add pre- and post-increment operators to Span 92f74b27 [ox/std] Add null check for deallocating in consteval context Vector 934f0c92 [ox/std] Add beginsWith and endsWith variants that that cingle chars ee9a3e11 [ox/std] Cleanup 16886cdf [hull] Add start on command interpreter 08b9508d [ox/std] Give std::ignore a named type 69bd968f [nostalgia/player] Fix build 4e7dc666 [nostalgia,olympic] Rename string len() functions to size() bea0cf5a [ox/std] Rename string len() functions to size() git-subtree-dir: deps/nostalgia git-subtree-split: e27eee50f05bb437710313430e0d9cef636a66b1
This commit is contained in:
4
deps/ox/src/ox/clargs/clargs.cpp
vendored
4
deps/ox/src/ox/clargs/clargs.cpp
vendored
@@ -17,14 +17,14 @@ ClArgs::ClArgs(ox::SpanView<const char*> args) noexcept {
|
|||||||
for (auto i = 0u; i < args.size(); ++i) {
|
for (auto i = 0u; i < args.size(); ++i) {
|
||||||
auto arg = StringView{args[i]};
|
auto arg = StringView{args[i]};
|
||||||
if (arg[0] == '-') {
|
if (arg[0] == '-') {
|
||||||
while (arg[0] == '-' && arg.len()) {
|
while (arg[0] == '-' && arg.size()) {
|
||||||
arg = substr(arg, 1);
|
arg = substr(arg, 1);
|
||||||
}
|
}
|
||||||
m_bools[arg] = true;
|
m_bools[arg] = true;
|
||||||
// parse additional arguments
|
// parse additional arguments
|
||||||
if (i < args.size() && args[i + 1]) {
|
if (i < args.size() && args[i + 1]) {
|
||||||
auto const val = StringView{args[i + 1]};
|
auto const val = StringView{args[i + 1]};
|
||||||
if (val.len() && val[0] != '-') {
|
if (val.size() && val[0] != '-') {
|
||||||
if (val == "false") {
|
if (val == "false") {
|
||||||
m_bools[arg] = false;
|
m_bools[arg] = false;
|
||||||
}
|
}
|
||||||
|
|||||||
6
deps/ox/src/ox/claw/test/tests.cpp
vendored
6
deps/ox/src/ox/claw/test/tests.cpp
vendored
@@ -109,7 +109,7 @@ static std::map<ox::StringView, ox::Error(*)()> tests = {
|
|||||||
"ClawHeaderReader",
|
"ClawHeaderReader",
|
||||||
[] {
|
[] {
|
||||||
constexpr auto hdr = ox::StringLiteral("O1;com.drinkingtea.ox.claw.test.Header;2;");
|
constexpr auto hdr = ox::StringLiteral("O1;com.drinkingtea.ox.claw.test.Header;2;");
|
||||||
auto [ch, err] = ox::readClawHeader({hdr.c_str(), hdr.len() + 1});
|
auto [ch, err] = ox::readClawHeader({hdr.c_str(), hdr.size() + 1});
|
||||||
oxAssert(err, "Error parsing header");
|
oxAssert(err, "Error parsing header");
|
||||||
oxAssert(ch.fmt == ox::ClawFormat::Organic, "Format wrong");
|
oxAssert(ch.fmt == ox::ClawFormat::Organic, "Format wrong");
|
||||||
oxAssert(ch.typeName == "com.drinkingtea.ox.claw.test.Header", "Type name wrong");
|
oxAssert(ch.typeName == "com.drinkingtea.ox.claw.test.Header", "Type name wrong");
|
||||||
@@ -121,7 +121,7 @@ static std::map<ox::StringView, ox::Error(*)()> tests = {
|
|||||||
"ClawHeaderReader2",
|
"ClawHeaderReader2",
|
||||||
[] {
|
[] {
|
||||||
constexpr auto hdr = ox::StringLiteral("M2;com.drinkingtea.ox.claw.test.Header2;3;");
|
constexpr auto hdr = ox::StringLiteral("M2;com.drinkingtea.ox.claw.test.Header2;3;");
|
||||||
auto [ch, err] = ox::readClawHeader({hdr.c_str(), hdr.len() + 1});
|
auto [ch, err] = ox::readClawHeader({hdr.c_str(), hdr.size() + 1});
|
||||||
oxAssert(err, "Error parsing header");
|
oxAssert(err, "Error parsing header");
|
||||||
oxAssert(ch.fmt == ox::ClawFormat::Metal, "Format wrong");
|
oxAssert(ch.fmt == ox::ClawFormat::Metal, "Format wrong");
|
||||||
oxAssert(ch.typeName == "com.drinkingtea.ox.claw.test.Header2", "Type name wrong");
|
oxAssert(ch.typeName == "com.drinkingtea.ox.claw.test.Header2", "Type name wrong");
|
||||||
@@ -134,7 +134,7 @@ static std::map<ox::StringView, ox::Error(*)()> tests = {
|
|||||||
[] {
|
[] {
|
||||||
constexpr auto hdr = ox::StringLiteral("M2;com.drinkingtea.ox.claw.test.Header2;3;awefawf");
|
constexpr auto hdr = ox::StringLiteral("M2;com.drinkingtea.ox.claw.test.Header2;3;awefawf");
|
||||||
constexpr auto expected = ox::StringLiteral("com.drinkingtea.ox.claw.test.Header2;3");
|
constexpr auto expected = ox::StringLiteral("com.drinkingtea.ox.claw.test.Header2;3");
|
||||||
OX_REQUIRE(actual, ox::readClawTypeId({hdr.data(), hdr.len() + 1}));
|
OX_REQUIRE(actual, ox::readClawTypeId({hdr.data(), hdr.size() + 1}));
|
||||||
oxExpect(actual, expected);
|
oxExpect(actual, expected);
|
||||||
return ox::Error{};
|
return ox::Error{};
|
||||||
}
|
}
|
||||||
|
|||||||
4
deps/ox/src/ox/fs/filesystem/directory.hpp
vendored
4
deps/ox/src/ox/fs/filesystem/directory.hpp
vendored
@@ -52,7 +52,7 @@ struct OX_PACKED DirectoryEntry {
|
|||||||
if (d.valid()) {
|
if (d.valid()) {
|
||||||
d->inode = inode;
|
d->inode = inode;
|
||||||
auto const maxStrSz = bufferSize - 1 - sizeof(*this);
|
auto const maxStrSz = bufferSize - 1 - sizeof(*this);
|
||||||
ox::strncpy(d->name, name.data(), ox::min(maxStrSz, name.len()));
|
ox::strncpy(d->name, name.data(), ox::min(maxStrSz, name.size()));
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
return ox::Error(1);
|
return ox::Error(1);
|
||||||
@@ -219,7 +219,7 @@ Error Directory<FileStore, InodeId_t>::write(PathIterator path, uint64_t inode64
|
|||||||
oxTrace("ox.fs.Directory.write.fail", "Could not read existing version of Directory");
|
oxTrace("ox.fs.Directory.write.fail", "Could not read existing version of Directory");
|
||||||
return ox::Error(1, "Could not read existing version of Directory");
|
return ox::Error(1, "Could not read existing version of Directory");
|
||||||
}
|
}
|
||||||
const auto pathSize = name.len() + 1;
|
const auto pathSize = name.size() + 1;
|
||||||
const auto entryDataSize = DirectoryEntry<InodeId_t>::DirectoryEntryData::spaceNeeded(pathSize);
|
const auto entryDataSize = DirectoryEntry<InodeId_t>::DirectoryEntryData::spaceNeeded(pathSize);
|
||||||
const auto newSize = oldStat.size + Buffer::spaceNeeded(entryDataSize);
|
const auto newSize = oldStat.size + Buffer::spaceNeeded(entryDataSize);
|
||||||
auto cpy = ox_malloca(newSize, Buffer, *old, oldStat.size);
|
auto cpy = ox_malloca(newSize, Buffer, *old, oldStat.size);
|
||||||
|
|||||||
@@ -206,7 +206,7 @@ Error PassThroughFS::writeFileInode(uint64_t, const void*, uint64_t, FileType) n
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string_view PassThroughFS::stripSlash(StringView path) noexcept {
|
std::string_view PassThroughFS::stripSlash(StringView path) noexcept {
|
||||||
for (auto i = 0u; i < path.len() && path[0] == '/'; i++) {
|
for (auto i = 0u; i < path.size() && path[0] == '/'; i++) {
|
||||||
path = substr(path, 1);
|
path = substr(path, 1);
|
||||||
}
|
}
|
||||||
return {path.data(), path.bytes()};
|
return {path.data(), path.bytes()};
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ Error PathIterator::get(StringView &fileName) {
|
|||||||
if (size && fileName[size - 1] == '/') {
|
if (size && fileName[size - 1] == '/') {
|
||||||
fileName = ox::substr(m_path, start, start + size - 1);
|
fileName = ox::substr(m_path, start, start + size - 1);
|
||||||
}
|
}
|
||||||
oxAssert(fileName[fileName.len()-1] != '/', "name ends in /");
|
oxAssert(fileName[fileName.size()-1] != '/', "name ends in /");
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,11 +104,11 @@ Error PathIterator::next(StringView &fileName) {
|
|||||||
}
|
}
|
||||||
fileName = ox::substr(m_path, start, start + size);
|
fileName = ox::substr(m_path, start, start + size);
|
||||||
// truncate trailing /
|
// truncate trailing /
|
||||||
while (fileName.len() && fileName[fileName.len() - 1] == '/') {
|
while (fileName.size() && fileName[fileName.size() - 1] == '/') {
|
||||||
fileName = ox::substr(m_path, start, start + size);
|
fileName = ox::substr(m_path, start, start + size);
|
||||||
}
|
}
|
||||||
m_iterator += size;
|
m_iterator += size;
|
||||||
oxAssert(fileName.len() == 0 || fileName[fileName.len()-1] != '/', "name ends in /");
|
oxAssert(fileName.size() == 0 || fileName[fileName.size()-1] != '/', "name ends in /");
|
||||||
}
|
}
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|||||||
12
deps/ox/src/ox/fs/test/tests.cpp
vendored
12
deps/ox/src/ox/fs/test/tests.cpp
vendored
@@ -59,7 +59,7 @@ const std::map<ox::StringView, std::function<ox::Error(ox::StringView)>> tests =
|
|||||||
"PathIterator::next1",
|
"PathIterator::next1",
|
||||||
[](ox::StringView) {
|
[](ox::StringView) {
|
||||||
auto constexpr path = ox::StringLiteral("/usr/share/charset.gbag");
|
auto constexpr path = ox::StringLiteral("/usr/share/charset.gbag");
|
||||||
ox::PathIterator it(path.c_str(), path.len());
|
ox::PathIterator it(path.c_str(), path.size());
|
||||||
ox::StringView buff;
|
ox::StringView buff;
|
||||||
oxAssert(it.next(buff) == 0 && buff == "usr", "PathIterator shows wrong next");
|
oxAssert(it.next(buff) == 0 && buff == "usr", "PathIterator shows wrong next");
|
||||||
oxAssert(it.next(buff) == 0 && buff == "share", "PathIterator shows wrong next");
|
oxAssert(it.next(buff) == 0 && buff == "share", "PathIterator shows wrong next");
|
||||||
@@ -84,7 +84,7 @@ const std::map<ox::StringView, std::function<ox::Error(ox::StringView)>> tests =
|
|||||||
"PathIterator::next3",
|
"PathIterator::next3",
|
||||||
[](ox::StringView) {
|
[](ox::StringView) {
|
||||||
auto const path = ox::String("/");
|
auto const path = ox::String("/");
|
||||||
ox::PathIterator it(path.c_str(), path.len());
|
ox::PathIterator it(path.c_str(), path.size());
|
||||||
ox::StringView buff;
|
ox::StringView buff;
|
||||||
oxAssert(it.next(buff) == 0 && buff == "\0", "PathIterator shows wrong next");
|
oxAssert(it.next(buff) == 0 && buff == "\0", "PathIterator shows wrong next");
|
||||||
return ox::Error(0);
|
return ox::Error(0);
|
||||||
@@ -106,7 +106,7 @@ const std::map<ox::StringView, std::function<ox::Error(ox::StringView)>> tests =
|
|||||||
"PathIterator::next5",
|
"PathIterator::next5",
|
||||||
[](ox::StringView) {
|
[](ox::StringView) {
|
||||||
auto const path = ox::String("usr/share/");
|
auto const path = ox::String("usr/share/");
|
||||||
ox::PathIterator it(path.c_str(), path.len());
|
ox::PathIterator it(path.c_str(), path.size());
|
||||||
ox::StringView buff;
|
ox::StringView buff;
|
||||||
oxAssert(it.next(buff) == 0 && buff == "usr", "PathIterator shows wrong next");
|
oxAssert(it.next(buff) == 0 && buff == "usr", "PathIterator shows wrong next");
|
||||||
oxAssert(it.next(buff) == 0 && buff == "share", "PathIterator shows wrong next");
|
oxAssert(it.next(buff) == 0 && buff == "share", "PathIterator shows wrong next");
|
||||||
@@ -117,10 +117,10 @@ const std::map<ox::StringView, std::function<ox::Error(ox::StringView)>> tests =
|
|||||||
"PathIterator::dirPath",
|
"PathIterator::dirPath",
|
||||||
[] (ox::StringView) {
|
[] (ox::StringView) {
|
||||||
auto constexpr path = ox::StringLiteral("/usr/share/charset.gbag");
|
auto constexpr path = ox::StringLiteral("/usr/share/charset.gbag");
|
||||||
ox::PathIterator it(path.c_str(), path.len());
|
ox::PathIterator it(path.c_str(), path.size());
|
||||||
auto buff = static_cast<char*>(ox_alloca(path.len() + 1));
|
auto buff = static_cast<char*>(ox_alloca(path.size() + 1));
|
||||||
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
oxAssert(it.dirPath(buff, path.len()) == 0 && ox::strcmp(buff, "/usr/share/") == 0, "PathIterator shows incorrect dir path");
|
oxAssert(it.dirPath(buff, path.size()) == 0 && ox::strcmp(buff, "/usr/share/") == 0, "PathIterator shows incorrect dir path");
|
||||||
OX_ALLOW_UNSAFE_BUFFERS_END
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
return ox::Error(0);
|
return ox::Error(0);
|
||||||
}
|
}
|
||||||
|
|||||||
2
deps/ox/src/ox/mc/test/tests.cpp
vendored
2
deps/ox/src/ox/mc/test/tests.cpp
vendored
@@ -157,7 +157,7 @@ std::map<ox::StringView, ox::Error(*)()> tests = {
|
|||||||
oxAssert(testIn.Int8 == testOut.Int8, "Int8 value mismatch");
|
oxAssert(testIn.Int8 == testOut.Int8, "Int8 value mismatch");
|
||||||
oxAssert(testIn.Union.Int == testOut.Union.Int, "Union.Int value mismatch");
|
oxAssert(testIn.Union.Int == testOut.Union.Int, "Union.Int value mismatch");
|
||||||
oxAssert(testIn.String == testOut.String, "String value mismatch");
|
oxAssert(testIn.String == testOut.String, "String value mismatch");
|
||||||
oxDebugf("{}", testOut.IString.len());
|
oxDebugf("{}", testOut.IString.size());
|
||||||
oxExpect(testIn.IString, testOut.IString);
|
oxExpect(testIn.IString, testOut.IString);
|
||||||
oxAssert(testIn.List[0] == testOut.List[0], "List[0] value mismatch");
|
oxAssert(testIn.List[0] == testOut.List[0], "List[0] value mismatch");
|
||||||
oxAssert(testIn.List[1] == testOut.List[1], "List[1] value mismatch");
|
oxAssert(testIn.List[1] == testOut.List[1], "List[1] value mismatch");
|
||||||
|
|||||||
10
deps/ox/src/ox/mc/write.hpp
vendored
10
deps/ox/src/ox/mc/write.hpp
vendored
@@ -191,12 +191,12 @@ template<Writer_c Writer>
|
|||||||
template<std::size_t SmallStringSize>
|
template<std::size_t SmallStringSize>
|
||||||
constexpr Error MetalClawWriter<Writer>::field(const char*, const BasicString<SmallStringSize> *val) noexcept {
|
constexpr Error MetalClawWriter<Writer>::field(const char*, const BasicString<SmallStringSize> *val) noexcept {
|
||||||
bool fieldSet = false;
|
bool fieldSet = false;
|
||||||
if (val->len() && (!m_unionIdx.has_value() || *m_unionIdx == m_field)) {
|
if (val->size() && (!m_unionIdx.has_value() || *m_unionIdx == m_field)) {
|
||||||
// write the length
|
// write the length
|
||||||
const auto strLen = mc::encodeInteger(val->len());
|
const auto strLen = mc::encodeInteger(val->size());
|
||||||
OX_RETURN_ERROR(m_writer.write(reinterpret_cast<const char*>(strLen.data.data()), strLen.length));
|
OX_RETURN_ERROR(m_writer.write(reinterpret_cast<const char*>(strLen.data.data()), strLen.length));
|
||||||
// write the string
|
// write the string
|
||||||
OX_RETURN_ERROR(m_writer.write(val->c_str(), static_cast<std::size_t>(val->len())));
|
OX_RETURN_ERROR(m_writer.write(val->c_str(), static_cast<std::size_t>(val->size())));
|
||||||
fieldSet = true;
|
fieldSet = true;
|
||||||
}
|
}
|
||||||
OX_RETURN_ERROR(m_fieldPresence.set(static_cast<std::size_t>(m_field), fieldSet));
|
OX_RETURN_ERROR(m_fieldPresence.set(static_cast<std::size_t>(m_field), fieldSet));
|
||||||
@@ -207,7 +207,7 @@ constexpr Error MetalClawWriter<Writer>::field(const char*, const BasicString<Sm
|
|||||||
template<Writer_c Writer>
|
template<Writer_c Writer>
|
||||||
template<std::size_t L>
|
template<std::size_t L>
|
||||||
constexpr Error MetalClawWriter<Writer>::field(const char *name, const IString<L> *val) noexcept {
|
constexpr Error MetalClawWriter<Writer>::field(const char *name, const IString<L> *val) noexcept {
|
||||||
return fieldCString(name, val->data(), val->len());
|
return fieldCString(name, val->data(), val->size());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Writer_c Writer>
|
template<Writer_c Writer>
|
||||||
@@ -339,7 +339,7 @@ constexpr Error MetalClawWriter<Writer>::field(const char*, const HashMap<String
|
|||||||
OX_RETURN_ERROR(handler.setTypeInfo("Map", 0, {}, len * 2));
|
OX_RETURN_ERROR(handler.setTypeInfo("Map", 0, {}, len * 2));
|
||||||
// this loop body needs to be in a lambda because of the potential alloca call
|
// this loop body needs to be in a lambda because of the potential alloca call
|
||||||
constexpr auto loopBody = [](auto &handler, auto const&key, auto const&val) -> ox::Error {
|
constexpr auto loopBody = [](auto &handler, auto const&key, auto const&val) -> ox::Error {
|
||||||
const auto keyLen = key.len();
|
const auto keyLen = key.size();
|
||||||
auto wkey = ox_malloca(keyLen + 1, char, 0);
|
auto wkey = ox_malloca(keyLen + 1, char, 0);
|
||||||
memcpy(wkey.get(), key.c_str(), keyLen + 1);
|
memcpy(wkey.get(), key.c_str(), keyLen + 1);
|
||||||
OX_RETURN_ERROR(handler.fieldCString("", wkey.get(), keyLen));
|
OX_RETURN_ERROR(handler.fieldCString("", wkey.get(), keyLen));
|
||||||
|
|||||||
2
deps/ox/src/ox/model/desctypes.hpp
vendored
2
deps/ox/src/ox/model/desctypes.hpp
vendored
@@ -43,7 +43,7 @@ static constexpr auto buildTypeId(
|
|||||||
for (const auto &p : typeParams) {
|
for (const auto &p : typeParams) {
|
||||||
tp += p + ",";
|
tp += p + ",";
|
||||||
}
|
}
|
||||||
tp.resize(tp.len() - 1);
|
tp.resize(tp.size() - 1);
|
||||||
tp += "#";
|
tp += "#";
|
||||||
}
|
}
|
||||||
return ox::sfmt("{}{};{}", name, tp, version);
|
return ox::sfmt("{}{};{}", name, tp, version);
|
||||||
|
|||||||
4
deps/ox/src/ox/model/typenamecatcher.hpp
vendored
4
deps/ox/src/ox/model/typenamecatcher.hpp
vendored
@@ -144,7 +144,7 @@ template<typename T, typename Str = const char*>
|
|||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
consteval auto requireModelTypeName() noexcept {
|
consteval auto requireModelTypeName() noexcept {
|
||||||
constexpr auto name = getModelTypeName<T, Str>();
|
constexpr auto name = getModelTypeName<T, Str>();
|
||||||
static_assert(ox::StringView{name}.len(), "Type lacks required TypeName");
|
static_assert(ox::StringView{name}.size(), "Type lacks required TypeName");
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,7 +159,7 @@ constexpr auto ModelTypeId_v = [] {
|
|||||||
constexpr auto name = ModelTypeName_v<T, ox::StringView>;
|
constexpr auto name = ModelTypeName_v<T, ox::StringView>;
|
||||||
constexpr auto version = ModelTypeVersion_v<T>;
|
constexpr auto version = ModelTypeVersion_v<T>;
|
||||||
constexpr auto versionStr = ox::sfmt<ox::IString<19>>("{}", version);
|
constexpr auto versionStr = ox::sfmt<ox::IString<19>>("{}", version);
|
||||||
return ox::sfmt<ox::IString<name.len() + versionStr.len() + 1>>("{};{}", name, versionStr);
|
return ox::sfmt<ox::IString<name.size() + versionStr.size() + 1>>("{};{}", name, versionStr);
|
||||||
}();
|
}();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
2
deps/ox/src/ox/oc/read.hpp
vendored
2
deps/ox/src/ox/oc/read.hpp
vendored
@@ -307,7 +307,7 @@ Result<T> readOC(BufferView buff) noexcept {
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
Result<T> readOC(ox::StringView json) noexcept {
|
Result<T> readOC(ox::StringView json) noexcept {
|
||||||
return readOC<T>(ox::BufferView{json.data(), json.len()});
|
return readOC<T>(ox::BufferView{json.data(), json.size()});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
2
deps/ox/src/ox/oc/write.cpp
vendored
2
deps/ox/src/ox/oc/write.cpp
vendored
@@ -32,7 +32,7 @@ Error OrganicClawWriter::fieldCString(const char *key, const char *const*val) no
|
|||||||
|
|
||||||
Error OrganicClawWriter::field(const char *key, const UUID *uuid) noexcept {
|
Error OrganicClawWriter::field(const char *key, const UUID *uuid) noexcept {
|
||||||
const auto uuidStr = uuid->toString();
|
const auto uuidStr = uuid->toString();
|
||||||
if (targetValid() && uuidStr.len()) {
|
if (targetValid() && uuidStr.size()) {
|
||||||
value(key) = uuidStr.c_str();
|
value(key) = uuidStr.c_str();
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
|
|||||||
4
deps/ox/src/ox/oc/write.hpp
vendored
4
deps/ox/src/ox/oc/write.hpp
vendored
@@ -138,7 +138,7 @@ class OrganicClawWriter {
|
|||||||
|
|
||||||
template<std::size_t L>
|
template<std::size_t L>
|
||||||
Error field(char const*key, IString<L> const*val) noexcept {
|
Error field(char const*key, IString<L> const*val) noexcept {
|
||||||
if (targetValid() && val->len()) {
|
if (targetValid() && val->size()) {
|
||||||
value(key) = val->c_str();
|
value(key) = val->c_str();
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
@@ -147,7 +147,7 @@ class OrganicClawWriter {
|
|||||||
|
|
||||||
template<std::size_t L>
|
template<std::size_t L>
|
||||||
Error field(char const*key, BasicString<L> const*val) noexcept {
|
Error field(char const*key, BasicString<L> const*val) noexcept {
|
||||||
if (targetValid() && val->len()) {
|
if (targetValid() && val->size()) {
|
||||||
value(key) = val->c_str();
|
value(key) = val->c_str();
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
|
|||||||
3
deps/ox/src/ox/std/assert.cpp
vendored
3
deps/ox/src/ox/std/assert.cpp
vendored
@@ -33,6 +33,9 @@ void panic(StringViewCR file, int const line, StringViewCR panicMsg, Error const
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __GNUC__
|
||||||
|
__attribute__((weak))
|
||||||
|
#endif
|
||||||
void panic(const char *file, int const line, char const*panicMsg, Error const&err) noexcept {
|
void panic(const char *file, int const line, char const*panicMsg, Error const&err) noexcept {
|
||||||
panic(StringView{file}, line, StringView{panicMsg}, err);
|
panic(StringView{file}, line, StringView{panicMsg}, err);
|
||||||
}
|
}
|
||||||
|
|||||||
2
deps/ox/src/ox/std/basestringview.hpp
vendored
2
deps/ox/src/ox/std/basestringview.hpp
vendored
@@ -185,7 +185,7 @@ class BaseStringView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr auto len() const noexcept {
|
constexpr auto size() const noexcept {
|
||||||
return m_len;
|
return m_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
8
deps/ox/src/ox/std/cstringview.hpp
vendored
8
deps/ox/src/ox/std/cstringview.hpp
vendored
@@ -21,13 +21,13 @@ class CStringView: public detail::BaseStringView {
|
|||||||
|
|
||||||
constexpr CStringView(CStringView const&sv) noexcept = default;
|
constexpr CStringView(CStringView const&sv) noexcept = default;
|
||||||
|
|
||||||
constexpr CStringView(StringLiteral const&str) noexcept: BaseStringView(str.data(), str.len()) {}
|
constexpr CStringView(StringLiteral const&str) noexcept: BaseStringView(str.data(), str.size()) {}
|
||||||
|
|
||||||
template<std::size_t SmallStrSz>
|
template<std::size_t SmallStrSz>
|
||||||
constexpr CStringView(BasicString<SmallStrSz> const&str) noexcept: BaseStringView(str.data(), str.len()) {}
|
constexpr CStringView(BasicString<SmallStrSz> const&str) noexcept: BaseStringView(str.data(), str.size()) {}
|
||||||
|
|
||||||
template<std::size_t SmallStrSz>
|
template<std::size_t SmallStrSz>
|
||||||
constexpr CStringView(IString<SmallStrSz> const&str) noexcept: BaseStringView(str.data(), str.len()) {}
|
constexpr CStringView(IString<SmallStrSz> const&str) noexcept: BaseStringView(str.data(), str.size()) {}
|
||||||
|
|
||||||
constexpr CStringView(std::nullptr_t) noexcept {}
|
constexpr CStringView(std::nullptr_t) noexcept {}
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ class CStringView: public detail::BaseStringView {
|
|||||||
|
|
||||||
constexpr auto &operator=(CStringView const&other) noexcept {
|
constexpr auto &operator=(CStringView const&other) noexcept {
|
||||||
if (&other != this) {
|
if (&other != this) {
|
||||||
set(other.data(), other.len());
|
set(other.data(), other.size());
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|||||||
2
deps/ox/src/ox/std/ignore.hpp
vendored
2
deps/ox/src/ox/std/ignore.hpp
vendored
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
namespace std {
|
namespace std {
|
||||||
|
|
||||||
inline constexpr struct {
|
inline constexpr struct ignore_t {
|
||||||
constexpr void operator=(auto&&) const noexcept {}
|
constexpr void operator=(auto&&) const noexcept {}
|
||||||
} ignore;
|
} ignore;
|
||||||
|
|
||||||
|
|||||||
10
deps/ox/src/ox/std/istring.hpp
vendored
10
deps/ox/src/ox/std/istring.hpp
vendored
@@ -72,7 +72,7 @@ class IString {
|
|||||||
* Returns the number of characters in this string.
|
* Returns the number of characters in this string.
|
||||||
*/
|
*/
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr std::size_t len() const noexcept;
|
constexpr std::size_t size() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of bytes used for this string.
|
* Returns the number of bytes used for this string.
|
||||||
@@ -121,7 +121,7 @@ constexpr IString<size> &IString<size>::operator=(Integer_c auto i) noexcept {
|
|||||||
|
|
||||||
template<std::size_t size>
|
template<std::size_t size>
|
||||||
constexpr IString<size> &IString<size>::operator=(ox::StringViewCR str) noexcept {
|
constexpr IString<size> &IString<size>::operator=(ox::StringViewCR str) noexcept {
|
||||||
std::size_t strLen = str.len();
|
std::size_t strLen = str.size();
|
||||||
if (cap() < strLen) {
|
if (cap() < strLen) {
|
||||||
strLen = cap();
|
strLen = cap();
|
||||||
}
|
}
|
||||||
@@ -171,7 +171,7 @@ constexpr char &IString<StrCap>::operator[](std::size_t i) noexcept {
|
|||||||
template<std::size_t StrCap>
|
template<std::size_t StrCap>
|
||||||
constexpr Error IString<StrCap>::append(const char *str, std::size_t strLen) noexcept {
|
constexpr Error IString<StrCap>::append(const char *str, std::size_t strLen) noexcept {
|
||||||
Error err{};
|
Error err{};
|
||||||
auto const currentLen = len();
|
auto const currentLen = size();
|
||||||
if (cap() < currentLen + strLen) {
|
if (cap() < currentLen + strLen) {
|
||||||
strLen = cap() - currentLen;
|
strLen = cap() - currentLen;
|
||||||
err = ox::Error(1, "Insufficient space for full string");
|
err = ox::Error(1, "Insufficient space for full string");
|
||||||
@@ -187,7 +187,7 @@ OX_CLANG_NOWARN_END
|
|||||||
|
|
||||||
template<std::size_t StrCap>
|
template<std::size_t StrCap>
|
||||||
constexpr Error IString<StrCap>::append(ox::StringView str) noexcept {
|
constexpr Error IString<StrCap>::append(ox::StringView str) noexcept {
|
||||||
return append(str.data(), str.len());
|
return append(str.data(), str.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<std::size_t StrCap>
|
template<std::size_t StrCap>
|
||||||
@@ -207,7 +207,7 @@ constexpr const char *IString<StrCap>::c_str() const noexcept {
|
|||||||
|
|
||||||
|
|
||||||
template<std::size_t StrCap>
|
template<std::size_t StrCap>
|
||||||
constexpr std::size_t IString<StrCap>::len() const noexcept {
|
constexpr std::size_t IString<StrCap>::size() const noexcept {
|
||||||
return m_size;
|
return m_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
10
deps/ox/src/ox/std/reader.cpp
vendored
10
deps/ox/src/ox/std/reader.cpp
vendored
@@ -30,13 +30,15 @@ constexpr std::ios_base::seekdir sdMap(ox::ios_base::seekdir in) noexcept {
|
|||||||
|
|
||||||
ox::Result<char> StreamReader::peek() const noexcept {
|
ox::Result<char> StreamReader::peek() const noexcept {
|
||||||
try {
|
try {
|
||||||
|
if (m_strm.eof()) {
|
||||||
|
return Error{1, "EOF"};
|
||||||
|
}
|
||||||
char c{};
|
char c{};
|
||||||
m_strm.get(c);
|
m_strm.get(c);
|
||||||
auto const ok = c != EOF;
|
if (m_strm.unget()) [[unlikely]] {
|
||||||
if (ok && m_strm.unget()) [[unlikely]] {
|
return ox::Error{1, "Unable to unget character"};
|
||||||
return ox::Error(1, "Unable to unget character");
|
|
||||||
}
|
}
|
||||||
return {static_cast<char>(c), ox::Error(!ok, "File peek failed")};
|
return static_cast<char>(c);
|
||||||
} catch (std::exception const&) {
|
} catch (std::exception const&) {
|
||||||
return ox::Error(1, "peek failed");
|
return ox::Error(1, "peek failed");
|
||||||
}
|
}
|
||||||
|
|||||||
18
deps/ox/src/ox/std/span.hpp
vendored
18
deps/ox/src/ox/std/span.hpp
vendored
@@ -163,6 +163,24 @@ class Span {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constexpr Span operator++(int) noexcept {
|
||||||
|
++m_items;
|
||||||
|
--m_size;
|
||||||
|
if (!m_size) [[unlikely]] {
|
||||||
|
m_items = nullptr;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr Span operator++() noexcept {
|
||||||
|
++m_items;
|
||||||
|
--m_size;
|
||||||
|
if (!m_size) [[unlikely]] {
|
||||||
|
m_items = nullptr;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr auto data() const noexcept {
|
constexpr auto data() const noexcept {
|
||||||
return m_items;
|
return m_items;
|
||||||
|
|||||||
40
deps/ox/src/ox/std/string.hpp
vendored
40
deps/ox/src/ox/std/string.hpp
vendored
@@ -139,7 +139,7 @@ class BasicString {
|
|||||||
|
|
||||||
constexpr BasicString &operator+=(Integer_c auto i) noexcept;
|
constexpr BasicString &operator+=(Integer_c auto i) noexcept;
|
||||||
|
|
||||||
constexpr BasicString &operator+=(StringView src) noexcept;
|
constexpr BasicString &operator+=(StringViewCR src) noexcept;
|
||||||
|
|
||||||
constexpr BasicString &operator+=(BasicString const&src) noexcept;
|
constexpr BasicString &operator+=(BasicString const&src) noexcept;
|
||||||
|
|
||||||
@@ -176,7 +176,7 @@ class BasicString {
|
|||||||
constexpr char &operator[](std::size_t i) noexcept;
|
constexpr char &operator[](std::size_t i) noexcept;
|
||||||
|
|
||||||
constexpr Error append(const char *str, std::size_t strLen) noexcept {
|
constexpr Error append(const char *str, std::size_t strLen) noexcept {
|
||||||
auto currentLen = len();
|
auto currentLen = size();
|
||||||
m_buff.resize(m_buff.size() + strLen);
|
m_buff.resize(m_buff.size() + strLen);
|
||||||
ox::listcpy(&m_buff[currentLen], str, strLen);
|
ox::listcpy(&m_buff[currentLen], str, strLen);
|
||||||
// make sure last element is a null terminator
|
// make sure last element is a null terminator
|
||||||
@@ -185,8 +185,8 @@ class BasicString {
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr Error append(ox::StringView sv) noexcept {
|
constexpr Error append(StringViewCR sv) noexcept {
|
||||||
return append(sv.data(), sv.len());
|
return append(sv.data(), sv.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
@@ -237,7 +237,7 @@ class BasicString {
|
|||||||
* Returns the number of characters in this string.
|
* Returns the number of characters in this string.
|
||||||
*/
|
*/
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr std::size_t len() const noexcept;
|
constexpr std::size_t size() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of bytes used for this string.
|
* Returns the number of bytes used for this string.
|
||||||
@@ -277,7 +277,7 @@ constexpr BasicString<SmallStringSize_v>::BasicString(const char *str, std::size
|
|||||||
|
|
||||||
template<std::size_t SmallStringSize_v>
|
template<std::size_t SmallStringSize_v>
|
||||||
constexpr BasicString<SmallStringSize_v>::BasicString(StringLiteral const&str) noexcept:
|
constexpr BasicString<SmallStringSize_v>::BasicString(StringLiteral const&str) noexcept:
|
||||||
BasicString(StringView{str.data(), str.len()}) {
|
BasicString(StringView{str.data(), str.size()}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<std::size_t SmallStringSize_v>
|
template<std::size_t SmallStringSize_v>
|
||||||
@@ -376,7 +376,7 @@ constexpr BasicString<SmallStringSize_v> &BasicString<SmallStringSize_v>::operat
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<std::size_t SmallStringSize_v>
|
template<std::size_t SmallStringSize_v>
|
||||||
constexpr BasicString<SmallStringSize_v> &BasicString<SmallStringSize_v>::operator+=(StringView s) noexcept {
|
constexpr BasicString<SmallStringSize_v> &BasicString<SmallStringSize_v>::operator+=(StringViewCR s) noexcept {
|
||||||
std::size_t strLen = s.bytes();
|
std::size_t strLen = s.bytes();
|
||||||
std::ignore = append(s.data(), strLen);
|
std::ignore = append(s.data(), strLen);
|
||||||
return *this;
|
return *this;
|
||||||
@@ -384,14 +384,14 @@ constexpr BasicString<SmallStringSize_v> &BasicString<SmallStringSize_v>::operat
|
|||||||
|
|
||||||
template<std::size_t SmallStringSize_v>
|
template<std::size_t SmallStringSize_v>
|
||||||
constexpr BasicString<SmallStringSize_v> &BasicString<SmallStringSize_v>::operator+=(BasicString const&src) noexcept {
|
constexpr BasicString<SmallStringSize_v> &BasicString<SmallStringSize_v>::operator+=(BasicString const&src) noexcept {
|
||||||
std::ignore = append(src.c_str(), src.len());
|
std::ignore = append(src.c_str(), src.size());
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<std::size_t SmallStringSize_v>
|
template<std::size_t SmallStringSize_v>
|
||||||
constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operator+(const char *str) const noexcept {
|
constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operator+(const char *str) const noexcept {
|
||||||
const std::size_t strLen = ox::strlen(str);
|
const std::size_t strLen = ox::strlen(str);
|
||||||
const auto currentLen = len();
|
const auto currentLen = size();
|
||||||
BasicString<SmallStringSize_v> cpy;
|
BasicString<SmallStringSize_v> cpy;
|
||||||
cpy.m_buff.resize(m_buff.size() + strLen);
|
cpy.m_buff.resize(m_buff.size() + strLen);
|
||||||
ox::listcpy(&cpy.m_buff[0], m_buff.data(), currentLen);
|
ox::listcpy(&cpy.m_buff[0], m_buff.data(), currentLen);
|
||||||
@@ -420,8 +420,8 @@ constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operato
|
|||||||
|
|
||||||
template<std::size_t SmallStringSize_v>
|
template<std::size_t SmallStringSize_v>
|
||||||
constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operator+(StringViewCR src) const noexcept {
|
constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operator+(StringViewCR src) const noexcept {
|
||||||
const std::size_t strLen = src.len();
|
const std::size_t strLen = src.size();
|
||||||
const auto currentLen = len();
|
const auto currentLen = size();
|
||||||
BasicString<SmallStringSize_v> cpy(currentLen + strLen);
|
BasicString<SmallStringSize_v> cpy(currentLen + strLen);
|
||||||
cpy.m_buff.resize(m_buff.size() + strLen);
|
cpy.m_buff.resize(m_buff.size() + strLen);
|
||||||
ox::listcpy(&cpy.m_buff[0], m_buff.data(), currentLen);
|
ox::listcpy(&cpy.m_buff[0], m_buff.data(), currentLen);
|
||||||
@@ -432,8 +432,8 @@ constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operato
|
|||||||
|
|
||||||
template<std::size_t SmallStringSize_v>
|
template<std::size_t SmallStringSize_v>
|
||||||
constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operator+(BasicString const&src) const noexcept {
|
constexpr BasicString<SmallStringSize_v> BasicString<SmallStringSize_v>::operator+(BasicString const&src) const noexcept {
|
||||||
const std::size_t strLen = src.len();
|
const std::size_t strLen = src.size();
|
||||||
const auto currentLen = len();
|
const auto currentLen = size();
|
||||||
BasicString<SmallStringSize_v> cpy(currentLen + strLen);
|
BasicString<SmallStringSize_v> cpy(currentLen + strLen);
|
||||||
cpy.m_buff.resize(m_buff.size() + strLen);
|
cpy.m_buff.resize(m_buff.size() + strLen);
|
||||||
ox::listcpy(&cpy.m_buff[0], m_buff.data(), currentLen);
|
ox::listcpy(&cpy.m_buff[0], m_buff.data(), currentLen);
|
||||||
@@ -456,7 +456,7 @@ constexpr bool BasicString<SmallStringSize_v>::operator==(const char *other) con
|
|||||||
|
|
||||||
template<std::size_t SmallStringSize_v>
|
template<std::size_t SmallStringSize_v>
|
||||||
constexpr bool BasicString<SmallStringSize_v>::operator==(OxString_c auto const&other) const noexcept {
|
constexpr bool BasicString<SmallStringSize_v>::operator==(OxString_c auto const&other) const noexcept {
|
||||||
return ox::StringView(*this) == ox::StringView(other);
|
return StringView(*this) == StringView(other);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<std::size_t SmallStringSize_v>
|
template<std::size_t SmallStringSize_v>
|
||||||
@@ -521,7 +521,7 @@ constexpr std::size_t BasicString<SmallStringSize_v>::bytes() const noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<std::size_t SmallStringSize_v>
|
template<std::size_t SmallStringSize_v>
|
||||||
constexpr std::size_t BasicString<SmallStringSize_v>::len() const noexcept {
|
constexpr std::size_t BasicString<SmallStringSize_v>::size() const noexcept {
|
||||||
return m_buff.size() - 1;
|
return m_buff.size() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -548,28 +548,28 @@ using StringCR = String const&;
|
|||||||
|
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr ox::String toString(ox::StringViewCR sv) noexcept {
|
constexpr String toString(StringViewCR sv) noexcept {
|
||||||
return ox::String(sv);
|
return ox::String(sv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<typename PlatSpec, std::size_t SmallStringSize_v>
|
template<typename PlatSpec, std::size_t SmallStringSize_v>
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr auto sizeOf(const ox::BasicString<SmallStringSize_v>*) noexcept {
|
constexpr auto sizeOf(BasicString<SmallStringSize_v> const*) noexcept {
|
||||||
VectorMemMap<PlatSpec> v{.smallVecSize = SmallStringSize_v};
|
VectorMemMap<PlatSpec> v{.smallVecSize = SmallStringSize_v};
|
||||||
return sizeOf<PlatSpec>(&v);
|
return sizeOf<PlatSpec>(&v);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename PlatSpec, std::size_t SmallStringSize_v>
|
template<typename PlatSpec, std::size_t SmallStringSize_v>
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr auto alignOf(const ox::BasicString<SmallStringSize_v>&) noexcept {
|
constexpr auto alignOf(BasicString<SmallStringSize_v> const&) noexcept {
|
||||||
VectorMemMap<PlatSpec> v{.smallVecSize = SmallStringSize_v};
|
VectorMemMap<PlatSpec> v{.smallVecSize = SmallStringSize_v};
|
||||||
return alignOf<PlatSpec>(&v);
|
return alignOf<PlatSpec>(&v);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<size_t sz>
|
template<size_t sz>
|
||||||
struct MaybeView<ox::BasicString<sz>> {
|
struct MaybeView<BasicString<sz>> {
|
||||||
using type = ox::StringView;
|
using type = StringView;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
2
deps/ox/src/ox/std/stringliteral.hpp
vendored
2
deps/ox/src/ox/std/stringliteral.hpp
vendored
@@ -32,7 +32,7 @@ class StringLiteral: public detail::BaseStringView {
|
|||||||
OX_ALLOW_UNSAFE_BUFFERS_END
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
|
|
||||||
constexpr StringLiteral &operator=(StringLiteral const &other) noexcept {
|
constexpr StringLiteral &operator=(StringLiteral const &other) noexcept {
|
||||||
set(other.data(), other.len());
|
set(other.data(), other.size());
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
20
deps/ox/src/ox/std/stringview.hpp
vendored
20
deps/ox/src/ox/std/stringview.hpp
vendored
@@ -40,10 +40,10 @@ class StringView: public detail::BaseStringView {
|
|||||||
constexpr StringView(BaseStringView const&str) noexcept: BaseStringView(str.data(), str.bytes()) {}
|
constexpr StringView(BaseStringView const&str) noexcept: BaseStringView(str.data(), str.bytes()) {}
|
||||||
|
|
||||||
template<std::size_t SmallStrSz>
|
template<std::size_t SmallStrSz>
|
||||||
constexpr StringView(const BasicString<SmallStrSz> &str) noexcept: BaseStringView(str.data(), str.len()) {}
|
constexpr StringView(const BasicString<SmallStrSz> &str) noexcept: BaseStringView(str.data(), str.size()) {}
|
||||||
|
|
||||||
template<std::size_t SmallStrSz>
|
template<std::size_t SmallStrSz>
|
||||||
constexpr StringView(const IString<SmallStrSz> &str) noexcept: BaseStringView(str.data(), str.len()) {}
|
constexpr StringView(const IString<SmallStrSz> &str) noexcept: BaseStringView(str.data(), str.size()) {}
|
||||||
|
|
||||||
constexpr StringView(std::nullptr_t) noexcept {}
|
constexpr StringView(std::nullptr_t) noexcept {}
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ class StringView: public detail::BaseStringView {
|
|||||||
|
|
||||||
constexpr auto &operator=(StringView const&other) noexcept {
|
constexpr auto &operator=(StringView const&other) noexcept {
|
||||||
if (&other != this) {
|
if (&other != this) {
|
||||||
set(other.data(), other.len());
|
set(other.data(), other.size());
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@@ -63,14 +63,14 @@ class StringView: public detail::BaseStringView {
|
|||||||
using StringViewCR = StringView const&;
|
using StringViewCR = StringView const&;
|
||||||
|
|
||||||
constexpr auto operator==(StringViewCR s1, StringViewCR s2) noexcept {
|
constexpr auto operator==(StringViewCR s1, StringViewCR s2) noexcept {
|
||||||
if (s2.len() != s1.len()) {
|
if (s2.size() != s1.size()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return ox::strncmp(s1.data(), s2.data(), s1.len()) == 0;
|
return ox::strncmp(s1.data(), s2.data(), s1.size()) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr auto operator<=>(StringViewCR s1, StringViewCR s2) noexcept {
|
constexpr auto operator<=>(StringViewCR s1, StringViewCR s2) noexcept {
|
||||||
const auto maxLen = ox::min(s1.len(), s2.len());
|
const auto maxLen = ox::min(s1.size(), s2.size());
|
||||||
const auto a = &s1.front();
|
const auto a = &s1.front();
|
||||||
const auto b = &s2.front();
|
const auto b = &s2.front();
|
||||||
for (std::size_t i = 0; i < maxLen && (a[i] || b[i]); ++i) {
|
for (std::size_t i = 0; i < maxLen && (a[i] || b[i]); ++i) {
|
||||||
@@ -80,9 +80,9 @@ constexpr auto operator<=>(StringViewCR s1, StringViewCR s2) noexcept {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (s1.len() > s2.len()) {
|
if (s1.size() > s2.size()) {
|
||||||
return 1;
|
return 1;
|
||||||
} else if (s1.len() < s2.len()) {
|
} else if (s1.size() < s2.size()) {
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -104,10 +104,10 @@ constexpr ox::Result<int> strToInt(StringViewCR str) noexcept {
|
|||||||
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
int total = 0;
|
int total = 0;
|
||||||
int multiplier = 1;
|
int multiplier = 1;
|
||||||
if (str.len() == 0) [[unlikely]] {
|
if (str.size() == 0) [[unlikely]] {
|
||||||
return Error{1, "Empty string passed to strToInt"};
|
return Error{1, "Empty string passed to strToInt"};
|
||||||
}
|
}
|
||||||
for (auto i = static_cast<int64_t>(str.len()) - 1; i != -1; --i) {
|
for (auto i = static_cast<int64_t>(str.size()) - 1; i != -1; --i) {
|
||||||
auto s = static_cast<std::size_t>(i);
|
auto s = static_cast<std::size_t>(i);
|
||||||
if (str[s] >= '0' && str[s] <= '9') {
|
if (str[s] >= '0' && str[s] <= '9') {
|
||||||
total += (str[s] - '0') * multiplier;
|
total += (str[s] - '0') * multiplier;
|
||||||
|
|||||||
48
deps/ox/src/ox/std/strops.hpp
vendored
48
deps/ox/src/ox/std/strops.hpp
vendored
@@ -21,37 +21,47 @@ OX_CLANG_NOWARN_BEGIN(-Wunsafe-buffer-usage)
|
|||||||
namespace ox {
|
namespace ox {
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr ox::StringView substr(ox::StringView const&str, std::size_t pos) noexcept {
|
constexpr StringView substr(StringViewCR str, std::size_t const pos) noexcept {
|
||||||
if (str.len() >= pos) {
|
if (str.size() >= pos) {
|
||||||
return {&str[pos], str.len() - pos};
|
return {&str[pos], str.size() - pos};
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr ox::StringView substr(ox::StringView const&str, std::size_t start, std::size_t end) noexcept {
|
constexpr StringView substr(StringViewCR str, std::size_t const start, std::size_t const end) noexcept {
|
||||||
if (str.len() >= start && end >= start) {
|
if (str.size() >= start && end >= start) {
|
||||||
return {&str[start], end - start};
|
return {&str[start], end - start};
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
constexpr bool beginsWith(StringViewCR base, char const beginning) noexcept {
|
||||||
|
return base.size() && base[0] == beginning;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
constexpr bool endsWith(StringViewCR base, char const ending) noexcept {
|
||||||
|
return base.size() && base[base.size() - 1] == ending;
|
||||||
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr bool beginsWith(StringViewCR base, StringViewCR beginning) noexcept {
|
constexpr bool beginsWith(StringViewCR base, StringViewCR beginning) noexcept {
|
||||||
const auto beginningLen = ox::min(beginning.len(), base.len());
|
const auto beginningLen = ox::min(beginning.size(), base.size());
|
||||||
return base.len() >= beginning.len() && ox::strncmp(base.data(), beginning, beginningLen) == 0;
|
return base.size() >= beginning.size() && ox::strncmp(base.data(), beginning, beginningLen) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr bool endsWith(StringViewCR base, StringViewCR ending) noexcept {
|
constexpr bool endsWith(StringViewCR base, StringViewCR ending) noexcept {
|
||||||
const auto endingLen = ending.len();
|
const auto endingLen = ending.size();
|
||||||
return base.len() >= endingLen && ox::strcmp(base.data() + (base.len() - endingLen), ending) == 0;
|
return base.size() >= endingLen && ox::strcmp(base.data() + (base.size() - endingLen), ending) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr std::size_t find(StringViewCR str, char search) noexcept {
|
constexpr std::size_t find(StringViewCR str, char const search) noexcept {
|
||||||
std::size_t i = 0;
|
std::size_t i = 0;
|
||||||
for (; i < str.len(); ++i) {
|
for (; i < str.size(); ++i) {
|
||||||
if (str[i] == search) {
|
if (str[i] == search) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -62,7 +72,7 @@ constexpr std::size_t find(StringViewCR str, char search) noexcept {
|
|||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr std::size_t find(StringViewCR str, StringViewCR search) noexcept {
|
constexpr std::size_t find(StringViewCR str, StringViewCR search) noexcept {
|
||||||
std::size_t i = 0;
|
std::size_t i = 0;
|
||||||
for (; i < str.len(); ++i) {
|
for (; i < str.size(); ++i) {
|
||||||
if (beginsWith(substr(str, i), search)) {
|
if (beginsWith(substr(str, i), search)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -72,14 +82,14 @@ constexpr std::size_t find(StringViewCR str, StringViewCR search) noexcept {
|
|||||||
|
|
||||||
template<std::size_t smallSz = 0>
|
template<std::size_t smallSz = 0>
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr ox::Vector<ox::StringView, smallSz> split(StringViewCR str, char del) noexcept {
|
constexpr ox::Vector<ox::StringView, smallSz> split(StringViewCR str, char const del) noexcept {
|
||||||
ox::Vector<ox::StringView, smallSz> out;
|
ox::Vector<ox::StringView, smallSz> out;
|
||||||
constexpr auto nextSeg = [](StringViewCR current, char del) {
|
constexpr auto nextSeg = [](StringViewCR current, char del) {
|
||||||
return substr(current, find(current, del) + 1);
|
return substr(current, find(current, del) + 1);
|
||||||
};
|
};
|
||||||
for (auto current = str; current.len(); current = nextSeg(current, del)) {
|
for (auto current = str; current.size(); current = nextSeg(current, del)) {
|
||||||
const auto next = find(current, del);
|
const auto next = find(current, del);
|
||||||
if (const auto s = substr(current, 0, next); s.len()) {
|
if (const auto s = substr(current, 0, next); s.size()) {
|
||||||
out.emplace_back(s);
|
out.emplace_back(s);
|
||||||
}
|
}
|
||||||
current = substr(current, next);
|
current = substr(current, next);
|
||||||
@@ -92,11 +102,11 @@ template<std::size_t smallSz = 0>
|
|||||||
constexpr ox::Vector<ox::StringView, smallSz> split(StringViewCR str, StringViewCR del) noexcept {
|
constexpr ox::Vector<ox::StringView, smallSz> split(StringViewCR str, StringViewCR del) noexcept {
|
||||||
ox::Vector<ox::StringView, smallSz> out;
|
ox::Vector<ox::StringView, smallSz> out;
|
||||||
constexpr auto nextSeg = [](StringViewCR current, StringViewCR del) {
|
constexpr auto nextSeg = [](StringViewCR current, StringViewCR del) {
|
||||||
return substr(current, find(current, del) + del.len());
|
return substr(current, find(current, del) + del.size());
|
||||||
};
|
};
|
||||||
for (auto current = str; current.len(); current = nextSeg(current, del)) {
|
for (auto current = str; current.size(); current = nextSeg(current, del)) {
|
||||||
const auto next = find(current, del);
|
const auto next = find(current, del);
|
||||||
if (const auto s = substr(current, 0, next); s.len()) {
|
if (const auto s = substr(current, 0, next); s.size()) {
|
||||||
out.emplace_back(s);
|
out.emplace_back(s);
|
||||||
}
|
}
|
||||||
current = substr(current, next);
|
current = substr(current, next);
|
||||||
@@ -105,7 +115,7 @@ constexpr ox::Vector<ox::StringView, smallSz> split(StringViewCR str, StringView
|
|||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr ox::Result<std::size_t> lastIndexOf(ox::StringViewCR str, int character) noexcept {
|
constexpr ox::Result<std::size_t> lastIndexOf(ox::StringViewCR str, int const character) noexcept {
|
||||||
ox::Result<std::size_t> retval = ox::Error(1, "Character not found");
|
ox::Result<std::size_t> retval = ox::Error(1, "Character not found");
|
||||||
for (auto i = static_cast<int>(str.bytes() - 1); i >= 0; --i) {
|
for (auto i = static_cast<int>(str.bytes() - 1); i >= 0; --i) {
|
||||||
if (str[static_cast<std::size_t>(i)] == character) {
|
if (str[static_cast<std::size_t>(i)] == character) {
|
||||||
|
|||||||
2
deps/ox/src/ox/std/test/tests.cpp
vendored
2
deps/ox/src/ox/std/test/tests.cpp
vendored
@@ -183,7 +183,7 @@ OX_CLANG_NOWARN_END
|
|||||||
s = "asdf";
|
s = "asdf";
|
||||||
oxAssert(s == "asdf", "String assign broken");
|
oxAssert(s == "asdf", "String assign broken");
|
||||||
oxAssert(s != "aoeu", "String assign broken");
|
oxAssert(s != "aoeu", "String assign broken");
|
||||||
oxAssert(s.len() == 4, "String assign broken");
|
oxAssert(s.size() == 4, "String assign broken");
|
||||||
return ox::Error(0);
|
return ox::Error(0);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
10
deps/ox/src/ox/std/trace.hpp
vendored
10
deps/ox/src/ox/std/trace.hpp
vendored
@@ -166,7 +166,7 @@ class OutStream {
|
|||||||
constexpr OutStream &operator<<(Integer_c auto v) noexcept;
|
constexpr OutStream &operator<<(Integer_c auto v) noexcept;
|
||||||
|
|
||||||
constexpr OutStream &operator<<(char v) noexcept {
|
constexpr OutStream &operator<<(char v) noexcept {
|
||||||
if (m_msg.msg.len()) {
|
if (m_msg.msg.size()) {
|
||||||
m_msg.msg += m_delimiter;
|
m_msg.msg += m_delimiter;
|
||||||
}
|
}
|
||||||
m_msg.msg += v;
|
m_msg.msg += v;
|
||||||
@@ -174,7 +174,7 @@ class OutStream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constexpr OutStream &operator<<(StringViewCR v) noexcept {
|
constexpr OutStream &operator<<(StringViewCR v) noexcept {
|
||||||
if (m_msg.msg.len()) {
|
if (m_msg.msg.size()) {
|
||||||
m_msg.msg += m_delimiter;
|
m_msg.msg += m_delimiter;
|
||||||
}
|
}
|
||||||
m_msg.msg += v;
|
m_msg.msg += v;
|
||||||
@@ -209,7 +209,7 @@ class OutStream {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
constexpr OutStream &appendSignedInt(int64_t v) noexcept {
|
constexpr OutStream &appendSignedInt(int64_t v) noexcept {
|
||||||
if (m_msg.msg.len()) {
|
if (m_msg.msg.size()) {
|
||||||
m_msg.msg += m_delimiter;
|
m_msg.msg += m_delimiter;
|
||||||
}
|
}
|
||||||
m_msg.msg += static_cast<int64_t>(v);
|
m_msg.msg += static_cast<int64_t>(v);
|
||||||
@@ -217,7 +217,7 @@ class OutStream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constexpr OutStream &appendUnsignedInt(uint64_t v) noexcept {
|
constexpr OutStream &appendUnsignedInt(uint64_t v) noexcept {
|
||||||
if (m_msg.msg.len()) {
|
if (m_msg.msg.size()) {
|
||||||
m_msg.msg += m_delimiter;
|
m_msg.msg += m_delimiter;
|
||||||
}
|
}
|
||||||
m_msg.msg += static_cast<int64_t>(v);
|
m_msg.msg += static_cast<int64_t>(v);
|
||||||
@@ -227,7 +227,7 @@ class OutStream {
|
|||||||
};
|
};
|
||||||
|
|
||||||
constexpr OutStream &OutStream::operator<<(Integer_c auto v) noexcept {
|
constexpr OutStream &OutStream::operator<<(Integer_c auto v) noexcept {
|
||||||
if (m_msg.msg.len()) {
|
if (m_msg.msg.size()) {
|
||||||
m_msg.msg += m_delimiter;
|
m_msg.msg += m_delimiter;
|
||||||
}
|
}
|
||||||
m_msg.msg += v;
|
m_msg.msg += v;
|
||||||
|
|||||||
10
deps/ox/src/ox/std/uuid.hpp
vendored
10
deps/ox/src/ox/std/uuid.hpp
vendored
@@ -58,7 +58,7 @@ constexpr ox::Result<uint8_t> fromHex(ox::StringViewCR v) noexcept {
|
|||||||
if (!detail::isHexChar(v[0]) || !detail::isHexChar(v[1])) {
|
if (!detail::isHexChar(v[0]) || !detail::isHexChar(v[1])) {
|
||||||
return ox::Error(1, "Invalid UUID");
|
return ox::Error(1, "Invalid UUID");
|
||||||
}
|
}
|
||||||
if (v.len() != 2) {
|
if (v.size() != 2) {
|
||||||
return ox::Error(2);
|
return ox::Error(2);
|
||||||
}
|
}
|
||||||
uint8_t out = 0;
|
uint8_t out = 0;
|
||||||
@@ -133,18 +133,18 @@ class UUID {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static constexpr ox::Result<ox::UUID> fromString(ox::StringViewCR s) noexcept {
|
static constexpr ox::Result<ox::UUID> fromString(ox::StringViewCR s) noexcept {
|
||||||
if (s.len() < 36) {
|
if (s.size() < 36) {
|
||||||
return ox::Error(1, "Insufficient data to contain a complete UUID");
|
return ox::Error(1, "Insufficient data to contain a complete UUID");
|
||||||
}
|
}
|
||||||
UUID out;
|
UUID out;
|
||||||
auto valueI = 0u;
|
auto valueI = 0u;
|
||||||
for (size_t i = 0; i < s.len();) {
|
for (size_t i = 0; i < s.size();) {
|
||||||
if (s[i] == '-') {
|
if (s[i] == '-') {
|
||||||
++i;
|
++i;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const auto seg = substr(s, i, i + 2);
|
const auto seg = substr(s, i, i + 2);
|
||||||
if (seg.len() != 2) {
|
if (seg.size() != 2) {
|
||||||
return ox::Error(1, "Invalid UUID");
|
return ox::Error(1, "Invalid UUID");
|
||||||
}
|
}
|
||||||
OX_REQUIRE(val, detail::fromHex(seg));
|
OX_REQUIRE(val, detail::fromHex(seg));
|
||||||
@@ -174,7 +174,7 @@ class UUID {
|
|||||||
for (auto i = 0u; i < cnt; ++i) {
|
for (auto i = 0u; i < cnt; ++i) {
|
||||||
const auto v = value[valueI];
|
const auto v = value[valueI];
|
||||||
const auto h = detail::toHex(v);
|
const auto h = detail::toHex(v);
|
||||||
std::ignore = writer.write(h.c_str(), h.len());
|
std::ignore = writer.write(h.c_str(), h.size());
|
||||||
++valueI;
|
++valueI;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
4
deps/ox/src/ox/std/vector.hpp
vendored
4
deps/ox/src/ox/std/vector.hpp
vendored
@@ -87,7 +87,9 @@ struct VectorAllocator {
|
|||||||
constexpr void deallocate(T *items, std::size_t cap) noexcept {
|
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
|
// small vector optimization cannot be done it constexpr, but it doesn't really matter in constexpr
|
||||||
if (std::is_constant_evaluated()) {
|
if (std::is_constant_evaluated()) {
|
||||||
Allocator{}.deallocate(items, cap);
|
if (items) {
|
||||||
|
Allocator{}.deallocate(items, cap);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (items && static_cast<void*>(items) != static_cast<void*>(m_data.data())) {
|
if (items && static_cast<void*>(items) != static_cast<void*>(m_data.data())) {
|
||||||
Allocator{}.deallocate(items, cap);
|
Allocator{}.deallocate(items, cap);
|
||||||
|
|||||||
40
deps/teagba/include/teagba/addresses.hpp
vendored
40
deps/teagba/include/teagba/addresses.hpp
vendored
@@ -54,25 +54,41 @@ inline volatile BgCtl ®BgCtl(uintptr_t const bgIdx) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// background horizontal scrolling registers
|
// background horizontal scrolling registers
|
||||||
#define REG_BG0HOFS (*reinterpret_cast<volatile uint32_t*>(0x0400'0010))
|
#define REG_BG0HOFS (*reinterpret_cast<volatile int16_t*>(0x0400'0010))
|
||||||
#define REG_BG1HOFS (*reinterpret_cast<volatile uint32_t*>(0x0400'0014))
|
#define REG_BG1HOFS (*reinterpret_cast<volatile int16_t*>(0x0400'0014))
|
||||||
#define REG_BG2HOFS (*reinterpret_cast<volatile uint32_t*>(0x0400'0018))
|
#define REG_BG2HOFS (*reinterpret_cast<volatile int16_t*>(0x0400'0018))
|
||||||
#define REG_BG3HOFS (*reinterpret_cast<volatile uint32_t*>(0x0400'001c))
|
#define REG_BG3HOFS (*reinterpret_cast<volatile int16_t*>(0x0400'001c))
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
volatile uint32_t ®BgHofs(auto const bgIdx) noexcept {
|
volatile int16_t ®BgHofs(auto const bgIdx) noexcept {
|
||||||
return *reinterpret_cast<volatile uint32_t*>(0x0400'0010 + 4 * bgIdx);
|
return *reinterpret_cast<volatile int16_t*>(0x0400'0010 + 4 * bgIdx);
|
||||||
}
|
}
|
||||||
|
|
||||||
// background vertical scrolling registers
|
// background vertical scrolling registers
|
||||||
#define REG_BG0VOFS (*reinterpret_cast<volatile uint32_t*>(0x0400'0012))
|
#define REG_BG0VOFS (*reinterpret_cast<volatile int16_t*>(0x0400'0012))
|
||||||
#define REG_BG1VOFS (*reinterpret_cast<volatile uint32_t*>(0x0400'0016))
|
#define REG_BG1VOFS (*reinterpret_cast<volatile int16_t*>(0x0400'0016))
|
||||||
#define REG_BG2VOFS (*reinterpret_cast<volatile uint32_t*>(0x0400'001a))
|
#define REG_BG2VOFS (*reinterpret_cast<volatile int16_t*>(0x0400'001a))
|
||||||
#define REG_BG3VOFS (*reinterpret_cast<volatile uint32_t*>(0x0400'001e))
|
#define REG_BG3VOFS (*reinterpret_cast<volatile int16_t*>(0x0400'001e))
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
volatile uint32_t ®BgVofs(auto const bgIdx) noexcept {
|
volatile int16_t ®BgVofs(auto const bgIdx) noexcept {
|
||||||
return *reinterpret_cast<volatile uint32_t*>(0x0400'0012 + 4 * bgIdx);
|
return *reinterpret_cast<volatile int16_t*>(0x0400'0012 + 4 * bgIdx);
|
||||||
|
}
|
||||||
|
|
||||||
|
// background scrolling registers
|
||||||
|
|
||||||
|
struct OffsetPair {
|
||||||
|
int16_t x{}, y{};
|
||||||
|
};
|
||||||
|
|
||||||
|
#define REG_BG0OFS (*reinterpret_cast<volatile OffsetPair*>(0x0400'0010))
|
||||||
|
#define REG_BG1OFS (*reinterpret_cast<volatile OffsetPair*>(0x0400'0014))
|
||||||
|
#define REG_BG2OFS (*reinterpret_cast<volatile OffsetPair*>(0x0400'0018))
|
||||||
|
#define REG_BG3OFS (*reinterpret_cast<volatile OffsetPair*>(0x0400'001c))
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
volatile OffsetPair ®BgOfs(auto const bgIdx) noexcept {
|
||||||
|
return *reinterpret_cast<volatile OffsetPair*>(0x0400'0010 + sizeof(OffsetPair) * bgIdx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
4
deps/teagba/include/teagba/gfx.hpp
vendored
4
deps/teagba/include/teagba/gfx.hpp
vendored
@@ -41,4 +41,8 @@ void addSpriteUpdate(GbaSpriteAttrUpdate const &upd) noexcept;
|
|||||||
|
|
||||||
void applySpriteUpdates() noexcept;
|
void applySpriteUpdates() noexcept;
|
||||||
|
|
||||||
|
void setBgOffset(uint16_t bg, int16_t x, int16_t y) noexcept;
|
||||||
|
|
||||||
|
void scrollBgOffset(uint16_t bg, int16_t x, int16_t y) noexcept;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
14
deps/teagba/src/gfx.cpp
vendored
14
deps/teagba/src/gfx.cpp
vendored
@@ -12,7 +12,7 @@ namespace teagba {
|
|||||||
|
|
||||||
static ox::Array<GbaSpriteAttrUpdate, 128> g_spriteBuffer;
|
static ox::Array<GbaSpriteAttrUpdate, 128> g_spriteBuffer;
|
||||||
|
|
||||||
GbaSpriteAttrUpdate &spriteAttr(size_t i) noexcept {
|
GbaSpriteAttrUpdate &spriteAttr(size_t const i) noexcept {
|
||||||
return g_spriteBuffer[i];
|
return g_spriteBuffer[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,4 +29,16 @@ void applySpriteUpdates() noexcept {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setBgOffset(uint16_t const bg, int16_t const x, int16_t const y) noexcept {
|
||||||
|
auto &o = regBgOfs(bg);
|
||||||
|
o.x = x;
|
||||||
|
o.y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void scrollBgOffset(uint16_t const bg, int16_t const x, int16_t const y) noexcept {
|
||||||
|
auto &o = regBgOfs(bg);
|
||||||
|
o.x = o.x + x;
|
||||||
|
o.y = o.y + y;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -238,6 +238,10 @@ void setBgCbb(Context &ctx, unsigned bgIdx, unsigned cbbIdx) noexcept;
|
|||||||
|
|
||||||
void setBgPriority(Context &ctx, uint_t bgIdx, uint_t priority) noexcept;
|
void setBgPriority(Context &ctx, uint_t bgIdx, uint_t priority) noexcept;
|
||||||
|
|
||||||
|
void setBgOffset(Context &ctx, uint16_t bg, int16_t x, int16_t y) noexcept;
|
||||||
|
|
||||||
|
void scrollBgOffset(Context &ctx, uint16_t bg, int16_t x, int16_t y) noexcept;
|
||||||
|
|
||||||
void hideSprite(Context &ctx, unsigned) noexcept;
|
void hideSprite(Context &ctx, unsigned) noexcept;
|
||||||
|
|
||||||
void showSprite(Context &ctx, unsigned) noexcept;
|
void showSprite(Context &ctx, unsigned) noexcept;
|
||||||
@@ -260,8 +264,8 @@ constexpr ox::CStringView GlslVersion = "#version 330";
|
|||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
ox::Size drawSize(int scale = 5) noexcept;
|
ox::Size drawSize(int scale = 5) noexcept;
|
||||||
|
|
||||||
void draw(gfx::Context &ctx, ox::Size const &renderSz) noexcept;
|
void draw(Context &ctx, ox::Size const &renderSz) noexcept;
|
||||||
|
|
||||||
void draw(gfx::Context&, int scale = 5) noexcept;
|
void draw(Context&, int scale = 5) noexcept;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -169,8 +169,8 @@ ox::Error loadBgTileSheet(
|
|||||||
unsigned const cbb,
|
unsigned const cbb,
|
||||||
CompactTileSheet const &ts,
|
CompactTileSheet const &ts,
|
||||||
ox::Optional<unsigned> const &paletteBank) noexcept {
|
ox::Optional<unsigned> const &paletteBank) noexcept {
|
||||||
auto const cnt = (ts.pixels.size() * PixelsPerTile) / (1 + (ts.bpp == 4));
|
auto const cnt = ts.pixels.size() >> (ts.bpp == 4);
|
||||||
for (size_t i = 0; i < cnt; ++i) {
|
for (size_t i{}; i < cnt; ++i) {
|
||||||
auto const srcIdx = i * 2;
|
auto const srcIdx = i * 2;
|
||||||
auto const p1 = static_cast<uint16_t>(ts.pixels[srcIdx]);
|
auto const p1 = static_cast<uint16_t>(ts.pixels[srcIdx]);
|
||||||
auto const p2 = static_cast<uint16_t>(ts.pixels[srcIdx + 1]);
|
auto const p2 = static_cast<uint16_t>(ts.pixels[srcIdx + 1]);
|
||||||
@@ -218,10 +218,11 @@ ox::Error loadSpriteTileSheet(
|
|||||||
Context &ctx,
|
Context &ctx,
|
||||||
CompactTileSheet const &ts,
|
CompactTileSheet const &ts,
|
||||||
bool const loadDefaultPalette) noexcept {
|
bool const loadDefaultPalette) noexcept {
|
||||||
for (size_t i = 0; i < ts.pixels.size(); i += 2) {
|
for (size_t i{}; i < ts.pixels.size(); i += 2) {
|
||||||
uint16_t v = ts.pixels[i];
|
MEM_SPRITE_TILES[i >> 1] =
|
||||||
v |= static_cast<uint16_t>(ts.pixels[i + 1] << 8);
|
static_cast<uint16_t>(
|
||||||
MEM_SPRITE_TILES[i] = v;
|
ts.pixels[i] |
|
||||||
|
(static_cast<uint16_t>(ts.pixels[i + 1]) << 8));
|
||||||
}
|
}
|
||||||
if (loadDefaultPalette && ts.defaultPalette) {
|
if (loadDefaultPalette && ts.defaultPalette) {
|
||||||
OX_RETURN_ERROR(loadSpritePalette(ctx, ts.defaultPalette));
|
OX_RETURN_ERROR(loadSpritePalette(ctx, ts.defaultPalette));
|
||||||
@@ -294,6 +295,14 @@ void setBgPriority(Context&, uint_t const bgIdx, uint_t const priority) noexcept
|
|||||||
bgCtl = (bgCtl & 0b1111'1111'1111'1100u) | (priority & 0b11);
|
bgCtl = (bgCtl & 0b1111'1111'1111'1100u) | (priority & 0b11);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setBgOffset(Context&, uint16_t const bg, int16_t const x, int16_t const y) noexcept {
|
||||||
|
teagba::setBgOffset(bg, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void scrollBgOffset(Context&, uint16_t const bg, int16_t const x, int16_t const y) noexcept {
|
||||||
|
teagba::scrollBgOffset(bg, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
void hideSprite(Context&, unsigned const idx) noexcept {
|
void hideSprite(Context&, unsigned const idx) noexcept {
|
||||||
//oxAssert(g_spriteUpdates < config::GbaSpriteBufferLen, "Sprite update buffer overflow");
|
//oxAssert(g_spriteUpdates < config::GbaSpriteBufferLen, "Sprite update buffer overflow");
|
||||||
teagba::addSpriteUpdate({
|
teagba::addSpriteUpdate({
|
||||||
|
|||||||
@@ -249,7 +249,7 @@ void setBgTile(
|
|||||||
}
|
}
|
||||||
|
|
||||||
ox::Error initConsole(Context &ctx) noexcept {
|
ox::Error initConsole(Context &ctx) noexcept {
|
||||||
constexpr ox::FileAddress TilesheetAddr = ox::StringLiteral("/TileSheets/Charset.ng");
|
constexpr ox::FileAddress TilesheetAddr = ox::StringLiteral("/TileSheets/Charset.nts");
|
||||||
constexpr ox::FileAddress PaletteAddr = ox::StringLiteral("/Palettes/Charset.npal");
|
constexpr ox::FileAddress PaletteAddr = ox::StringLiteral("/Palettes/Charset.npal");
|
||||||
setBgStatus(ctx, 0b0001);
|
setBgStatus(ctx, 0b0001);
|
||||||
setBgCbb(ctx, 0, 0);
|
setBgCbb(ctx, 0, 0);
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ ox::Error cmdExportTilesheet(studio::Project &project, ox::SpanView<ox::CString>
|
|||||||
// load objects
|
// load objects
|
||||||
auto &kctx = project.kctx();
|
auto &kctx = project.kctx();
|
||||||
OX_REQUIRE(ts, keel::readObj<TileSheet>(kctx, srcPath).transformError(4, "could not load TileSheet"));
|
OX_REQUIRE(ts, keel::readObj<TileSheet>(kctx, srcPath).transformError(4, "could not load TileSheet"));
|
||||||
OX_REQUIRE(pal, keel::readObj<Palette>(kctx, palPath.len() ? palPath : ts->defaultPalette)
|
OX_REQUIRE(pal, keel::readObj<Palette>(kctx, palPath.size() ? palPath : ts->defaultPalette)
|
||||||
.transformError(5, "could not load Palette"));
|
.transformError(5, "could not load Palette"));
|
||||||
// export to the destination file
|
// export to the destination file
|
||||||
return exportSubsheetToPng(
|
return exportSubsheetToPng(
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ static int testUpdateHandler(turbine::Context &tctx) noexcept {
|
|||||||
spriteX += xmod;
|
spriteX += xmod;
|
||||||
spriteY += ymod;
|
spriteY += ymod;
|
||||||
constexpr ox::StringView sprites = "nostalgia";
|
constexpr ox::StringView sprites = "nostalgia";
|
||||||
for (unsigned i = 0; i < sprites.len(); ++i) {
|
for (unsigned i = 0; i < sprites.size(); ++i) {
|
||||||
auto const c = static_cast<unsigned>(sprites[i] - ('a' - 1));
|
auto const c = static_cast<unsigned>(sprites[i] - ('a' - 1));
|
||||||
gfx::setSprite(cctx, i, {
|
gfx::setSprite(cctx, i, {
|
||||||
.enabled = true,
|
.enabled = true,
|
||||||
|
|||||||
@@ -19,6 +19,9 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_subdirectory(applib)
|
add_subdirectory(applib)
|
||||||
|
#if(NOT APPLE)
|
||||||
|
# add_subdirectory(hull)
|
||||||
|
#endif()
|
||||||
add_subdirectory(keel)
|
add_subdirectory(keel)
|
||||||
add_subdirectory(turbine)
|
add_subdirectory(turbine)
|
||||||
if(${OLYMPIC_BUILD_STUDIO})
|
if(${OLYMPIC_BUILD_STUDIO})
|
||||||
|
|||||||
@@ -3,6 +3,11 @@ add_library(
|
|||||||
OlympicApplib INTERFACE
|
OlympicApplib INTERFACE
|
||||||
)
|
)
|
||||||
|
|
||||||
|
target_link_libraries(
|
||||||
|
OlympicApplib INTERFACE
|
||||||
|
OxLogConn
|
||||||
|
)
|
||||||
|
|
||||||
target_sources(
|
target_sources(
|
||||||
OlympicApplib INTERFACE
|
OlympicApplib INTERFACE
|
||||||
applib.cpp
|
applib.cpp
|
||||||
|
|||||||
12
src/olympic/hull/CMakeLists.txt
Normal file
12
src/olympic/hull/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
add_library(Hull)
|
||||||
|
target_sources(
|
||||||
|
Hull PUBLIC
|
||||||
|
FILE_SET CXX_MODULES FILES
|
||||||
|
hull.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(
|
||||||
|
Hull PUBLIC
|
||||||
|
OxStd
|
||||||
|
)
|
||||||
98
src/olympic/hull/hull.cpp
Normal file
98
src/olympic/hull/hull.cpp
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2016 - 2025 Gary Talent (gary@drinkingtea.net). All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
module;
|
||||||
|
|
||||||
|
#include <ox/std/string.hpp>
|
||||||
|
|
||||||
|
export module hull;
|
||||||
|
|
||||||
|
namespace hull {
|
||||||
|
|
||||||
|
export
|
||||||
|
template<typename Str = ox::String, size_t SmallVecSz = 0>
|
||||||
|
constexpr ox::Result<ox::Vector<Str, SmallVecSz>> parseCmd(ox::StringViewCR cmd) noexcept
|
||||||
|
requires(ox::is_same_v<Str, ox::String> || ox::is_same_v<Str, ox::StringView>) {
|
||||||
|
auto const tokens = split(cmd, ' ');
|
||||||
|
ox::Vector<Str, SmallVecSz> args;
|
||||||
|
char waitingFor{};
|
||||||
|
auto const handleString = [&waitingFor, &args](
|
||||||
|
ox::StringViewCR token,
|
||||||
|
char const delimiter) {
|
||||||
|
if (endsWith(token, delimiter)) {
|
||||||
|
args.emplace_back(substr(token, 1, token.size() - 1));
|
||||||
|
} else {
|
||||||
|
waitingFor = delimiter;
|
||||||
|
args.emplace_back(substr(token, 1));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
for (auto const &token : tokens) {
|
||||||
|
if (waitingFor) {
|
||||||
|
if (endsWith(token, waitingFor)) {
|
||||||
|
waitingFor = 0;
|
||||||
|
}
|
||||||
|
auto &tgt = *args.back().value;
|
||||||
|
if constexpr (ox::is_same_v<Str, ox::String>) {
|
||||||
|
tgt += substr(token, 0, token.size() - 1);
|
||||||
|
} else {
|
||||||
|
tgt = {tgt.data(), tgt.size() + token.size() - 1};
|
||||||
|
}
|
||||||
|
} else if (beginsWith(token, '"')) {
|
||||||
|
handleString(token, '"');
|
||||||
|
} else if (beginsWith(token, '\'')) {
|
||||||
|
handleString(token, '\'');
|
||||||
|
} else {
|
||||||
|
args.emplace_back(token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (waitingFor) {
|
||||||
|
return ox::Error{1, "unterminated string"};
|
||||||
|
}
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Str = ox::String>
|
||||||
|
[[nodiscard]]
|
||||||
|
static constexpr bool testParse(ox::StringViewCR cmd, std::initializer_list<ox::StringView> const &expected) noexcept {
|
||||||
|
auto const [args, err] = parseCmd<Str>(cmd);
|
||||||
|
static constexpr auto equals = [](auto const &a, auto const &b) {
|
||||||
|
if (a.size() != b.size()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (auto i = 0u; i < a.size(); ++i) {
|
||||||
|
if (a[i] != b[i]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
return !err && equals(args, ox::Vector(expected));
|
||||||
|
}
|
||||||
|
|
||||||
|
static_assert(testParse("echo asdf", {"echo", "asdf"}));
|
||||||
|
static_assert(testParse<ox::String>("echo asdf", {"echo", "asdf"}));
|
||||||
|
|
||||||
|
static_assert(testParse("echo \"asdf\"", {"echo", "asdf"}));
|
||||||
|
static_assert(testParse<ox::String>("echo \"asdf\"", {"echo", "asdf"}));
|
||||||
|
|
||||||
|
static_assert(testParse("echo 'asdf'", {"echo", "asdf"}));
|
||||||
|
static_assert(testParse<ox::String>("echo 'asdf'", {"echo", "asdf"}));
|
||||||
|
|
||||||
|
static_assert(testParse("echo 'asdf' aoue", {"echo", "asdf", "aoue"}));
|
||||||
|
static_assert(testParse<ox::String>("echo 'asdf' aoue", {"echo", "asdf", "aoue"}));
|
||||||
|
|
||||||
|
export class Prompt {
|
||||||
|
|
||||||
|
private:
|
||||||
|
ox::String m_cmd;
|
||||||
|
ox::String m_workingDir{"/"};
|
||||||
|
ox::Vector<ox::String> m_prevCmds;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
@@ -59,7 +59,7 @@ static ox::Error buildUuidMap(Context &ctx, ox::StringViewCR path, DuplicateSet
|
|||||||
auto const [uuid, err] = readUuidHeader(buff);
|
auto const [uuid, err] = readUuidHeader(buff);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
// check for duplication
|
// check for duplication
|
||||||
if (duplicates && ctx.uuidToPath[uuid.toString()].len()) {
|
if (duplicates && ctx.uuidToPath[uuid.toString()].size()) {
|
||||||
auto &dl = (*duplicates)[uuid];
|
auto &dl = (*duplicates)[uuid];
|
||||||
if (dl.empty()) {
|
if (dl.empty()) {
|
||||||
dl.emplace_back(ctx.uuidToPath[uuid.toString()]);
|
dl.emplace_back(ctx.uuidToPath[uuid.toString()]);
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ static ox::Error pack(
|
|||||||
oxOutf("Final ROM buff size: {} bytes\n", romBuff.size());
|
oxOutf("Final ROM buff size: {} bytes\n", romBuff.size());
|
||||||
OX_RETURN_ERROR(writeFileBuff(argRomBin, romBuff));
|
OX_RETURN_ERROR(writeFileBuff(argRomBin, romBuff));
|
||||||
OX_REQUIRE(manifestJson, ox::writeOCString(manifest));
|
OX_REQUIRE(manifestJson, ox::writeOCString(manifest));
|
||||||
OX_RETURN_ERROR(writeFileBuff(argManifest, {manifestJson.data(), manifestJson.len()}));
|
OX_RETURN_ERROR(writeFileBuff(argManifest, {manifestJson.data(), manifestJson.size()}));
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ static std::map<ox::StringView, ox::Error(*)()> tests = {
|
|||||||
constexpr ox::StringView uuidStr = "8d814442-f46e-4cc3-8edc-ca3c01cc86db";
|
constexpr ox::StringView uuidStr = "8d814442-f46e-4cc3-8edc-ca3c01cc86db";
|
||||||
constexpr ox::StringView hdr = "K1;8d814442-f46e-4cc3-8edc-ca3c01cc86db;";
|
constexpr ox::StringView hdr = "K1;8d814442-f46e-4cc3-8edc-ca3c01cc86db;";
|
||||||
OX_REQUIRE(uuid, ox::UUID::fromString(uuidStr));
|
OX_REQUIRE(uuid, ox::UUID::fromString(uuidStr));
|
||||||
ox::Array<char, hdr.len()> buff;
|
ox::Array<char, hdr.size()> buff;
|
||||||
ox::CharBuffWriter bw(buff);
|
ox::CharBuffWriter bw(buff);
|
||||||
OX_RETURN_ERROR(keel::writeUuidHeader(bw, uuid));
|
OX_RETURN_ERROR(keel::writeUuidHeader(bw, uuid));
|
||||||
oxExpect(ox::StringView(buff.data(), buff.size()), hdr);
|
oxExpect(ox::StringView(buff.data(), buff.size()), hdr);
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ void NewMenu::drawLastPageButtons(Context &sctx) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void NewMenu::finish(Context &sctx) noexcept {
|
void NewMenu::finish(Context &sctx) noexcept {
|
||||||
if (m_itemName.len() == 0) {
|
if (m_itemName.size() == 0) {
|
||||||
oxLogError(ox::Error{1, "New file error: no file name"});
|
oxLogError(ox::Error{1, "New file error: no file name"});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ void ProjectExplorer::dirContextMenu(ox::StringViewCR path) const noexcept {
|
|||||||
if (ImGui::MenuItem("Add Directory")) {
|
if (ImGui::MenuItem("Add Directory")) {
|
||||||
addDir.emit(path);
|
addDir.emit(path);
|
||||||
}
|
}
|
||||||
if (path.len() && ImGui::MenuItem("Delete")) {
|
if (path.size() && ImGui::MenuItem("Delete")) {
|
||||||
deleteItem.emit(path);
|
deleteItem.emit(path);
|
||||||
}
|
}
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
|
|||||||
@@ -40,8 +40,8 @@ constexpr ox::Result<ox::StringView> fileExt(ox::StringViewCR path) noexcept {
|
|||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr ox::StringView parentDir(ox::StringView path) noexcept {
|
constexpr ox::StringView parentDir(ox::StringView path) noexcept {
|
||||||
if (path.len() && path[path.len() - 1] == '/') {
|
if (path.size() && path[path.size() - 1] == '/') {
|
||||||
path = substr(path, 0, path.len() - 1);
|
path = substr(path, 0, path.size() - 1);
|
||||||
}
|
}
|
||||||
auto const extStart = ox::find(path.crbegin(), path.crend(), '/').offset();
|
auto const extStart = ox::find(path.crbegin(), path.crend(), '/').offset();
|
||||||
return substr(path, 0, extStart);
|
return substr(path, 0, extStart);
|
||||||
|
|||||||
@@ -13,10 +13,10 @@ namespace studio {
|
|||||||
|
|
||||||
FDFilterItem::FDFilterItem(ox::StringViewCR pName, ox::StringViewCR pSpec) noexcept {
|
FDFilterItem::FDFilterItem(ox::StringViewCR pName, ox::StringViewCR pSpec) noexcept {
|
||||||
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
name.resize(pName.len() + 1);
|
name.resize(pName.size() + 1);
|
||||||
ox::strncpy(name.data(), pName.data(), pName.len());
|
ox::strncpy(name.data(), pName.data(), pName.size());
|
||||||
spec.resize(pSpec.len() + 1);
|
spec.resize(pSpec.size() + 1);
|
||||||
ox::strncpy(spec.data(), pSpec.data(), pSpec.len());
|
ox::strncpy(spec.data(), pSpec.data(), pSpec.size());
|
||||||
OX_ALLOW_UNSAFE_BUFFERS_END
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user