]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs/indices.h
subo algunas ideas que no se si prosperaran pero supongo que es en lo que trabajaremo...
[z.facultad/75.06/emufs.git] / emufs / indices.h
1
2 #ifndef _INDICES_H_
3 #define _INDICES_H_
4
5 #include <stdlib.h>
6 #include <string.h>
7
8 #define STRUCT_OFFSET(x, y) ((int)(&(x->y))-(int)(x))
9
10 typedef struct _emu_fs_t EMUFS;
11
12 typedef struct _reg_def_ {
13         unsigned long id;
14         unsigned long bloque;
15 } INDICE_DATO;
16
17 /** Tipos de Indices conocidos */
18 typedef enum {
19         IND_B, /**< Utilizacion de Arboles B */
20         IND_B_ASC /**< Utilizacion de Arboles B* */
21 } INDICE_TIPO;
22
23 typedef enum {
24         IND_PRIMARIO,
25         IND_SELECCION,
26         IND_EXAHUSTIVO
27 } INDICE_FUNCION;
28
29 /** Tipos de datos soportados para las claves */
30 typedef enum {IDX_FLOAT, IDX_INT} INDICE_TIPO_DATO;
31
32 /** Clave de indice */
33 typedef union _data_ {
34         float f_clave;
35         int i_clave;
36 } CLAVE;
37
38 /** Manejo de Indices independiente */
39 typedef struct _indices_h_ {
40         INDICE_TIPO tipo;             /**< Tipo de indice */
41         INDICE_TIPO_DATO tipo_dato;   /**< Tipo de dato a manejar */
42         INDICE_FUNCION funcion;       /**< Funcion del indice */
43         int offset;                   /**< Offset desde el inicio del dato hasta el lugar donde esta la clave */
44         unsigned int tam_bloque;      /**< Tamaño del bloque (nodo). Deber set multiplo de 512! */
45
46         /** Agrega la clave k de posicion location en el 
47          * indice de forma ordenada
48          */
49         int (*agregar_entrada)(struct _indices_h_ *idx, CLAVE k, INDICE_DATO dato);
50         /** Borra del indice la clave k */
51         int (*borrar_entrada)(struct _indices_h_ *idx, CLAVE k);
52         /** Determina si existe la clave k retornando su posicion o -1
53          * en caso fallido
54          */
55         INDICE_DATO (*existe_entrada)(struct _indices_h_ *idx, CLAVE k);
56         
57         INDICE_DATO *(*buscar_entradas)(struct _indices_h_ *idx, CLAVE k, int *cant);
58
59         char *nombre;   /**< Nombre único de busqueda del indice */
60         char *filename; /**< nombre del archivo de indice */
61
62         struct _indices_h_ *sig; /**< Siguiente indice */
63 } INDICE;
64
65 /** Crea un nuevo indice
66  *
67  *  \param emu EMUFS a quien pertenece
68  *  \param nombre Nombre del indice
69  *  \param tipo Tipo de indice
70  *  \param tipo_dato Tipo de dato de la clave
71  *  \param offset Desplazamiento de la clave dentro del dato
72  *  \param tam_bloque Tamaño del bloque (nodo) del arbol
73  */
74 INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned tam_bloque);
75
76 /** Destruye un indice
77  *
78  *  \todo hacer/revisar
79  */
80 void emufs_indice_destruir(EMUFS *emu, INDICE *i);
81
82 /** Agrega una clave en los indices
83  * 
84  *  Agrega la clave en todos los indice, dependiendo de su tipo
85  *  de dato, tipo de arboo, offset, etc
86  *
87  *  \param primer Primer indice a agregar
88  *  \param data Array de datos desde donde tomar las claves
89  *  \param ubicacion Dato a guardar asociado a la clave
90  */
91 void emufs_indice_agregar(INDICE *primero, char *data, INDICE_DATO dato);
92
93 INDICE_DATO emufs_indice_buscar(INDICE *primero, char *data);
94
95 /** Compara 2 claves de la forma c1 < c2 */
96 int emufs_indice_es_menor(INDICE *idx, CLAVE c1, CLAVE c2);
97
98 /** Compara 2 claves de la forma c1 == c2 */
99 int emufs_indice_es_igual(INDICE *idx, CLAVE c1, CLAVE c2);
100 #endif
101