]> git.llucax.com Git - z.facultad/75.52/treemulator.git/commitdiff
Agrego ToRaw a las claves.
authorRicardo Markiewicz <rmarkie@fi.uba.ar>
Sun, 30 Oct 2005 05:14:02 +0000 (05:14 +0000)
committerRicardo Markiewicz <rmarkie@fi.uba.ar>
Sun, 30 Oct 2005 05:14:02 +0000 (05:14 +0000)
Este nuevo metodo es parecido a ToArray, solo que muestra la clave
tal cual se leyo del disco. Es necesario para mostrar luego las claves
abreviadas y esas cosas.

src/clave.h
src/clave_fija.cpp
src/clave_fija.h
src/clave_variable.cpp
src/clave_variable.h
viewer/view_properties.cpp

index e609bb02d37797d22556b25b83a52c4a2d1566c0..c0f3a3040145e24764cd390b200dac7cae8d5a7e 100644 (file)
@@ -2,23 +2,26 @@
 #ifndef _CLAVE_H_
 #define _CLAVE_H_
 
-/* Clave para agregar a un arbol B */
 #include "common.h"
 #include <string>
 
-/** Clave abstracta para manejo de Claves */
+/** Clase abstracta para manejo de Claves */
 class Clave {
        public:
                virtual ~Clave () {}
 
-               /** Retorna el tamaño en bytes que ocupa la clave */
+               /** Retorna el tamaño en bytes que ocupa la clave */
                virtual uint Size () const = 0;
                /** Retorna un array de bytes de Size() de longitud.
                 * 
                 *  El contenido del array es la clave en formato RAW
                 *  para guardar en disco.
+                *
+                *  El array debe ser liberado por el llamador.
                 */
                virtual uchar *ToArray () const = 0;
+               virtual uchar *ToRaw (uint &size) const = 0;
+
                /** Retorna un clon de la clave actual */
                virtual Clave *Clone () const = 0;
 
index 155e0e662098c085359184eba6eb9da52c5dab77..ebb08ea2a7594aea6f3ad63974e2813514a188ed 100644 (file)
@@ -40,3 +40,10 @@ bool ClaveFija::operator == (const Clave &c) const
 {
        return data == ((ClaveFija&)c).data;
 }
+               
+uchar *ClaveFija::ToRaw (uint &size) const
+{
+       size = Size ();
+       return ToArray ();
+}
+
index 7b715a9db53562560b2953cb088d38019d9d9621..e70cd526941f7e93c8d3b4996cc89105c2c09428 100644 (file)
@@ -14,6 +14,7 @@ class ClaveFija : public Clave {
 
                uint Size () const;
                uchar *ToArray () const;
+               uchar *ToRaw (uint &size) const;
                Clave *Clone () const;
 
                virtual bool operator < (const Clave &c) const;
index 47d81ba5f292f1b2461b8b26f02f6d6a8bb816e1..48a42a60b5d8cddd6f9ade59fc0873f00ca622ef 100644 (file)
@@ -19,11 +19,12 @@ ClaveVariable::ClaveVariable (uchar *n)
        str[len] = '\0';
        data = std::string ((const char *)(str));
        delete [] str;
+       raw_data = data;
 }
 
 uint ClaveVariable::Size () const
 {
-       return data.size ()+sizeof (uint);
+       return data.size ()*sizeof (uchar)+sizeof (uint);
 }
 
 uchar *ClaveVariable::ToArray () const
@@ -32,7 +33,7 @@ uchar *ClaveVariable::ToArray () const
        uint len = data.size ();
        out = new uchar[Size ()];
        memcpy (out, &len, sizeof (uint));
-       memcpy (out+sizeof(uint), data.c_str (), data.size ());
+       memcpy (out+sizeof(uint), data.c_str (), data.size ()*sizeof (uchar));
        return out;
 }
 
@@ -82,7 +83,6 @@ bool ClaveVariable::DesAbrev (ClaveVariable *c)
        if (pos <= 0) return false;
 
        std::string siguales = data.substr (0, pos);
-       std::cout << siguales << std::endl;
        int iguales = atoi (siguales.c_str ());
 
        std::string primera_parte = c->data.substr (0, iguales);
@@ -113,3 +113,14 @@ std::string ClaveVariable::abreviar(std::string &p, std::string &a, int &iguales
        return std::string (actual);
 }
 
+uchar *ClaveVariable::ToRaw (uint &size) const
+{
+       uchar *out;
+       size = raw_data.size ()*sizeof (uchar)+sizeof (uint);
+       uint len = raw_data.size ();
+       out = new uchar[size];
+       memcpy (out, &len, sizeof (uint));
+       memcpy (out+sizeof(uint), raw_data.c_str (), raw_data.size ()*sizeof (uchar));
+       return out;
+}
+
index e568451fc012d0d8c3d9dbfa1f26458a71b63542..224f4e0f50d111ca6b9d18ae7e4ed47cb02abb4c 100644 (file)
@@ -18,6 +18,7 @@ class ClaveVariable : public Clave {
 
                uint Size () const;
                uchar *ToArray () const;
+               uchar *ToRaw (uint &size) const;
                Clave *Clone () const;
 
                bool Abrev (ClaveVariable *c);
@@ -31,6 +32,7 @@ class ClaveVariable : public Clave {
        private:
                std::string abreviar(std::string &primera, std::string &actual, int &iguales);
                std::string data;
+               std::string raw_data;
 };
 
 #endif
index 8f92d5f7ac574ee0de510365a9b91c5fc7d0561b..11498ba5af3249ab2fe537b8e14d87e9a05d561c 100644 (file)
@@ -113,8 +113,11 @@ void ViewProperties::ShowItem (BTreeData *data, BTreeNodeHeader &header)
 std::string ViewProperties::ToRaw (BTreeData *p)
 {
        std::stringstream ss;
-       uint size = p->Size (), i;
-       uchar *arr = p->ToArray ();
+       uint size = 0, i;
+       uchar *arr = NULL;
+       if (p->GetKey ()) {
+               arr = p->GetKey ()->ToRaw (size);
+       }
 
        for (i=0; i < size; i++) {
                if (isalnum (arr[i]))
@@ -123,7 +126,14 @@ std::string ViewProperties::ToRaw (BTreeData *p)
                        ss << ".";
        }
 
-       delete [] arr;
+       if (p->GetChild () != 0) {
+               ss << "(";
+               ss << p->GetChild ();
+               ss << ")";
+       }
+
+       if (arr)
+               delete [] arr;
        return ss.str ();
 }