Fix to pass FileStore::readWrite test for new FileStore
This commit is contained in:
parent
db7eb9a397
commit
9d70927ad4
6
deps/ox/CMakeLists.txt
vendored
6
deps/ox/CMakeLists.txt
vendored
@ -41,10 +41,8 @@ if(NOT MSVC)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
|
||||
endif()
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||
# forces colored output when using ninja
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color")
|
||||
endif()
|
||||
# forces colored output when using ninja
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color")
|
||||
endif()
|
||||
|
||||
enable_testing()
|
||||
|
1
deps/ox/src/ox/CMakeLists.txt
vendored
1
deps/ox/src/ox/CMakeLists.txt
vendored
@ -1,5 +1,6 @@
|
||||
cmake_minimum_required(VERSION 2.8)
|
||||
|
||||
add_subdirectory(__buildinfo)
|
||||
if(OX_USE_STDLIB STREQUAL "ON")
|
||||
add_subdirectory(clargs)
|
||||
endif(OX_USE_STDLIB STREQUAL "ON")
|
||||
|
@ -45,7 +45,7 @@ class FileStoreTemplate: public FileStore {
|
||||
using Buffer = ox::fs::NodeBuffer<size_t, FileStoreItem<size_t>>;
|
||||
|
||||
struct __attribute__((packed)) FileStoreData {
|
||||
ox::LittleEndian<size_t> rootNode = sizeof(NodeBuffer<size_t, FileStoreItem<size_t>>);
|
||||
ox::LittleEndian<size_t> rootNode;
|
||||
};
|
||||
|
||||
size_t m_buffSize = 0;
|
||||
@ -83,7 +83,7 @@ class FileStoreTemplate: public FileStore {
|
||||
* Places the given Item at the given ID. If it already exists, the
|
||||
* existing value will be overwritten.
|
||||
*/
|
||||
Error placeItem(ItemPtr root, ItemPtr item);
|
||||
Error placeItem(ItemPtr root, ItemPtr item, int depth = 0);
|
||||
|
||||
/**
|
||||
* Finds the parent an inode by its ID.
|
||||
@ -93,12 +93,12 @@ class FileStoreTemplate: public FileStore {
|
||||
/**
|
||||
* Finds an inode by its ID.
|
||||
*/
|
||||
ItemPtr find(ItemPtr ptr, size_t id);
|
||||
ItemPtr find(ItemPtr item, InodeId_t id, int depth = 0);
|
||||
|
||||
/**
|
||||
* Finds an inode by its ID.
|
||||
*/
|
||||
ItemPtr find(size_t id);
|
||||
ItemPtr find(InodeId_t id);
|
||||
|
||||
/**
|
||||
* Gets the root inode.
|
||||
@ -183,8 +183,10 @@ Error FileStoreTemplate<size_t>::write(InodeId_t id, void *data, FsSize_t dataSi
|
||||
if (fsData) {
|
||||
auto root = m_buffer->ptr(fsData->rootNode);
|
||||
if (root.valid()) {
|
||||
oxTrace("ox::fs::FileStoreTemplate::write") << "Placing" << dest->id << "on" << root->id;
|
||||
return placeItem(root, dest);
|
||||
} else {
|
||||
oxTrace("ox::fs::FileStoreTemplate::write") << "Initializing root inode.";
|
||||
fsData->rootNode = dest;
|
||||
return 0;
|
||||
}
|
||||
@ -265,23 +267,27 @@ typename FileStoreTemplate<size_t>::FileStoreData *FileStoreTemplate<size_t>::fi
|
||||
}
|
||||
|
||||
template<typename size_t>
|
||||
Error FileStoreTemplate<size_t>::placeItem(ItemPtr root, ItemPtr item) {
|
||||
if (item->id > root->id) {
|
||||
auto right = m_buffer->ptr(root->right);
|
||||
if (!right.valid() || right->id == item->id) {
|
||||
root->right = root;
|
||||
return 0;
|
||||
} else {
|
||||
return placeItem(right, item);
|
||||
}
|
||||
} else if (item->id < root->id) {
|
||||
auto left = m_buffer->ptr(root->left);
|
||||
if (!left.valid() || left->id == item->id) {
|
||||
root->left = root;
|
||||
return 0;
|
||||
} else {
|
||||
return placeItem(left, item);
|
||||
Error FileStoreTemplate<size_t>::placeItem(ItemPtr root, ItemPtr item, int depth) {
|
||||
if (depth < 5000) {
|
||||
if (item->id > root->id) {
|
||||
auto right = m_buffer->ptr(root->right);
|
||||
if (!right.valid() || right->id == item->id) {
|
||||
root->right = root;
|
||||
return 0;
|
||||
} else {
|
||||
return placeItem(right, item, depth + 1);
|
||||
}
|
||||
} else if (item->id < root->id) {
|
||||
auto left = m_buffer->ptr(root->left);
|
||||
if (!left.valid() || left->id == item->id) {
|
||||
root->left = root;
|
||||
return 0;
|
||||
} else {
|
||||
return placeItem(left, item, depth + 1);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
oxTrace("ox::fs::FileStoreTemplate::placeItem::fail") << "Excessive recursion depth, stopping before stack overflow.";
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@ -311,25 +317,36 @@ typename FileStoreTemplate<size_t>::ItemPtr FileStoreTemplate<size_t>::findParen
|
||||
}
|
||||
|
||||
template<typename size_t>
|
||||
typename FileStoreTemplate<size_t>::ItemPtr FileStoreTemplate<size_t>::find(ItemPtr item, size_t id) {
|
||||
if (item.valid()) {
|
||||
if (id > item->id) {
|
||||
return find(m_buffer->ptr(item->right), id);
|
||||
} else if (id < item->id) {
|
||||
return find(m_buffer->ptr(item->left), id);
|
||||
} else {
|
||||
return item;
|
||||
typename FileStoreTemplate<size_t>::ItemPtr FileStoreTemplate<size_t>::find(ItemPtr item, InodeId_t id, int depth) {
|
||||
if (depth < 5000) {
|
||||
if (item.valid()) {
|
||||
if (id > item->id) {
|
||||
return find(m_buffer->ptr(item->right), id, depth + 1);
|
||||
} else if (id < item->id) {
|
||||
return find(m_buffer->ptr(item->left), id, depth + 1);
|
||||
} else {
|
||||
return item;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
oxTrace("ox::fs::FileStoreTemplate::find::fail") << "Excessive recursion depth, stopping before stack overflow. Search for:" << id;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template<typename size_t>
|
||||
typename FileStoreTemplate<size_t>::ItemPtr FileStoreTemplate<size_t>::find(size_t id) {
|
||||
auto root = m_buffer->ptr(fileStoreData()->rootNode);
|
||||
if (root.valid()) {
|
||||
auto item = find(root, id);
|
||||
return item;
|
||||
typename FileStoreTemplate<size_t>::ItemPtr FileStoreTemplate<size_t>::find(InodeId_t id) {
|
||||
auto fsData = fileStoreData();
|
||||
if (fsData) {
|
||||
auto root = m_buffer->ptr(fsData->rootNode);
|
||||
if (root.valid()) {
|
||||
auto item = find(root, id);
|
||||
return item;
|
||||
} else {
|
||||
oxTrace("ox::fs::FileStoreTemplate::find::fail") << "No root node";
|
||||
}
|
||||
} else {
|
||||
oxTrace("ox::fs::FileStoreTemplate::find::fail") << "No FileStore Data";
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
2
deps/ox/src/ox/fs/filestore/nodebuffer.hpp
vendored
2
deps/ox/src/ox/fs/filestore/nodebuffer.hpp
vendored
@ -141,7 +141,7 @@ typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::malloc(size
|
||||
} else {
|
||||
// there is no first item, so this may be the first item
|
||||
if (!m_header.firstItem) {
|
||||
oxTrace("ox::fs::NodeBuffer::malloc") << "No first item.";
|
||||
oxTrace("ox::fs::NodeBuffer::malloc") << "No first item, initializing.";
|
||||
m_header.firstItem = sizeof(m_header);
|
||||
addr = m_header.firstItem;
|
||||
}
|
||||
|
9
deps/ox/src/ox/fs/test/tests.cpp
vendored
9
deps/ox/src/ox/fs/test/tests.cpp
vendored
@ -350,13 +350,16 @@ map<string, int(*)(string)> tests = {
|
||||
"FileStore::readWrite",
|
||||
[](string) {
|
||||
constexpr auto buffLen = 5000;
|
||||
constexpr auto str = "Hello, World!";
|
||||
constexpr auto strLen = ox_strlen(str);
|
||||
constexpr auto str1 = "Hello, World!";
|
||||
constexpr auto str1Len = ox_strlen(str1);
|
||||
constexpr auto str2 = "Hello, World!";
|
||||
constexpr auto str2Len = ox_strlen(str2);
|
||||
uint8_t buff[buffLen];
|
||||
auto list = new (buff) ox::fs::NodeBuffer<uint32_t, ox::fs::FileStoreItem<uint32_t>>(buffLen);
|
||||
ox::fs::FileStore32 fileStore(list, buffLen);
|
||||
ox_assert(fileStore.format() == 0, "FileStore::format failed.");
|
||||
ox_assert(fileStore.write(5, (void*) str, strLen, 1) == 0, "FileStore::write failed.");
|
||||
ox_assert(fileStore.write(4, (void*) str1, str1Len, 1) == 0, "FileStore::write 1 failed.");
|
||||
ox_assert(fileStore.write(5, (void*) str2, str2Len, 1) == 0, "FileStore::write 2 failed.");
|
||||
return 0;
|
||||
}
|
||||
},
|
||||
|
2
deps/ox/src/ox/std/assert.hpp
vendored
2
deps/ox/src/ox/std/assert.hpp
vendored
@ -14,4 +14,4 @@ void oxAssert(const char *file, int line, bool pass, const char *msg);
|
||||
#define ox_assert(pass, msg) oxAssert(__FILE__, __LINE__, pass, msg)
|
||||
#else
|
||||
#define ox_assert(pass, msg)
|
||||
#endif
|
||||
#endif
|
||||
|
2
deps/ox/src/ox/std/byteswap.hpp
vendored
2
deps/ox/src/ox/std/byteswap.hpp
vendored
@ -79,7 +79,7 @@ inline T bigEndianAdapt(T i) {
|
||||
|
||||
|
||||
template<typename T>
|
||||
class LittleEndian {
|
||||
class __attribute__((packed)) LittleEndian {
|
||||
private:
|
||||
T m_value;
|
||||
|
||||
|
2
deps/ox/src/ox/std/string.hpp
vendored
2
deps/ox/src/ox/std/string.hpp
vendored
@ -102,7 +102,7 @@ const BString<size> &BString<size>::operator+=(const char *str) {
|
||||
}
|
||||
ox_memcpy(m_buff + currentLen, str, strLen);
|
||||
// make sure last element is a null terminator
|
||||
m_buff[cap() - 1] = 0;
|
||||
m_buff[currentLen + strLen] = 0;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user