1+ #ifndef __VECTOR_C__
2+ #define __VECTOR_C__
3+ #include "vector.h"
4+
5+ void __attribute__((constructor )) __constructor_array_dinamic__ ()
6+ {
7+ printf ("Constructor, vectores inicializados: %d, tamnos estructura vector: %lld\n" , vectores_resb , sizeof (vector ));
8+ tabla_vectores .tabla_vectores = (vector * * )malloc (vectores_resb * sizeof (vector * ));
9+
10+ for (size_t i = 0 ; i < vectores_resb ; i ++ )
11+ {
12+ tabla_vectores .tabla_vectores [i ] = (vector * )malloc (sizeof (vector ));
13+ tabla_vectores .tabla_vectores [i ]-> size = 0 ;
14+ tabla_vectores .tabla_vectores [i ]-> plexor = 0 ;
15+ }
16+ }
17+ void __attribute__((destructor )) __destructor_array_dinamic__ ()
18+ {
19+ puts ("Destructor" );
20+
21+ if (tabla_vectores .tabla_vectores != NULL )
22+ {
23+ for (size_t i = 0 ; i < tabla_vectores .vectores_ocupados ; i ++ )
24+ {
25+ if (tabla_vectores .tabla_vectores [i ] != NULL )
26+ {
27+ free_vector (tabla_vectores .tabla_vectores [i ]);
28+ }
29+ }
30+ free (tabla_vectores .tabla_vectores );
31+ }
32+
33+ puts ("Memoria liberada" );
34+ }
35+
36+
37+ void free_vector (vector * my_vector )
38+ {
39+ // liberar la memoria de un vector y su memoria asociada.
40+ for (size_t i = 0 ; i < my_vector -> size ; i ++ )
41+ {
42+ if (my_vector -> data [i ]-> estado == true)
43+ {
44+ free (my_vector -> data [i ]-> data );
45+ }
46+ free (my_vector -> data [i ]);
47+ }
48+ free (my_vector );
49+ }
50+
51+ vector * new_vector (size_t size , size_t size_data )
52+ {
53+
54+ tabla_vectores .vectores_ocupados ++ ;
55+ if (tabla_vectores .vectores_reserbados <= tabla_vectores .vectores_ocupados )
56+ {
57+ tabla_vectores .vectores_reserbados *= incrementador_v ;
58+ tabla_vectores .tabla_vectores = (vector * * )realloc (tabla_vectores .tabla_vectores , sizeof (vector * ) * tabla_vectores .vectores_reserbados );
59+ }
60+
61+ tabla_vectores .tabla_vectores [tabla_vectores .vectores_ocupados ] = (vector * )malloc (sizeof (vector ));
62+ tabla_vectores .tabla_vectores [tabla_vectores .vectores_ocupados ]-> data = (data_position * * )malloc (sizeof (data_position * ) * size_data );
63+ for (size_t i = 0 ; i < size ; i ++ )
64+ {
65+ // poner las posiciones del vector inicializadas y marcarlas como libres(false)
66+ tabla_vectores .tabla_vectores [tabla_vectores .vectores_ocupados ]-> data [i ] = (data_position * )malloc (sizeof (data_position ));
67+ tabla_vectores .tabla_vectores [tabla_vectores .vectores_ocupados ]-> data [i ]-> estado = false;
68+ }
69+ tabla_vectores .tabla_vectores [tabla_vectores .vectores_ocupados ]-> capacity = size ;
70+ tabla_vectores .tabla_vectores [tabla_vectores .vectores_ocupados ]-> size = 0 ;
71+ tabla_vectores .tabla_vectores [tabla_vectores .vectores_ocupados ]-> plexor = size_data ;
72+
73+ return tabla_vectores .tabla_vectores [tabla_vectores .vectores_ocupados ];
74+ }
75+
76+ size_t push_back (vector * my_vector , void * data )
77+ {
78+ // anade un elemento al final del vector
79+ if (my_vector -> size + 1 > my_vector -> capacity )
80+ {
81+ // redimensionar si no hay espacio para anadir un nuevo elemento
82+ my_vector -> capacity *= incrementador_v ;
83+ resize (my_vector , my_vector -> capacity );
84+ for (size_t i = my_vector -> size ; i < my_vector -> capacity ; i ++ )
85+ {
86+ // poner las posiciones del vector inicializadas y marcarlas como libres(false)
87+ my_vector -> data [i ] = (data_position * )malloc (sizeof (data_position ));
88+ my_vector -> data [i ]-> estado = false;
89+ }
90+ }
91+ my_vector -> data [my_vector -> size ]-> estado = true;
92+ my_vector -> data [my_vector -> size ]-> data = data ;
93+
94+ // retornar la posicion donde se encuentra el elemento agregado actualmente:
95+ return ++ my_vector -> size ;
96+ }
97+
98+ size_t pop_back (vector * my_vector )
99+ {
100+ if (my_vector -> size > 0 )
101+ {
102+ if (my_vector -> data [my_vector -> size ]-> estado == true)
103+ {
104+ // "elimina" el elemento al final del vector
105+ free (my_vector -> data [my_vector -> size ]-> data );
106+ // marcar como libre:
107+ my_vector -> data [my_vector -> size ]-> estado = false;
108+ }
109+ // retorna la posicicon del ultimo elemento
110+ return -- my_vector -> size ;
111+ }
112+ return 0 ;
113+ }
114+ size_t size (vector * my_vector )
115+ {
116+ // retorna el tamano
117+ return my_vector -> size ;
118+ }
119+ size_t max_size (vector * my_vector )
120+ {
121+ // retorna el tamano maximo
122+ return my_vector -> capacity ;
123+ }
124+ size_t get_size_position (vector * my_vector )
125+ {
126+ // obtener el espacio de una posicion del vector
127+ return my_vector -> plexor ;
128+ }
129+
130+ size_t vectores_sin_usar ()
131+ {
132+ return tabla_vectores .vectores_reserbados - tabla_vectores .vectores_ocupados ;
133+ }
134+ size_t vectores_ocupados ()
135+ {
136+ // retorna el tamano
137+ return tabla_vectores .vectores_ocupados ;
138+ }
139+ size_t vectores_reserbados ()
140+ {
141+ // retorna el tamano maximo
142+ return tabla_vectores .vectores_reserbados ;
143+ }
144+
145+ void * get_elment_v (vector * my_vector , size_t posicion )
146+ {
147+ // obtener un elemento
148+ return my_vector -> data [posicion ]-> data ;
149+ }
150+
151+ bool empty (vector * my_vector )
152+ {
153+ if (my_vector -> size - my_vector -> capacity == 0 )
154+ return true;
155+ else
156+ return false;
157+ }
158+
159+ void clear (vector * my_vector )
160+ {
161+ for (size_t i = 0 ; i < my_vector -> size ; i ++ )
162+ {
163+ if (my_vector -> data [i ]-> estado == true)
164+ {
165+ free (my_vector -> data [i ]-> data );
166+ }
167+ free (my_vector -> data [i ]);
168+ }
169+
170+ my_vector -> size = 0 ;
171+ }
172+
173+ void resize (vector * my_vector , size_t size )
174+ {
175+ if (size == my_vector -> capacity )
176+ {
177+ // No es necesario realizar cambios si el tamaño es el mismo
178+ return ;
179+ }
180+
181+ if (size < my_vector -> size )
182+ {
183+ // Liberar la memoria de las posiciones eliminadas
184+ for (size_t i = size ; i < my_vector -> size ; i ++ )
185+ {
186+ if (my_vector -> data [i ]-> estado == true)
187+ {
188+ free (my_vector -> data [i ]-> data );
189+ }
190+ free (my_vector -> data [i ]);
191+ }
192+ my_vector -> size = size ;
193+ }
194+
195+ // Crear un nuevo bloque de memoria con el tamaño deseado
196+ data_position * * new_data = (data_position * * )malloc (sizeof (data_position * ) * size );
197+ if (new_data == NULL )
198+ {
199+ // No se pudo asignar memoria, el vector no se modificará
200+ return ;
201+ }
202+
203+ // Copiar los elementos existentes al nuevo bloque de memoria conservando el orden
204+ for (size_t i = 0 ; i < size ; i ++ )
205+ {
206+ if (i < my_vector -> size )
207+ {
208+ new_data [i ] = my_vector -> data [i ];
209+ }
210+ else
211+ {
212+ // Crear nuevas estructuras data_position para las posiciones adicionales
213+ new_data [i ] = (data_position * )malloc (sizeof (data_position ));
214+ new_data [i ]-> estado = false;
215+ }
216+ }
217+
218+ // Liberar el bloque de memoria anterior
219+ free (my_vector -> data );
220+
221+ my_vector -> data = new_data ;
222+ my_vector -> capacity = size ;
223+ }
224+
225+
226+ void print_vector_info (vector * my_vector )
227+ {
228+ printf ("capacity: %zu\n" , my_vector -> capacity );
229+ printf ("data: %p\n" , my_vector -> data );
230+ printf ("size: %zu\n" , my_vector -> size );
231+ printf ("plexor: %zu\n" , my_vector -> plexor );
232+
233+ for (size_t i = 0 ; i < my_vector -> capacity ; i ++ )
234+ {
235+ printf ("data[%d]->data: \t%p \n" , i , my_vector -> data [i ]);
236+ if (my_vector -> data [i ] == NULL )
237+ {
238+ printf ("data[%d]->estado:\t%p\n" , i , NULL );
239+ }
240+ else
241+ {
242+ printf ("data[%d]->estado:\t%p\n" , i , my_vector -> data [i ]-> estado );
243+ }
244+ }
245+ }
246+
247+ #endif
0 commit comments