// --------------------------------------------------------------------------------------------
// archivo  : xsdictionarys
// objetivo : header de funciones para manejo de diccionarios
// --------------------------------------------------------------------------------------------

#ifndef __xsDictionarys_H__
#define __xsDictionarys_H__

// Incluyo la librería xsEasy
#include "xsEasyC.h"
#include "xslists.h"

// Define la Estructura para los Nodos
Estructura stcNodoDiccionario
{
	
	// Tipo de Dato	
	Cadena    llave;
	Entero    tipo;	
    Entero    entero;		
	Caracter  caracter;
	Doble     doble;
	Cadena    cadena;
	
	// apuntador a siguiente
    Estructura stcNodoDiccionario *pSiguiente;
	
};

// Define el tipo de acuerdo a la Estructura
DefineTipo Estructura stcNodoDiccionario nodoDiccionario;

// Define la Estructura para Diccionario
Estructura stcDiccionario
{	
	// apuntador a cabeza
    Estructura stcNodoDiccionario* pCabeza;	
	Entero     elementos;
};

// Define el tipo de acuerdo a la Estructura
DefineTipo Estructura stcDiccionario Diccionario;

// Define la Estructura para los Nodos del Diccionario
Estructura elementoDiccionario
{	
	// Tipo de Dato	
	Entero    tipo;
	Cadena    llave;
    Entero    entero;		
	Caracter  caracter;
	Doble     doble;
	Cadena    cadena;		
};

DefineTipo Estructura elementoDiccionario ElementoDiccionario;

// Objetivo : Crear un Nodo de Diccionario
// Retorna  : el apuntador al Nodo
nodoDiccionario* NodoDiccionarioCrear(Cadena llave,  // La llave
                                      Entero tipo,   // El Tipo de Dato                                      
                                      ...);          // El Dato

				
// Objetivo : Actualizar un elemento en el Diccionario
// Retorna  : VERDAD/FALSO
Logico diccionarioActualizar(Diccionario diccionario, // diccionario actualizar
							 Cadena llave,    // La Llave
                             Entero tipo,     // El tipo de dato
					         ...);            // El dato

							 						   
// Objetivo : Buscar un Elemento en el diccionario
// Retorna  : La posición del Elemento; 0 si no la encuentra
Entero  diccionarioBuscar(Diccionario  *diccionario, // Diccionario donde se busca
						  Cadena       llave);      // La llave
					
					   
					   
// Objetivo : Obtiene un Elemento del diccionario
// Retorna  : El Elemento de la diccionario; el cual puede estar vacío si la llave es erroneo
ElementoDiccionario diccionarioElemento(Diccionario diccionario,                                
                                        Cadena llave); // La Llave

								
// Objetivo : Eliminar un Elemento en el diccionario
// Retorna  : VERDAD/FALSO
Logico diccionarioEliminar(Diccionario* diccionario,    // Diccionario donde se eliminará
                           Cadena       llave);         // La Llave

// Objetivo : Elimina un Elemento en el Diccionario por índice
// Retorna  : VERDAD/FALSO
Logico diccionarioEliminarIndice(Diccionario*  diccionario,  // Diccionario donde se eliminará
                                 Entero        indice);      // El índice del elemento a borra

						   
// Objetivo : Imprimir los Elementos de el diccionario
// Retorna  : Nada
Vacio diccionarioImprimir(Diccionario diccionario);

// Objetivo : Imprimir la Información de un Elemento del Diccionario
// Retorna  : Nada
Vacio diccionarioImprimirElemento(ElementoDiccionario elemento);

// Objetivo : Inicializar el diccionario
// Retorna  : Nada
Vacio diccionarioInicializar(Diccionario* diccionario);  // diccionario a Inicializar

// Objetivo : Insertar un Elemento en el final de la diccionario
// Retorna  : VERDAD/FALSO
Logico diccionarioInsertar(Diccionario* diccionario, // diccionario donde se inserta
						   Cadena llave,             // La Llave
                           Entero tipo,              // El tipo de dato
			  		       ...);                     // El dato

// Objetivo : Insertar un Elemento en el Diccionario en un indice determinado
// Retorna  : VERDAD/FALSO
Logico diccionarioInsertarIndice(Diccionario* diccionario,  // Diccionario donde se inserta
                                 Cadena llave,  // Llave del Diccionario
                                 Entero tipo,   // El tipo de dato
						         Entero indice, // El índice donde se inserta
			  		             ...);          // El tipo de dato
						   
// Objetivo : Devolver las llaves de un  diccionario en una lista
// Retorna  : La lista
Lista diccionarioLlaves(Diccionario  diccionario);

// Objetivo : Obtener el Número de Elementos del diccionario
// Retorna  : el Número de Elementos del diccionario; 0 si está vacía
Entero diccionarioLongitud(Diccionario diccionario); 


// Objetivo : Obtener el Tipo de Elemento de la diccionario, que todos tengan el mismo tipo
// Retorna  : TIPO_ENTERO, TIPO_CARACTER, TIPO_DOBLE, TIPO_CADENA
//            -1 en caso de que haya algún elemento con tipo distinto
Entero diccionarioTipo(Diccionario  diccionario);    // diccionario de la que se obtiene el tipo
							 
// Objetivo : Obtener el Tipo del Valor del Elemento indicado por la llave
// Retorna  : TIPO_ENTERO, TIPO_CARACTER, TIPO_DOBLE, TIPO_CADENA
//            -1 en caso de que no existe el indice del Elemento
Entero diccionarioTipoElemento(Diccionario  diccionario,    // diccionario en la que se buscar
                               Cadena       llave);         // La llave
						
// Objetivo : Vaciar  diccionario, eliminando todos sus elementos
// Retorna  : VERDAD/FALSO
Vacio diccionarioVaciar(Diccionario* diccionario);    // diccionario donde se eliminará

// Objetivo : Devolver los valores de un  diccionario en una lista
// Retorna  : La lista
Lista diccionarioValores(Diccionario  diccionario);

// fin de la Definición del Archivo
#endif