X-Git-Url: https://git.llucax.com/z.facultad/75.52/treemulator.git/blobdiff_plain/1d533a2f726534cd02f1c7ba71f0fd454f70e16f..58f5f2e6ba6f33bc457e98ec883f2834c9a5fe6f:/src/btree_data.h diff --git a/src/btree_data.h b/src/btree_data.h index 141db7f..b7f457a 100644 --- a/src/btree_data.h +++ b/src/btree_data.h @@ -6,27 +6,104 @@ #include #include "clave.h" #include "clave_fija.h" +#include "clave_variable.h" -/** Dato a guardar en los nodos */ +/** Dato a guardar en los nodos de un árbol B + * + * Esta clase es la "magia" de todo. Es la encargada de transformar + * datos RAW sacados de un bloque del archivo que representa un árbol B + * y convertirlos en datos cómodos de manejar desde el programa. + * + * Esta clase en la más genérica de todos y utilizada en los nodos internos + * del árbol, que contiene claves y punteros a hijos. + * + * También es quién abstrae el uso de distintos tipo de claves al árbol. + */ class BTreeData { public: - BTreeData (uchar *node); + BTreeData () {} + /** Crea una instancia a partir de un bloque RAW + * + * \param node Bloque RAW desde donde leer. + * \param tree_type Tipo de clave utilizada por el árbol. + */ + BTreeData (uchar *node, int tree_type); + /** Crea una instancia. + * + * \param k Clave a contener. + * \param hijo Hijo derecho. + */ + BTreeData (Clave *k, uint child); + /** Destructor */ virtual ~BTreeData (); - virtual uint Size (); - virtual uchar *ToArray (); + /** Retorna el tamaño en bytes que ocupa en RAW */ + virtual uint Size () const; + /** Retorna un array RAW de bytes con el contenido + * + * El array retornado debe ser liberado por el programador. + */ + virtual uchar *ToArray () const; + + /** Retorna la clave manejada */ + Clave* GetKey () { return clave; } + void SetKey (Clave *k) { clave = k; } + /** Retorna el hijo apuntado */ + uint GetChild () { return hijo; } + /** Setea el hijo apuntado */ + void SetChild (uint c) { hijo = c; } + + bool Abrev (BTreeData *anterior); + bool DesAbrev (BTreeData *anterior); + + bool operator < (const BTreeData &data) const; + bool operator == (const BTreeData &data) const; + virtual operator std::string () const { + std::string out = (*clave); + std::stringstream ss; + ss << "("; + ss << out; + ss << ")" << "[" << hijo << "]"; + return ss.str (); + } protected: Clave *clave; uint hijo; }; /** Dato a guardar en las hojas */ -class BTreeLeafData:BTreeData { +class BTreeLeafData:public BTreeData { public: + BTreeLeafData (Clave *k) { clave = k; hijo = 0; } + BTreeLeafData (uchar *node, int key_type); virtual ~BTreeLeafData (); - virtual uint Size (); - virtual uchar *ToArray (); + virtual uint Size () const; + virtual uchar *ToArray () const; + virtual operator std::string () const { + if (clave) { + return (*clave); + } + return "NoKey"; + } +}; + +class BTreeChildData:public BTreeData { + public: + BTreeChildData (uint child):BTreeData () { hijo = child; clave = NULL; } + BTreeChildData (uchar *node); + virtual ~BTreeChildData (); + + virtual uint Size () const; + virtual uchar *ToArray () const; + bool operator < (const BTreeData &data) const; + virtual operator std::string () const { + std::string out; + std::stringstream ss; + ss << "|" << hijo << "|"; + ss >> out; + return out; + } }; #endif