diff --git a/src/ox/fs/filestore.hpp b/src/ox/fs/filestore.hpp index c33b2bd41..63093c0dc 100644 --- a/src/ox/fs/filestore.hpp +++ b/src/ox/fs/filestore.hpp @@ -24,33 +24,33 @@ struct FileStoreHeader { FsSize_t rootInode; }; -template +template class FileStore { public: typedef uint16_t InodeId_t; - typedef FsT FsSize_t; + typedef typename Header::FsSize_t FsSize_t; const static auto VERSION = Header::VERSION; struct StatInfo { InodeId_t inodeId; - FsSize_t size; + typename Header::FsSize_t size; uint8_t fileType; }; private: struct Inode { // the next Inode in memory - FsSize_t prev, next; - FsSize_t dataLen; + typename Header::FsSize_t prev, next; + typename Header::FsSize_t dataLen; InodeId_t id; uint8_t refs; uint8_t fileType; - FsSize_t left, right; + typename Header::FsSize_t left, right; - FsSize_t size(); + typename Header::FsSize_t size(); void setId(InodeId_t); - void setData(void *data, FsSize_t size); + void setData(void *data, typename Header::FsSize_t size); void *data(); }; @@ -60,7 +60,7 @@ class FileStore { /** * Dumps this file store's inodes to the given file store. */ - int dumpTo(FileStore *dest); + int dumpTo(FileStore
*dest); /** * Compacts and resizes the file store to the minimum possible size for @@ -68,7 +68,7 @@ class FileStore { * * NOTE: This does NOT resize the buffer that this file store refers to! */ - void resize(FsSize_t size = 0); + void resize(typename Header::FsSize_t size = 0); /** * Writes the given data to a "file" with the given id. @@ -76,7 +76,7 @@ class FileStore { * @param data the contents of the file * @param dataLen the number of bytes data points to */ - int write(InodeId_t id, void *data, FsSize_t dataLen, uint8_t fileType = 0); + int write(InodeId_t id, void *data, typename Header::FsSize_t dataLen, uint8_t fileType = 0); /** * Removes the inode of the given ID. @@ -92,7 +92,7 @@ class FileStore { * @param size pointer to a value that will be assigned the size of data * @return 0 if read is a success */ - int read(InodeId_t id, void *data, FsSize_t *size); + int read(InodeId_t id, void *data, typename Header::FsSize_t *size); /** * Reads the stat information of the inode of the given inode id. @@ -108,25 +108,25 @@ class FileStore { * @param size the size of the data to insert * @return the space currently available in this file store. */ - FsSize_t spaceNeeded(InodeId_t id, FsSize_t size); + typename Header::FsSize_t spaceNeeded(InodeId_t id, typename Header::FsSize_t size); /** * Returns the size of the file store. * @return the size of the file store. */ - FsSize_t size(); + typename Header::FsSize_t size(); /** * Returns the space currently available in this file store. * @return the space currently available in this file store. */ - FsSize_t available(); + typename Header::FsSize_t available(); uint16_t fsType(); uint16_t version(); - static uint8_t *format(uint8_t *buffer, FsSize_t size, uint16_t fsType = 0); + static uint8_t *format(uint8_t *buffer, typename Header::FsSize_t size, uint16_t fsType = 0); private: /** @@ -146,7 +146,7 @@ class FileStore { * @param targetAddr the address of the target inode * @return the requested Inode, if available */ - Inode *getInodeParent(Inode *root, InodeId_t id, FsSize_t targetAddr); + Inode *getInodeParent(Inode *root, InodeId_t id, typename Header::FsSize_t targetAddr); /** * Removes the inode of the given ID. @@ -164,13 +164,13 @@ class FileStore { * Gets the address of the next available inode, assuming there is a next * available inode. */ - FsSize_t nextInodeAddr(); + typename Header::FsSize_t nextInodeAddr(); /** * Gets an address for a new Inode. * @param size the size of the Inode */ - void *alloc(FsSize_t size); + void *alloc(typename Header::FsSize_t size); /** * Compacts all of the inodes into a contiguous space, starting at the first inode. @@ -188,16 +188,16 @@ class FileStore { * Gets the FsSize_t associated with the next Inode to be allocated. * @retrun the FsSize_t associated with the next Inode to be allocated */ - FsSize_t iterator(); + typename Header::FsSize_t iterator(); - FsSize_t firstInode(); + typename Header::FsSize_t firstInode(); Inode *lastInode(); /** * Updates the address of the inode in the tree. */ - void updateInodeAddress(InodeId_t id, FsSize_t oldAddr, FsSize_t newAddr); + void updateInodeAddress(InodeId_t id, typename Header::FsSize_t oldAddr, typename Header::FsSize_t newAddr); uint8_t *begin() { return (uint8_t*) this; @@ -210,45 +210,45 @@ class FileStore { /** * Converts an actual pointer to a FsSize_t. */ - FsSize_t ptr(void *ptr); + typename Header::FsSize_t ptr(void *ptr); /** * Converts a FsSize_t to an actual pointer. */ template - T ptr(FsSize_t ptr) { + T ptr(typename Header::FsSize_t ptr) { return (T) (begin() + ptr); }; }; -template -FsSize_t FileStore::Inode::size() { +template +typename Header::FsSize_t FileStore
::Inode::size() { return sizeof(Inode) + dataLen; } -template -void FileStore::Inode::setId(InodeId_t id) { +template +void FileStore
::Inode::setId(InodeId_t id) { this->id = id; } -template -void FileStore::Inode::setData(void *data, FsSize_t size) { +template +void FileStore
::Inode::setData(void *data, typename Header::FsSize_t size) { ox_memcpy(this->data(), data, size); dataLen = size; } -template -void *FileStore::Inode::data() { +template +void *FileStore
::Inode::data() { return this + 1; } // FileStore -template -int FileStore::dumpTo(FileStore *dest) { +template +int FileStore
::dumpTo(FileStore
*dest) { if (dest->size() >= size()) { auto i = ptr(firstInode()); do { @@ -261,8 +261,8 @@ int FileStore::dumpTo(FileStore *dest) { } } -template -void FileStore::resize(FsSize_t size) { +template +void FileStore
::resize(typename Header::FsSize_t size) { if (size < m_header.size) { // shrink file store if (m_header.memUsed > size) { @@ -276,10 +276,10 @@ void FileStore::resize(FsSize_t size) { } } -template -int FileStore::write(InodeId_t id, void *data, FsSize_t dataLen, uint8_t fileType) { +template +int FileStore
::write(InodeId_t id, void *data, typename Header::FsSize_t dataLen, uint8_t fileType) { auto retval = 1; - const FsSize_t size = sizeof(Inode) + dataLen; + const typename Header::FsSize_t size = sizeof(Inode) + dataLen; if (size <= (m_header.size - m_header.memUsed)) { auto inode = (Inode*) alloc(size); if (inode) { @@ -296,13 +296,13 @@ int FileStore::write(InodeId_t id, void *data, FsSize_t dataLe return retval; } -template -int FileStore::remove(InodeId_t id) { +template +int FileStore
::remove(InodeId_t id) { return remove(ptr(m_header.rootInode), id); } -template -int FileStore::remove(Inode *root, InodeId_t id) { +template +int FileStore
::remove(Inode *root, InodeId_t id) { auto err = 1; if (root->id > id) { @@ -360,8 +360,8 @@ int FileStore::remove(Inode *root, InodeId_t id) { return err; } -template -void FileStore::dealloc(Inode *inode) { +template +void FileStore
::dealloc(Inode *inode) { auto next = ptr(inode->next); auto prev = ptr(inode->prev); prev->next = ptr(next); @@ -372,8 +372,8 @@ void FileStore::dealloc(Inode *inode) { ox_memset(inode, 0, inode->size()); } -template -void FileStore::updateInodeAddress(InodeId_t id, FsSize_t oldAddr, FsSize_t newAddr) { +template +void FileStore
::updateInodeAddress(InodeId_t id, typename Header::FsSize_t oldAddr, typename Header::FsSize_t newAddr) { auto parent = getInodeParent(ptr(m_header.rootInode), id, oldAddr); if (parent) { if (parent->left == oldAddr) { @@ -384,8 +384,8 @@ void FileStore::updateInodeAddress(InodeId_t id, FsSize_t oldA } } -template -int FileStore::read(InodeId_t id, void *data, FsSize_t *size) { +template +int FileStore
::read(InodeId_t id, void *data, typename Header::FsSize_t *size) { auto inode = getInode(ptr(m_header.rootInode), id); int retval = 1; if (inode) { @@ -398,8 +398,8 @@ int FileStore::read(InodeId_t id, void *data, FsSize_t *size) return retval; } -template -typename FileStore::StatInfo FileStore::stat(InodeId_t id) { +template +typename FileStore
::StatInfo FileStore
::stat(InodeId_t id) { auto inode = getInode(ptr(m_header.rootInode), id); StatInfo stat; if (inode) { @@ -412,9 +412,9 @@ typename FileStore::StatInfo FileStore::stat return stat; } -template -FsSize_t FileStore::spaceNeeded(InodeId_t id, FsSize_t size) { - FsSize_t needed = sizeof(Inode) + size;; +template +typename Header::FsSize_t FileStore
::spaceNeeded(InodeId_t id, typename Header::FsSize_t size) { + typename Header::FsSize_t needed = sizeof(Inode) + size;; auto inode = getInode(ptr(m_header.rootInode), id); if (inode) { needed -= inode->size(); @@ -422,18 +422,18 @@ FsSize_t FileStore::spaceNeeded(InodeId_t id, FsSize_t size) { return needed; } -template -FsSize_t FileStore::size() { +template +typename Header::FsSize_t FileStore
::size() { return m_header.size; } -template -FsSize_t FileStore::available() { +template +typename Header::FsSize_t FileStore
::available() { return m_header.size - m_header.memUsed; } -template -typename FileStore::Inode *FileStore::getInode(Inode *root, InodeId_t id) { +template +typename FileStore
::Inode *FileStore
::getInode(Inode *root, InodeId_t id) { Inode *retval = nullptr; if (root->id > id) { @@ -451,8 +451,8 @@ typename FileStore::Inode *FileStore::getIno return retval; } -template -typename FileStore::Inode *FileStore::getInodeParent(Inode *root, InodeId_t id, FsSize_t targetAddr) { +template +typename FileStore
::Inode *FileStore
::getInodeParent(Inode *root, InodeId_t id, typename Header::FsSize_t targetAddr) { Inode *retval = nullptr; if (root->id > id) { @@ -476,15 +476,15 @@ typename FileStore::Inode *FileStore::getIno return retval; } -template -FsSize_t FileStore::nextInodeAddr() { - FsSize_t next = ptr(lastInode()) + lastInode()->size(); +template +typename Header::FsSize_t FileStore
::nextInodeAddr() { + typename Header::FsSize_t next = ptr(lastInode()) + lastInode()->size(); return next; } -template -void *FileStore::alloc(FsSize_t size) { - FsSize_t next = nextInodeAddr(); +template +void *FileStore
::alloc(typename Header::FsSize_t size) { + typename Header::FsSize_t next = nextInodeAddr(); if ((next + size) > (uint64_t) end()) { compact(); next = nextInodeAddr(); @@ -503,8 +503,8 @@ void *FileStore::alloc(FsSize_t size) { return inode; } -template -void FileStore::compact() { +template +void FileStore
::compact() { auto dest = ptr(firstInode()); auto current = ptr(firstInode()); while (current->next > firstInode() && current->next < ptr(end())) { @@ -519,8 +519,8 @@ void FileStore::compact() { } } -template -bool FileStore::insert(Inode *root, Inode *insertValue) { +template +bool FileStore
::insert(Inode *root, Inode *insertValue) { auto retval = false; if (root->id > insertValue->id) { @@ -545,13 +545,13 @@ bool FileStore::insert(Inode *root, Inode *insertValue) { return retval; } -template -FsSize_t FileStore::iterator() { +template +typename Header::FsSize_t FileStore
::iterator() { return ptr(lastInode()) + lastInode()->size(); } -template -FsSize_t FileStore::ptr(void *ptr) { +template +typename Header::FsSize_t FileStore
::ptr(void *ptr) { #ifdef _MSC_VER #pragma warning(disable:4244) #endif @@ -561,45 +561,45 @@ FsSize_t FileStore::ptr(void *ptr) { #endif } -template -FsSize_t FileStore::firstInode() { - return sizeof(FileStore); +template +typename Header::FsSize_t FileStore
::firstInode() { + return sizeof(FileStore
); } -template -typename FileStore::Inode *FileStore::lastInode() { +template +typename FileStore
::Inode *FileStore
::lastInode() { return ptr(ptr(firstInode())->prev); } -template -uint16_t FileStore::fsType() { +template +uint16_t FileStore
::fsType() { return m_header.fsType; }; -template -uint16_t FileStore::version() { +template +uint16_t FileStore
::version() { return m_header.version; }; -template -uint8_t *FileStore::format(uint8_t *buffer, FsSize_t size, uint16_t fsType) { +template +uint8_t *FileStore
::format(uint8_t *buffer, typename Header::FsSize_t size, uint16_t fsType) { ox_memset(buffer, 0, size); auto *fs = (FileStore*) buffer; fs->m_header.fsType = fsType; fs->m_header.version = Header::VERSION; fs->m_header.size = size; - fs->m_header.memUsed = sizeof(FileStore) + sizeof(Inode); - fs->m_header.rootInode = sizeof(FileStore); - ((Inode*) (fs + 1))->prev = sizeof(FileStore); - fs->lastInode()->next = sizeof(FileStore); + fs->m_header.memUsed = sizeof(FileStore
) + sizeof(Inode); + fs->m_header.rootInode = sizeof(FileStore
); + ((Inode*) (fs + 1))->prev = sizeof(FileStore
); + fs->lastInode()->next = sizeof(FileStore
); return (uint8_t*) buffer; } -typedef FileStore> FileStore16; -typedef FileStore> FileStore32; -typedef FileStore> FileStore64; +typedef FileStore> FileStore16; +typedef FileStore> FileStore32; +typedef FileStore> FileStore64; } }