diff --git a/src/ox/fs/CMakeLists.txt b/src/ox/fs/CMakeLists.txt index 8d8b2f182..cf9a16734 100644 --- a/src/ox/fs/CMakeLists.txt +++ b/src/ox/fs/CMakeLists.txt @@ -1,6 +1,8 @@ add_library( OxFS + ptrarith/nodebuffer.hpp + ptrarith/ptr.hpp filestore/filestoretemplate.cpp filesystem/filelocation.cpp filesystem/pathiterator.cpp diff --git a/src/ox/fs/filestore/filestoretemplate.hpp b/src/ox/fs/filestore/filestoretemplate.hpp index dcb834ad0..398f3af4b 100644 --- a/src/ox/fs/filestore/filestoretemplate.hpp +++ b/src/ox/fs/filestore/filestoretemplate.hpp @@ -75,25 +75,25 @@ class FileStoreTemplate { public: FileStoreTemplate() = default; - FileStoreTemplate(void *buff, size_t buffSize); + FileStoreTemplate(void *buff, std::size_t buffSize); - static Error format(void *buffer, size_t bufferSize); + static Error format(void *buffer, std::size_t bufferSize); - Error setSize(InodeId_t buffSize); + Error setSize(std::size_t buffSize); - Error incLinks(InodeId_t id); + Error incLinks(uint64_t id); - Error decLinks(InodeId_t id); + Error decLinks(uint64_t id); - Error write(InodeId_t id, const void *data, FsSize_t dataSize, uint8_t fileType = 0); + Error write(uint64_t id64, const void *data, FsSize_t dataSize, uint8_t fileType = 0); - Error remove(InodeId_t id); + Error remove(uint64_t id); - Error read(InodeId_t id, void *out, FsSize_t outSize, FsSize_t *size = nullptr) const; + Error read(uint64_t id, void *out, FsSize_t outSize, FsSize_t *size = nullptr) const; - Error read(InodeId_t id, FsSize_t readStart, FsSize_t readSize, void *data, FsSize_t *size = nullptr) const; + Error read(uint64_t id, FsSize_t readStart, FsSize_t readSize, void *data, FsSize_t *size = nullptr) const; - ptrarith::Ptr read(InodeId_t id) const; + ptrarith::Ptr read(uint64_t id) const; /** * Reads the "file" at the given id. You are responsible for freeing @@ -106,11 +106,11 @@ class FileStoreTemplate { * @return 0 if read is a success */ template - Error read(InodeId_t id, FsSize_t readStart, + Error read(uint64_t id, FsSize_t readStart, FsSize_t readSize, T *data, FsSize_t *size) const; - Result stat(InodeId_t id) const; + Result stat(uint64_t id) const; Error resize(); @@ -185,23 +185,23 @@ class FileStoreTemplate { */ ItemPtr rootInode(); - bool canWrite(ItemPtr existing, size_t size); + bool canWrite(ItemPtr existing, std::size_t size); }; template -FileStoreTemplate::FileStoreTemplate(void *buff, size_t buffSize) { - m_buffSize = buffSize; +FileStoreTemplate::FileStoreTemplate(void *buff, std::size_t buffSize) { + m_buffSize = static_cast(buffSize); m_buffer = reinterpret_cast>*>(buff); - if (!m_buffer->valid(buffSize)) { + if (!m_buffer->valid(m_buffSize)) { m_buffSize = 0; m_buffer = nullptr; } } template -Error FileStoreTemplate::format(void *buffer, size_t bufferSize) { - auto nb = new (buffer) Buffer(bufferSize); +Error FileStoreTemplate::format(void *buffer, std::size_t bufferSize) { + auto nb = new (buffer) Buffer(static_cast(bufferSize)); auto fsData = nb->malloc(sizeof(FileStoreData)).value; if (!fsData.valid()) { oxTrace("ox::fs::FileStoreTemplate::format::fail", "Could not read data section of FileStoreData"); @@ -213,27 +213,27 @@ Error FileStoreTemplate::format(void *buffer, size_t bufferSize) { return OxError(1, "Could not read data section of FileStoreData"); } new (data) FileStoreData; - return OxError(0); + return {}; } template -Error FileStoreTemplate::setSize(InodeId_t size) { +Error FileStoreTemplate::setSize(std::size_t size) { if (m_buffSize >= size) { - return m_buffer->setSize(size); + return m_buffer->setSize(static_cast(size)); } return OxError(1); } template -Error FileStoreTemplate::incLinks(InodeId_t id) { - oxRequireM(item, find(id).validate()); +Error FileStoreTemplate::incLinks(uint64_t id) { + oxRequireM(item, find(static_cast(id)).validate()); item->links++; return OxError(0); } template -Error FileStoreTemplate::decLinks(InodeId_t id) { - oxRequireM(item, find(id).validate()); +Error FileStoreTemplate::decLinks(uint64_t id) { + oxRequireM(item, find(static_cast(id)).validate()); item->links--; if (item->links == 0) { oxReturnError(remove(item)); @@ -242,7 +242,8 @@ Error FileStoreTemplate::decLinks(InodeId_t id) { } template -Error FileStoreTemplate::write(InodeId_t id, const void *data, FsSize_t dataSize, uint8_t fileType) { +Error FileStoreTemplate::write(uint64_t id64, const void *data, FsSize_t dataSize, uint8_t fileType) { + const auto id = static_cast(id64); oxTracef("ox::fs::FileStoreTemplate::write", "Attempting to write to inode {}", id); auto existing = find(id); if (!canWrite(existing, dataSize)) { @@ -308,14 +309,14 @@ Error FileStoreTemplate::write(InodeId_t id, const void *data, FsSize_t } template -Error FileStoreTemplate::remove(InodeId_t id) { - return remove(find(id)); +Error FileStoreTemplate::remove(uint64_t id) { + return remove(find(static_cast(id))); } template -Error FileStoreTemplate::read(InodeId_t id, void *out, FsSize_t outSize, FsSize_t *size) const { +Error FileStoreTemplate::read(uint64_t id, void *out, FsSize_t outSize, FsSize_t *size) const { oxTracef("ox::fs::FileStoreTemplate::read", "Attempting to read from inode {}", id); - auto src = find(id); + auto src = find(static_cast(id)); // error check if (!src.valid()) { oxTracef("ox::fs::FileStoreTemplate::read::fail", "Could not find requested item: {}", id); @@ -344,9 +345,9 @@ Error FileStoreTemplate::read(InodeId_t id, void *out, FsSize_t outSize, } template -Error FileStoreTemplate::read(InodeId_t id, FsSize_t readStart, FsSize_t readSize, void *out, FsSize_t *size) const { +Error FileStoreTemplate::read(uint64_t id, FsSize_t readStart, FsSize_t readSize, void *out, FsSize_t *size) const { oxTracef("ox::fs::FileStoreTemplate::read", "Attempting to read from inode {}", id); - auto src = find(id); + auto src = find(static_cast(id)); // error check if (!src.valid()) { oxTracef("ox::fs::FileStoreTemplate::read::fail", "Could not find requested item: {}", id); @@ -376,10 +377,10 @@ Error FileStoreTemplate::read(InodeId_t id, FsSize_t readStart, FsSize_t template template -Error FileStoreTemplate::read(InodeId_t id, FsSize_t readStart, +Error FileStoreTemplate::read(uint64_t id, FsSize_t readStart, FsSize_t readSize, T *out, FsSize_t *size) const { oxTracef("ox::fs::FileStoreTemplate::read", "Attempting to read from inode {}", id); - auto src = find(id); + auto src = find(static_cast(id)); // error check if (!src.valid()) { oxTracef("ox::fs::FileStoreTemplate::read::fail", "Could not find requested item: {}", id); @@ -408,8 +409,8 @@ Error FileStoreTemplate::read(InodeId_t id, FsSize_t readStart, } template -ptrarith::Ptr FileStoreTemplate::read(InodeId_t id) const { - auto item = find(id); +ptrarith::Ptr FileStoreTemplate::read(uint64_t id) const { + auto item = find(static_cast(id)); if (item.valid()) { return item->data(); } else { @@ -432,17 +433,17 @@ Error FileStoreTemplate::resize(std::size_t size, void *newBuff) { if (m_buffer->size() > size) { return OxError(1); } - m_buffSize = size; + m_buffSize = static_cast(size); if (newBuff) { m_buffer = reinterpret_cast(newBuff); - oxReturnError(m_buffer->setSize(size)); + oxReturnError(m_buffer->setSize(static_cast(size))); } return OxError(0); } template -Result FileStoreTemplate::stat(InodeId_t id) const { - oxRequire(inode, find(id).validate()); +Result FileStoreTemplate::stat(uint64_t id) const { + oxRequire(inode, find(static_cast(id)).validate()); return StatInfo { id, inode->links, @@ -486,8 +487,8 @@ Result::InodeId_t> FileStoreTemplate: return OxError(1); } for (auto i = 0; i < 100; i++) { - auto inode = fsData->random.gen() % MaxValue; - if (inode > ReservedInodeEnd && !find(inode).valid()) { + auto inode = static_cast::InodeId_t>(fsData->random.gen() % MaxValue); + if (inode > ReservedInodeEnd && !find(static_cast(inode)).valid()) { return inode; } } @@ -511,7 +512,7 @@ Error FileStoreTemplate::compact() { if (fsData && oldAddr == fsData->rootNode) { fsData->rootNode = item.offset(); } - auto parent = findParent(rootInode(), item->id, oldAddr); + auto parent = findParent(rootInode(), item->id, static_cast(oldAddr)); oxAssert(parent.valid() || rootInode() == item.offset(), "Parent inode not found for item that should have parent."); if (parent.valid()) { @@ -753,8 +754,9 @@ typename FileStoreTemplate::ItemPtr FileStoreTemplate::rootInode } template -bool FileStoreTemplate::canWrite(ItemPtr existing, size_t size) { - return existing.size() >= size || m_buffer->spaceNeeded(size) <= m_buffer->available(); +bool FileStoreTemplate::canWrite(ItemPtr existing, std::size_t size) { + const auto sz = static_cast(size); + return existing.size() >= sz || m_buffer->spaceNeeded(sz) <= m_buffer->available(); } template diff --git a/src/ox/fs/filesystem/directory.hpp b/src/ox/fs/filesystem/directory.hpp index 96ed5d0f6..2ff3c8239 100644 --- a/src/ox/fs/filesystem/directory.hpp +++ b/src/ox/fs/filesystem/directory.hpp @@ -72,7 +72,7 @@ struct OX_PACKED DirectoryEntry { return fullSize() - sizeof(*this); } - void setSize(InodeId_t) { + void setSize(std::size_t) { // ignore set value } @@ -94,9 +94,9 @@ class Directory { FileStore m_fs; public: - Directory() = default; + Directory() noexcept = default; - Directory(FileStore fs, InodeId_t inode); + Directory(FileStore fs, uint64_t inode) noexcept; /** * Initializes Directory. @@ -108,24 +108,26 @@ class Directory { /** * @param parents indicates the operation should create non-existent directories in the path, like mkdir -p */ - Error write(PathIterator path, InodeId_t inode, FileName *nameBuff = nullptr) noexcept; + Error write(PathIterator path, uint64_t inode64, FileName *nameBuff = nullptr) noexcept; Error remove(PathIterator path, FileName *nameBuff = nullptr) noexcept; template Error ls(F cb) noexcept; + [[nodiscard]] Result findEntry(const FileName &name) const noexcept; + [[nodiscard]] Result find(PathIterator name, FileName *nameBuff = nullptr) const noexcept; }; template -Directory::Directory(FileStore fs, InodeId_t inodeId) { +Directory::Directory(FileStore fs, uint64_t inodeId) noexcept { m_fs = fs; - m_inodeId = inodeId; - auto buff = m_fs.read(inodeId).template to(); + m_inodeId = static_cast(inodeId); + auto buff = m_fs.read(static_cast(inodeId)).template to(); if (buff.valid()) { m_size = buff.size(); } @@ -192,7 +194,8 @@ Error Directory::mkdir(PathIterator path, bool parents, Fi } template -Error Directory::write(PathIterator path, InodeId_t inode, FileName *nameBuff) noexcept { +Error Directory::write(PathIterator path, uint64_t inode64, FileName *nameBuff) noexcept { + const auto inode = static_cast(inode64); // reuse nameBuff if it has already been allocated, as it is a rather large variable if (nameBuff == nullptr) { nameBuff = new (ox_alloca(sizeof(FileName))) FileName; diff --git a/src/ox/fs/ptrarith/nodebuffer.hpp b/src/ox/fs/ptrarith/nodebuffer.hpp index fca2e74c8..bb7eb9c95 100644 --- a/src/ox/fs/ptrarith/nodebuffer.hpp +++ b/src/ox/fs/ptrarith/nodebuffer.hpp @@ -25,7 +25,7 @@ class OX_PACKED NodeBuffer { LittleEndian firstItem = 0; }; - using ItemPtr = Ptr; + using ItemPtr = Ptr; class Iterator { private: @@ -97,9 +97,9 @@ class OX_PACKED NodeBuffer { Header m_header; public: - NodeBuffer(const NodeBuffer &other, size_t size) noexcept; + NodeBuffer(const NodeBuffer &other, std::size_t size) noexcept; - explicit NodeBuffer(size_t size) noexcept; + explicit NodeBuffer(std::size_t size) noexcept; [[nodiscard]] const Iterator iterator() const noexcept; @@ -129,7 +129,7 @@ class OX_PACKED NodeBuffer { ItemPtr ptr(size_t offset) noexcept; - Result malloc(size_t size) noexcept; + Result malloc(std::size_t size) noexcept; Error free(ItemPtr item) noexcept; @@ -139,7 +139,7 @@ class OX_PACKED NodeBuffer { /** * Set size, capacity. */ - Error setSize(size_t size) noexcept; + Error setSize(std::size_t size) noexcept; /** * Get size, capacity. @@ -159,7 +159,7 @@ class OX_PACKED NodeBuffer { * bytes */ [[nodiscard]] - static size_t spaceNeeded(size_t size) noexcept; + static size_t spaceNeeded(std::size_t size) noexcept; template Error compact(F cb = [](uint64_t, ItemPtr) {}) noexcept; @@ -171,14 +171,14 @@ class OX_PACKED NodeBuffer { }; template -NodeBuffer::NodeBuffer(size_t size) noexcept { - m_header.size = size; +NodeBuffer::NodeBuffer(std::size_t size) noexcept { + m_header.size = static_cast(size); ox_memset(this + 1, 0, size - sizeof(*this)); oxTrace("ox::NodeBuffer::constructor") << m_header.firstItem; } template -NodeBuffer::NodeBuffer(const NodeBuffer &other, size_t size) noexcept { +NodeBuffer::NodeBuffer(const NodeBuffer &other, std::size_t size) noexcept { oxTracef("ox::ptrarith::NodeBuffer::copy", "other.m_header.firstItem: {}", other.m_header.firstItem.get()); ox_memset(this + 1, 0, size - sizeof(*this)); ox_memcpy(this, &other, size); @@ -265,9 +265,10 @@ typename NodeBuffer::ItemPtr NodeBuffer::ptr(size_t } template -Result::ItemPtr> NodeBuffer::malloc(size_t size) noexcept { - oxTracef("ox::ptrarith::NodeBuffer::malloc", "Size: {}", size); - size_t fullSize = size + sizeof(Item); +Result::ItemPtr> NodeBuffer::malloc(std::size_t size) noexcept { + const auto sz = static_cast(size); + oxTracef("ox::ptrarith::NodeBuffer::malloc", "Size: {}", sz); + size_t fullSize = static_cast(sz + sizeof(Item)); if (m_header.size - m_header.bytesUsed >= fullSize) { auto last = lastItem(); size_t addr; @@ -277,7 +278,7 @@ Result::ItemPtr> NodeBuffer::mal // there is no first item, so this must be the first item if (!m_header.firstItem) { oxTrace("ox::ptrarith::NodeBuffer::malloc", "No first item, initializing."); - m_header.firstItem = sizeof(m_header); + m_header.firstItem = static_cast(sizeof(m_header)); addr = m_header.firstItem; } else { oxTrace("ox::ptrarith::NodeBuffer::malloc::fail", "NodeBuffer is in invalid state."); @@ -292,7 +293,7 @@ Result::ItemPtr> NodeBuffer::mal } ox_memset(out, 0, fullSize); new (out) Item; - out->setSize(size); + out->setSize(sz); auto first = firstItem(); auto oldLast = last; @@ -355,7 +356,7 @@ Error NodeBuffer::free(ItemPtr item) noexcept { } template -Error NodeBuffer::setSize(size_t size) noexcept { +Error NodeBuffer::setSize(std::size_t size) noexcept { oxTracef("ox::ptrarith::NodeBuffer::setSize", "{} to {}", m_header.size.get(), size); auto last = lastItem(); auto end = last.valid() ? last.end() : sizeof(m_header); @@ -364,7 +365,7 @@ Error NodeBuffer::setSize(size_t size) noexcept { // resizing to less than buffer size return OxError(1); } else { - m_header.size = size; + m_header.size = static_cast(size); auto data = reinterpret_cast(this) + end; ox_memset(data, 0, size - end); return OxError(0); @@ -387,8 +388,8 @@ size_t NodeBuffer::available() const noexcept { } template -size_t NodeBuffer::spaceNeeded(size_t size) noexcept { - return sizeof(Item) + size; +size_t NodeBuffer::spaceNeeded(std::size_t size) noexcept { + return static_cast(sizeof(Item) + size); } template @@ -442,8 +443,8 @@ struct OX_PACKED Item { return m_size; } - void setSize(size_t size) { - m_size = size; + void setSize(std::size_t size) { + m_size = static_cast(size); } }; diff --git a/src/ox/fs/ptrarith/ptr.hpp b/src/ox/fs/ptrarith/ptr.hpp index 694461b5a..8bbb00089 100644 --- a/src/ox/fs/ptrarith/ptr.hpp +++ b/src/ox/fs/ptrarith/ptr.hpp @@ -29,7 +29,13 @@ class [[nodiscard]] Ptr { constexpr Ptr(std::nullptr_t) noexcept; - constexpr Ptr(void *dataStart, size_t dataSize, size_t itemStart, size_t itemSize = sizeof(T), size_t itemTypeSize = sizeof(T), bool prevalidated = false) noexcept; + constexpr Ptr( + void *pDataStart, + std::size_t pDataSize, + std::size_t pItemStart, + std::size_t pItemSize = sizeof(T), + std::size_t pItemTypeSize = sizeof(T), + bool pPrevalidated = false) noexcept; [[nodiscard]] constexpr bool valid() const noexcept; @@ -86,17 +92,27 @@ constexpr Ptr::Ptr(std::nullptr_t) noexcept { } template -constexpr Ptr::Ptr(void *dataStart, size_t dataSize, size_t itemStart, size_t itemSize, size_t itemTypeSize, bool prevalidated) noexcept { +constexpr Ptr::Ptr( + void *pDataStart, + std::size_t pDataSize, + std::size_t pItemStart, + std::size_t pItemSize, + std::size_t pItemTypeSize, + bool pPrevalidated) noexcept { + const auto dataSize = static_cast(pDataSize); + const auto itemStart = static_cast(pItemStart); + const auto itemSize = static_cast(pItemSize); + const auto itemTypeSize = static_cast(pItemTypeSize); // do some sanity checks before assuming this is valid if (itemSize >= itemTypeSize && - dataStart && + pDataStart && itemStart >= minOffset && itemStart + itemSize <= dataSize) { - m_dataStart = reinterpret_cast(dataStart); + m_dataStart = reinterpret_cast(pDataStart); m_dataSize = dataSize; m_itemOffset = itemStart; m_itemSize = itemSize; - m_validated = prevalidated; + m_validated = pPrevalidated; } } diff --git a/src/ox/mc/read.hpp b/src/ox/mc/read.hpp index fdf76fb2d..3b223477f 100644 --- a/src/ox/mc/read.hpp +++ b/src/ox/mc/read.hpp @@ -565,7 +565,7 @@ template [[nodiscard]] constexpr int MetalClawReaderTemplate::whichFieldPresent(const char*, const ModelUnion &u) const noexcept { FieldBitmapReader p(m_buff + m_buffIt, m_buffLen - m_buffIt); - p.setFields(u.fieldCount()); + p.setFields(static_cast(u.fieldCount())); for (auto i = 0u; i < u.fieldCount(); ++i) { if (p.get(i)) { return static_cast(i); diff --git a/src/ox/oc/read.hpp b/src/ox/oc/read.hpp index 14ab6ea6d..cb7d823c5 100644 --- a/src/ox/oc/read.hpp +++ b/src/ox/oc/read.hpp @@ -205,7 +205,7 @@ Error OrganicClawReader::field(const char *key, BasicString *val) noexcept { template Error OrganicClawReader::field(const char *key, BString *val) noexcept { - return field(key, SerStr(val->data(), val->cap())); + return field(key, SerStr(val->data(), static_cast(val->cap()))); } // array handler