]> git.llucax.com Git - z.facultad/75.52/treemulator.git/blob - src/clave_variable.cpp
UNDO: Cambio constructor por metodo estatico.
[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         n += data.size () * sizeof (uchar);
23         memcpy (&block_data, n, sizeof (uint));
24
25         raw_data = data;
26 }
27
28 uint ClaveVariable::Size () const
29 {
30         return data.size ()*sizeof (uchar)+sizeof (uint)*2;
31 }
32
33 uchar *ClaveVariable::ToArray () const
34 {
35         uchar *out;
36         uint len = data.size ();
37         out = new uchar[Size ()];
38         int x = 0;
39         memcpy (out, &len, sizeof (uint));
40         x += sizeof (uint);
41         memcpy (out+x, data.c_str (), data.size ()*sizeof (uchar));
42         x += data.size () * sizeof (uchar);
43         memcpy (out+x, &block_data, sizeof (uint));
44
45         return out;
46 }
47
48 Clave *ClaveVariable::Clone () const
49 {
50         ClaveVariable *k = new ClaveVariable (*this);
51         return k;
52 }
53
54 bool ClaveVariable::operator < (const Clave &c) const
55 {
56         return data < ((ClaveVariable&)c).data;
57 }
58
59 bool ClaveVariable::operator == (const Clave &c) const
60 {
61         return data == ((ClaveVariable&)c).data;
62 }
63
64 bool ClaveVariable::Abrev (ClaveVariable *c)
65 {
66         if (c == NULL) return false;
67         int iguales = 0;
68         std::string resto;
69
70         resto = abreviar (c->data, data, iguales);
71
72         /* No hago nada si solo machea un caracter */
73         if (iguales < 2) return false;
74
75         std::stringstream ss;
76         ss << iguales;
77         ss << "|";
78         ss << resto;
79         data = ss.str ();
80
81         return true;
82 }
83
84 bool ClaveVariable::DesAbrev (ClaveVariable *c)
85 {
86         if (c == NULL) return false;
87
88         int pos = data.find ("|");
89
90         /* No esta abreviada! */
91         if (pos <= 0) return false;
92
93         std::string siguales = data.substr (0, pos);
94         int iguales = atoi (siguales.c_str ());
95
96         std::string primera_parte = c->data.substr (0, iguales);
97         std::string segunda_parte = data.substr (pos+1, data.size () - pos - 1);
98
99         data = primera_parte + segunda_parte;
100
101         return true;
102 }
103
104 std::string ClaveVariable::abreviar(std::string &p, std::string &a, int &iguales)
105 {
106         char *primera = (char *)p.c_str ();
107         char *actual = (char *)a.c_str ();
108
109         iguales = 0;
110         while (((*primera) != '\0') && ((*actual) != '\0')) {
111                 if ((*primera) == (*actual)) {
112                         primera++;
113                         actual++;
114                         iguales++;
115                 } else {
116                         /* No coinciden mas! */
117                         break;
118                 }
119         }
120
121         return std::string (actual);
122 }
123
124 uchar *ClaveVariable::ToRaw (uint &size) const
125 {
126         std::stringstream ss;
127
128         ss << "[";
129         ss << data.size ();
130         ss << "]";
131         ss << "[";
132         ss << raw_data;
133         ss << "]";
134         ss << "[";
135         ss << block_data;
136         ss << "]";
137
138         std::string s = ss.str ();
139
140         uchar *out = new uchar[s.size ()];
141         memcpy (out, s.c_str (), s.size ());
142
143         size = s.size ();
144         return out;
145 }
146