]> git.llucax.com Git - z.facultad/75.52/treemulator.git/blob - src/btree_data.h
Bugfix : Condición base para cortar la recursividad.
[z.facultad/75.52/treemulator.git] / src / btree_data.h
1
2 #ifndef _B_TREE_DATA
3 #define _B_TREE_DATA
4
5 #include <iostream>
6 #include <stdlib.h>
7 #include "clave.h"
8 #include "clave_fija.h"
9 #include "clave_variable.h"
10
11 /** Dato a guardar en los nodos de un árbol B
12  *
13  *  Esta clase es la "magia" de todo. Es la encargada de transformar
14  *  datos RAW sacados de un bloque del archivo que representa un árbol B
15  *  y convertirlos en datos cómodos de manejar desde el programa.
16  *
17  *  Esta clase en la más genérica de todos y utilizada en los nodos internos
18  *  del árbol, que contiene claves y punteros a hijos.
19  *
20  *  También es quién abstrae el uso de distintos tipo de claves al árbol.
21  */
22 class BTreeData {
23         public:
24                 BTreeData () {}
25                 /** Crea una instancia a partir de un bloque RAW
26                  *
27                  *  \param node Bloque RAW desde donde leer.
28                  *  \param tree_type Tipo de clave utilizada por el árbol.
29                  */
30                 BTreeData (uchar *node, int tree_type);
31                 /** Crea una instancia.
32                  *
33                  *  \param k Clave a contener.
34                  *  \param hijo Hijo derecho.
35                  */
36                 BTreeData (Clave *k, uint child);
37                 /** Destructor */
38                 virtual ~BTreeData ();
39
40                 /** Retorna el tamaño en bytes que ocupa en RAW */
41                 virtual uint Size () const;
42                 /** Retorna un array RAW de bytes con el contenido
43                  *
44                  *  El array retornado debe ser liberado por el programador.
45                  */
46                 virtual uchar *ToArray () const;
47
48                 /** Retorna la clave manejada */
49                 Clave* getClave () { return clave; }
50                 /** Retorna el hijo apuntado */
51                 uint getChild () { return hijo; }
52                 /** Setea el hijo apuntado */
53                 void setChild (uint c) { hijo = c; }
54
55                 bool operator < (const BTreeData &data) const;
56                 bool operator == (const BTreeData &data) const;
57                 virtual operator std::string () const {
58                         std::string out = (*clave);
59                         std::stringstream ss;
60                         ss << "(" << out ;
61                         ss << ")" << "[" << hijo << "]";
62                         ss >> out;
63                         return out;
64                 }
65         protected:
66                 Clave *clave;
67                 uint hijo;
68 };
69
70 /** Dato a guardar en las hojas */
71 class BTreeLeafData:public BTreeData {
72         public:
73                 BTreeLeafData (Clave *k) { clave = k; }
74                 BTreeLeafData (uchar *node, int key_type);
75                 virtual ~BTreeLeafData ();
76
77                 virtual uint Size () const;
78                 virtual uchar *ToArray () const;
79                 virtual operator std::string () const {
80                         if (clave) {
81                                 return (*clave);
82                         }
83                         return "NoKey";
84                 }
85 };
86
87 class BTreeChildData:public BTreeData {
88         public:
89                 BTreeChildData (uint child):BTreeData () { hijo = child; clave = NULL; }
90                 BTreeChildData (uchar *node);
91                 virtual ~BTreeChildData ();
92
93                 virtual uint Size () const;
94                 virtual uchar *ToArray () const;
95                 virtual operator std::string () const {
96                         std::string out;
97                         std::stringstream ss;
98                         ss << "|" << hijo << "|";
99                         ss >> out;
100                         return out;
101                 }
102 };
103
104 #endif
105