]> git.llucax.com Git - z.facultad/75.52/treemulator.git/blobdiff - src/btree.h
Agrego clave variable.
[z.facultad/75.52/treemulator.git] / src / btree.h
index 0ed4fbdcadae9625011998d3b37ac5e9dd50d900..a67fa4c4b9d1e086458f80e2cd367869411f448d 100644 (file)
  *    tomar una idea simimar)
  */
 
+#include <iostream>
 #include <string>
+#include <list>
+#include "common.h"
+#include "clave.h"
+#include "clave_fija.h"
+#include "clave_variable.h"
+#include "btree_data.h"
 
 /* alias para codear menos :) */
-typedef unsigned char uchar;
 
 /** Encabezado del archivo BTree */
-typedef struct _btree_file_ {
+struct BTreeFileHeader {
        uint block_size;
-} BTreeFileHeader;
+};
 
 /** Encabezado de un bloque */
-typedef struct _btree_header_ {
+struct BTreeNodeHeader {
        /** Indica a que nivel corresponde un bloque
         *
         *  nivel == 0 : una hoja
@@ -71,7 +77,7 @@ typedef struct _btree_header_ {
 
        /** Cantidad de elementos en el nodo */
        unsigned int item_count;
-} BTreeNodeHeader;
+};
 
 /** Crea un nuevo arbol B
  *
@@ -81,26 +87,48 @@ typedef struct _btree_header_ {
  */
 class BTree {
        public:
-               BTree (const char *filename, unsigned int block_size, bool create_new_file = false);
+               BTree (const std::string &filename, unsigned int block_size, int k_t = KEY_FIXED, bool create_new_file = false);
                ~BTree ();
 
-               void AddKey ();
-               void DelKey ();
+               /** Tipos de clave a usar */
+               enum {
+                       KEY_FIXED,
+                       KEY_VARIABLE
+               };
+
+               void AddKey (const Clave &k);
+               void DelKey (const Clave &k);
+
+       protected:
+               Clave* AddKeyR (const Clave *k, uint node_num, uint &left_child, uint &right_child);
+               Clave* AddKeyOtherR (const Clave *k, uint node_num, uint &left_child, uint &right_child);
+               Clave* AddKeyLeafR (const Clave *k, uint node_num, uint &left_child, uint &right_child);
+
+               void WriteFileHeader ();
+
+               void WriteBlock (uchar *block, uint num);
+               uchar *ReadBlock (uint num);
+               uchar *NewBlock (uint &num);
 
-       private:
-               void write_tree_header ();
-               void write_block (uchar *block, uint num);
                void ReadNodoHeader (uchar *node, BTreeNodeHeader *header);
                void WriteNodoHeader (uchar *node, BTreeNodeHeader *header);
 
+               std::list<BTreeData *> ReadKeys (uchar *node, BTreeNodeHeader &node_header);
+               void WriteKeys (uchar *node, BTreeNodeHeader &node_header, std::list<BTreeData *> &keys);
+
                std::string filename;
                BTreeFileHeader header;
+               int key_type;
 
                /** Apunta al archivo de datos, asi se abre solo 1 vez
                 *
                 *  \TODO Ver si vale la pena
                 */
                FILE *fp;
+
+
+               /* DEBUG */
+               void PrintNode (uint num);
 };
 
 #endif // _B_TREE_H