]> git.llucax.com Git - z.facultad/75.52/treemulator.git/blob - src/clave_variable.cpp
Pongo un cuadrado gris con el espacio libre al final.
[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         raw_data = data;
23 }
24
25 uint ClaveVariable::Size () const
26 {
27         return data.size ()*sizeof (uchar)+sizeof (uint);
28 }
29
30 uchar *ClaveVariable::ToArray () const
31 {
32         uchar *out;
33         uint len = data.size ();
34         out = new uchar[Size ()];
35         memcpy (out, &len, sizeof (uint));
36         memcpy (out+sizeof(uint), data.c_str (), data.size ()*sizeof (uchar));
37         return out;
38 }
39
40 Clave *ClaveVariable::Clone () const
41 {
42         ClaveVariable *k = new ClaveVariable (*this);
43         return k;
44 }
45
46 bool ClaveVariable::operator < (const Clave &c) const
47 {
48         return data < ((ClaveVariable&)c).data;
49 }
50
51 bool ClaveVariable::operator == (const Clave &c) const
52 {
53         return data == ((ClaveVariable&)c).data;
54 }
55
56 bool ClaveVariable::Abrev (ClaveVariable *c)
57 {
58         if (c == NULL) return false;
59         int iguales = 0;
60         std::string resto;
61
62         resto = abreviar (c->data, data, iguales);
63
64         /* No hago nada si solo machea un caracter */
65         if (iguales < 2) return false;
66
67         std::stringstream ss;
68         ss << iguales;
69         ss << "|";
70         ss << resto;
71         data = ss.str ();
72
73         return true;
74 }
75
76 bool ClaveVariable::DesAbrev (ClaveVariable *c)
77 {
78         if (c == NULL) return false;
79
80         int pos = data.find ("|");
81
82         /* No esta abreviada! */
83         if (pos <= 0) return false;
84
85         std::string siguales = data.substr (0, pos);
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
116 uchar *ClaveVariable::ToRaw (uint &size) const
117 {
118         uchar *out;
119         size = raw_data.size ()*sizeof (uchar)+sizeof (uint);
120         uint len = raw_data.size ();
121         out = new uchar[size];
122         memcpy (out, &len, sizeof (uint));
123         memcpy (out+sizeof(uint), raw_data.c_str (), raw_data.size ()*sizeof (uchar));
124         return out;
125 }
126