#include <stdlib.h>
#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 () { clave = NULL; }
- 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* getClave () { return clave; }
+ void setClave (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 {
- if (clave) {
- return (*clave);
- }
- return "NoKey";
+ std::string out = (*clave);
+ std::stringstream ss;
+ ss << "(" << out ;
+ ss << ")" << "[" << hijo << "]";
+ ss >> out;
+ return out;
}
protected:
Clave *clave;
/** Dato a guardar en las hojas */
class BTreeLeafData:public BTreeData {
public:
- BTreeLeafData (Clave *k):BTreeData () { clave = k; }
- BTreeLeafData (uchar *node) { clave = new ClaveFija (node); }
+ BTreeLeafData (Clave *k) { clave = k; }
+ 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;
+ virtual operator std::string () const {
+ std::string out;
+ std::stringstream ss;
+ ss << "|" << hijo << "|";
+ ss >> out;
+ return out;
+ }
};
#endif