#ifndef BTREE_H #define BTREE_H #include "superblock.h" #include "inode.h" #define B_NODE_MAGIC_1 0xDEADBEEF #define B_NODE_MAGIC_2 0x1900BABE #define B_MAX_KEYS 15 #define B_MAX_NAME_LENGTH 240 #define B_MAX_CHILD_COUNT 4 // if any of these structs change they have to be updated in the format // utility too typedef struct bNode { uInt32 magic1 __attribute__ ((packed)); uInt32 used __attribute__ ((packed)); bNode * parent __attribute__ ((packed)); char keys[B_MAX_KEYS][B_MAX_NAME_LENGTH] __attribute__ ((packed)); bool present[B_MAX_KEYS+1] __attribute__ ((packed)); void * head[(B_MAX_KEYS+1)*8/sizeof(void *)] __attribute__ ((packed)); void * tail[(B_MAX_KEYS+1)*8/sizeof(void *)] __attribute__ ((packed)); uInt32 childCount[B_MAX_KEYS+1] __attribute__ ((packed)); uInt32 magic2 __attribute__ ((packed)); bool leaf __attribute__ ((packed)); char reserved[143] __attribute__ ((packed)); } bNode; // bNode typedef struct bTreeHeader { uInt32 treeDepth; uInt32 treeWidth; uInt32 treeLeafCount; int32 firstDeleted; } bTreeHeader; // bTreeHeader class bTree { protected: bNode * root; uInt32 treeDepth; uInt32 treeWidth; uInt32 treeLeafCount; int32 firstDeleted; ubixfsInode * treeSearch(bNode *, const char *); ubixfsInode * inodeSearch(ubixfsInode *, const char *); void splitNode(bNode *); bNode * allocEmptyNode(void); void insertNode(bNode *, const char *, void *, void *); bNode * findLeafNode(bNode *, const char *); void Print(bNode *); public: bTree(ubixfsInode *); bTree(void) : root(NULL), treeDepth(0) { }; ubixfsInode * Find(const char *); ubixfsInode * GetFirstNode(void); ubixfsInode * GetFirstNode(bNode *); bool Delete(const char *); void Info(void); void Info(const bNode *); bool Insert(ubixfsInode *); bool Save(const char *); bool Load(const char *); void Print(void); void PrintWholeTree(void); bool Verify(void); ~bTree(void); }; // bTree #endif // !BTREE_H