X-Git-Url: https://git.llucax.com/z.facultad/75.52/treemulator.git/blobdiff_plain/78d8bc6c001cb877d8c7daf3868835815a97ce21..e95ed4d2f8ae92b0044c6dc562fd5c7082a0677d:/src/btree_data.cpp diff --git a/src/btree_data.cpp b/src/btree_data.cpp index 5e351ce..1adeb83 100644 --- a/src/btree_data.cpp +++ b/src/btree_data.cpp @@ -1,47 +1,140 @@ #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(anterior->GetKey ())); +} + +bool BTreeData::DesAbrev (BTreeData *anterior) +{ + if (anterior == NULL) return false; + + ClaveVariable *c = (ClaveVariable *)clave; + return c->DesAbrev (dynamic_cast(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; +}