]> git.llucax.com Git - z.facultad/75.52/treemulator.git/blob - src/clave_variable.cpp
Abreviado de Claves Variables.
[z.facultad/75.52/treemulator.git] / src / clave_variable.cpp
1
2 #include <string>
3 #include "clave_variable.h"
4 #include <iostream>
5
6 ClaveVariable::ClaveVariable (const std::string &s)
7 {
8         data = s;
9 }
10
11 ClaveVariable::ClaveVariable (uchar *n)
12 {
13         uint len;
14
15         memcpy (&len, n, sizeof (uint));
16         uchar *str = new uchar[len+1];
17         n += sizeof (uint);
18         memcpy (str, n, sizeof (uchar)*len);
19         str[len] = '\0';
20         data = std::string ((const char *)(str));
21         delete [] str;
22 }
23
24 uint ClaveVariable::Size () const
25 {
26         return data.size ()+sizeof (uint);
27 }
28
29 uchar *ClaveVariable::ToArray () const
30 {
31         uchar *out;
32         uint len = data.size ();
33         out = new uchar[Size ()];
34         memcpy (out, &len, sizeof (uint));
35         memcpy (out+sizeof(uint), data.c_str (), data.size ());
36         return out;
37 }
38
39 Clave *ClaveVariable::Clone () const
40 {
41         ClaveVariable *k = new ClaveVariable (*this);
42         return k;
43 }
44
45 bool ClaveVariable::operator < (const Clave &c) const
46 {
47         return data < ((ClaveVariable&)c).data;
48 }
49
50 bool ClaveVariable::operator == (const Clave &c) const
51 {
52         return data == ((ClaveVariable&)c).data;
53 }
54
55 bool ClaveVariable::Abrev (ClaveVariable *c)
56 {
57         if (c == NULL) return false;
58         int iguales = 0;
59         std::string resto;
60
61         resto = abreviar (c->data, data, iguales);
62
63         /* No hago nada si solo machea un caracter */
64         if (iguales < 2) return false;
65
66         std::stringstream ss;
67         ss << iguales;
68         ss << "|";
69         ss << resto;
70         data = ss.str ();
71
72         return true;
73 }
74
75 bool ClaveVariable::DesAbrev (ClaveVariable *c)
76 {
77         if (c == NULL) return false;
78
79         int pos = data.find ("|");
80
81         /* No esta abreviada! */
82         if (pos <= 0) return false;
83
84         std::string siguales = data.substr (0, pos);
85         std::cout << siguales << std::endl;
86         int iguales = atoi (siguales.c_str ());
87
88         std::string primera_parte = c->data.substr (0, iguales);
89         std::string segunda_parte = data.substr (pos+1, data.size () - pos - 1);
90
91         data = primera_parte + segunda_parte;
92
93         return true;
94 }
95
96 std::string ClaveVariable::abreviar(std::string &p, std::string &a, int &iguales)
97 {
98         char *primera = (char *)p.c_str ();
99         char *actual = (char *)a.c_str ();
100
101         iguales = 0;
102         while (((*primera) != '\0') && ((*actual) != '\0')) {
103                 if ((*primera) == (*actual)) {
104                         primera++;
105                         actual++;
106                         iguales++;
107                 } else {
108                         /* No coinciden mas! */
109                         break;
110                 }
111         }
112
113         return std::string (actual);
114 }
115