]> git.llucax.com Git - z.facultad/75.52/treemulator.git/blobdiff - src/btree.h
Cerrando el ciclo de llenar una hoja
[z.facultad/75.52/treemulator.git] / src / btree.h
index 6764a63d5f0ef8bc559df9e650691cff6781c0ad..467ed6fe3f3a68b3f3a44ca6aa36ac9a93c663c9 100644 (file)
  *    tomar una idea simimar)
  */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include <iostream>
+#include <string>
+#include <list>
+#include "common.h"
+#include "clave.h"
+#include "clave_fija.h"
+#include "btree_data.h"
 
 /* alias para codear menos :) */
-typedef unsigned char uchar;
 
 /** Encabezado del archivo BTree */
-typedef struct _btree_file_ {
-       unsigned int block_size;
-} BTreeFileHeader;
+struct BTreeFileHeader {
+       uint block_size;
+};
 
 /** Encabezado de un bloque */
-typedef struct _btree_header_ {
+struct BTreeNodeHeader {
        /** Indica a que nivel corresponde un bloque
         *
         *  nivel == 0 : una hoja
@@ -73,18 +76,7 @@ typedef struct _btree_header_ {
 
        /** Cantidad de elementos en el nodo */
        unsigned int item_count;
-} BTreeHeader;
-
-typedef struct _btree_ {
-       char *filename;
-       BTreeFileHeader header;
-
-       /** Apunta al archivo de datos, asi se abre solo 1 vez
-        *
-        *  \TODO Ver si vale la pena
-        */
-       FILE *fp;
-} BTree;
+};
 
 /** Crea un nuevo arbol B
  *
@@ -92,29 +84,37 @@ typedef struct _btree_ {
  *  \param block_size Tamaño de bloque a utilizar
  *  \return Un nuevo arbol B creado o NULL en caso de error
  */
-BTree *btree_create (const char *filename, unsigned int block_size);
+class BTree {
+       public:
+               BTree (const std::string &filename, unsigned int block_size, bool create_new_file = false);
+               ~BTree ();
 
-/** Abre un arbol B existente
- *
- *  \param filename Nombre del archivo a abrir
- *  \return El arbol abierto o NULL en caso de error
- */
-BTree *btree_open (const char *filename);
+               void AddKey (const Clave &k);
+               void DelKey (const Clave &k);
 
-/** Agrega una clave en el arbol
- *
- *  \TODO Definir parametros
- */
-int btree_add (BTree *);
+       private:
+               Clave* AddKeyR (const Clave *k, uint node_num);
 
-/** Borra una clave del arbol
- *
- *  \TODO Definir parametros
- */
-int btree_del (BTree *);
+               void WriteFileHeader ();
+
+               void WriteBlock (uchar *block, uint num);
+               uchar *ReadBlock (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;
 
-/** Cierra el arbol y libera los recursos */
-int btree_close (BTree *);
+               /** Apunta al archivo de datos, asi se abre solo 1 vez
+                *
+                *  \TODO Ver si vale la pena
+                */
+               FILE *fp;
+};
 
 #endif // _B_TREE_H