Newer
Older
ubixos / src / sys / ubixfsv2 / btree.h
#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 14
#define B_MAX_NAME_LENGTH 256
#define B_MAX_CHILD_COUNT 4

typedef struct bNode { 
  uInt32  magic1                          __attribute__ ((packed));
  uInt32  used                            __attribute__ ((packed));
  char    keys[B_MAX_KEYS][B_MAX_NAME_LENGTH]      __attribute__ ((packed));
  bool    present[B_MAX_KEYS+1]           __attribute__ ((packed));
  void *  childHead[(B_MAX_KEYS+1)*8/sizeof(void *)]   __attribute__ ((packed));
  void *  childTail[(B_MAX_KEYS+1)*8/sizeof(void *)]  __attribute__ ((packed));
  uInt32   childCount[B_MAX_KEYS+1]        __attribute__ ((packed));
  bNode * parent                          __attribute__ ((packed));
  bool    leafNode                        __attribute__ ((packed));
  uInt32  magic2                          __attribute__ ((packed));
} bNode; // bNode

class bTree {
 protected:
  bNode * root;
  ubixfsInode * treeSearch(bNode *, const char *);
  ubixfsInode * inodeSearch(ubixfsInode *, const char *);
  void          splitNode(bNode *);
  bNode *       allocEmptyNode(void);
  void          insertNode(bNode *, const char *, void *);
 public:
                bTree(ubixfsInode *);
                bTree(void) : root(NULL) { };
  ubixfsInode * Find(const char *);
  ubixfsInode * GetFirstNode(void);
  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);
               ~bTree(void) { };
}; // bTree
#endif // !BTREE_H