X-Git-Url: https://git.llucax.com/z.facultad/75.52/treemulator.git/blobdiff_plain/5595409c0aaab1075c083f91c335acb368be51d5..d9f6b6c969656b47f1e6a051cfc65959bd5c069f:/src/btree.h?ds=inline diff --git a/src/btree.h b/src/btree.h index 40261fb..df427ed 100644 --- a/src/btree.h +++ b/src/btree.h @@ -1,5 +1,5 @@ -#ifdef _B_TREE_H +#ifndef _B_TREE_H #define _B_TREE_H /** @@ -44,13 +44,28 @@ * tomar una idea simimar) */ -/** Encabezado del archivo BTree */ -typedef struct _btree_file_ { - unsigned int block_sise; -} BTreeFileHeader; +#include +#include +#include +#include "common.h" +#include "clave.h" +#include "clave_fija.h" +#include "clave_variable.h" +#include "btree_data.h" + +/* alias para codear menos :) */ + +/** Encabezado del archivo BTree + * + * Esta estructura es para comodidad de manejo, aunque en disco + * ocupe block_size de tamaño. + */ +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 @@ -66,48 +81,71 @@ 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 +/** Modelo del árbol B * * \param filename Nombre del archivo a crear * \param block_size Tamaño de bloque a utilizar + * \param k_t Tipo de clave 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, int k_t = KEY_FIXED, 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 *breee_open (const char *filename); + /** Tipos de clave a usar */ + enum { + KEY_FIXED, + KEY_VARIABLE + }; -/** Agrega una clave en el arbol - * - * \TODO Definir parametros - */ -int btree_add (BTree *); + /** Agrega una nueva clave al árbol. */ + void AddKey (const Clave &k); + /** Elimina una clave del árbol. */ + void DelKey (const Clave &k); + /** Busca si existe una clave en el árbol + * + * \TODO : Deberia retornar algun tipo de dato + */ + bool FindKey (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); + bool FindKeyR (const Clave *k, uint node); + + void WriteFileHeader (); + + void WriteBlock (uchar *block, uint num); + uchar *ReadBlock (uint num); + uchar *NewBlock (uint &num); + + void ReadNodoHeader (uchar *node, BTreeNodeHeader *header); + void WriteNodoHeader (uchar *node, BTreeNodeHeader *header); + + std::list ReadKeys (uchar *node, BTreeNodeHeader &node_header); + void WriteKeys (uchar *node, BTreeNodeHeader &node_header, std::list &keys); + + void DeleteKeys (std::list &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; -/** Borra una clave del arbol - * - * \TODO Definir parametros - */ -int btree_del (BTree *); -/** Cierra el arbol y libera los recursos */ -int btree_close (BTree *); + /* DEBUG */ + public: + void PrintNode (uint num); +}; #endif // _B_TREE_H