#include "btree_data.h"
+#include "btree.h"
-BTreeData::BTreeData (uchar *node)
+BTreeData::BTreeData (uchar *node, int tree_type)
{
/* TODO : Aca deberia detectar el tipo de clave (necesito
* info desde el arbol
*/
- clave = new ClaveFija (node);
+ if (tree_type == BTree::KEY_FIXED)
+ clave = new ClaveFija (node);
+ else
+ clave = new ClaveVariable (node);
node += clave->Size ();
- memcpy (&hijo_izquierdo, node, sizeof (uint));
+ memcpy (&hijo, node, sizeof (uint));
+}
+
+BTreeData::BTreeData (Clave *k, uint child)
+{
+ clave = k;
+ hijo = child;
}
BTreeData::~BTreeData ()
{
+ if (clave) {
+ delete clave;
+ clave = NULL;
+ }
}
-uint BTreeData::Size ()
+uint BTreeData::Size () const
{
uint s = sizeof (uint);
if (clave) s += clave->Size ();
-
+ else std::cout << "No tengo clave\n";
return s;
}
-uchar* BTreeData::ToArray ()
+uchar* BTreeData::ToArray () const
{
uchar *out = new uchar[Size()];
- memcpy (out, clave->ToArray (), clave->Size ());
- memcpy (out+clave->Size (), &hijo_izquierdo, sizeof (uint));
+ if (clave) {
+ uchar *n = clave->ToArray ();
+ memcpy (out, n, clave->Size ());
+ memcpy (out+clave->Size (), &hijo, sizeof (uint));
+ delete [] n;
+ } else
+ memcpy (out, &hijo, sizeof (uint));
return out;
}
+bool BTreeData::operator < (const BTreeData &data) const
+{
+ if (!data.clave) return false;
+
+ return (*clave) < (*(data.clave));
+}
+
+bool BTreeData::operator == (const BTreeData &data) const
+{
+ if (!data.clave) return false;
+
+ return (*clave) == (*(data.clave));
+}
+
+bool BTreeData::Abrev (BTreeData *anterior)
+{
+ if (anterior == NULL) return false;
+
+ ClaveVariable *c = (ClaveVariable *)clave;
+ return c->Abrev (dynamic_cast<ClaveVariable *>(anterior->GetKey ()));
+}
+
+bool BTreeData::DesAbrev (BTreeData *anterior)
+{
+ if (anterior == NULL) return false;
+
+ ClaveVariable *c = (ClaveVariable *)clave;
+ return c->DesAbrev (dynamic_cast<ClaveVariable *>(anterior->GetKey ()));
+}
+
+BTreeLeafData::BTreeLeafData (uchar *node, int key_type)
+{
+ hijo = 0;
+ if (key_type == BTree::KEY_FIXED)
+ clave = new ClaveFija (node);
+ else
+ clave = new ClaveVariable (node);
+}
+
BTreeLeafData::~BTreeLeafData ()
{
+ if (clave) {
+ delete clave;
+ clave = NULL;
+ }
}
-uint BTreeLeafData::Size ()
+uint BTreeLeafData::Size () const
{
+ if (!clave) {
+ std::cout << "BTreeLeafData::Size : No tengo clave!" << std::endl;
+ return 0;
+ }
return clave->Size ();
}
-uchar* BTreeLeafData::ToArray ()
+uchar* BTreeLeafData::ToArray () const
{
return clave->ToArray ();
}
+
+BTreeChildData::BTreeChildData (uchar *node)
+{
+ memcpy (&hijo, node, sizeof (uint));
+ clave = NULL;
+}
+
+BTreeChildData::~BTreeChildData ()
+{
+}
+
+uint BTreeChildData::Size () const
+{
+ return sizeof (uint);
+}
+
+uchar* BTreeChildData::ToArray () const
+{
+ uchar *out = new uchar[Size()];
+ memcpy (out, &hijo, sizeof (uint));
+ return out;
+}
+
+bool BTreeChildData::operator < (const BTreeData &data) const
+{
+ return false;
+}