00001 /* 00002 * Copyright 2007, 2008 Ernesto Coutinho Colla 00003 * 00004 * "BN Parallel Package" é um nome que identifica o conjunto de programas 00005 * que forma uma biblioteca de rotinas que foram desenvolvidas como parte da 00006 * dissertação de mestrado do autor em Ciências da Computação. 00007 * 00008 * O conjunto de programas foi integralmente desenvolvido pelo autor e está 00009 * disponível sob a licença GPL (GNU General Public License). O entendimento 00010 * integral dos termos da licença GPL é condição necessária para a utilização 00011 * parcial ou integral de qualquer parte deste conjunto de programas. 00012 * 00013 * This file is part of BN Parallel Package. 00014 * 00015 * BN Parallel Package is free software: you can redistribute it and/or modify 00016 * it under the terms of the GNU General Public License as published by 00017 * the Free Software Foundation, either version 3 of the License. 00018 * 00019 * BN Parallel Package is distributed in the hope that it will be useful, 00020 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00021 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00022 * GNU General Public License for more details. 00023 * 00024 * You should have received a copy of the GNU General Public License 00025 * along with BN Parallel Package. If not, see <http://www.gnu.org/licenses/>. 00026 */ 00027 00028 00029 /*! 00030 * @file hash.h 00031 * @author Ernesto Colla (ernesto@gmail.com) 00032 * @version 0.0.1 00033 * @date Abril/2007 00034 * @brief Implementação de uma estrutura para criar hashs que mapeiam strings-números_reais, ou seja, pares chave-valor. 00035 * 00036 * Implementação de uma biblioteca genérica para trabalhar com hashs que mapeiam palavras (strings) a números reais. 00037 */ 00038 00039 #ifndef HASH_H 00040 #define HASH_H 00041 00042 /* Defines */ 00043 00044 #define HASH_MAX 100 //!< Tamanho máximo da chave do hash 00045 00046 #define get16bits(d) (*((const uint16_t *) (d))) //!< Macro para fazer cast de valores utilizada na rotina que gera o hash 00047 00048 /* Definição dos tipos de dados */ 00049 00050 /*! Estrutura de dados utilizada para armazenar o conteúdo do hash */ 00051 typedef struct struct_Hash { 00052 int length; //!< Tamanho (número de elementos) do hash. 00053 struct struct_HashNode** nodes; //!< Nó utilizado para armazenar o conteúdo do hash. 00054 } Hash; 00055 00056 /*! HashNode de uma lista ligada */ 00057 typedef struct struct_HashNode { 00058 char* key; //!< Chave que identifica o elemento no hash. 00059 double value; //!< Valor numérico armazenado no elemento do hash. 00060 struct struct_HashNode* next; //!< Ponteiro para o próximo \e node da lista na estrutura de armazenamento do hash. 00061 } HashNode; 00062 00063 00064 /*! 00065 * @brief Função de espalhamento que gera o indicador da posição a partir da chave do hash. 00066 * @param[in] key Chave que identifica o elemento do hash. 00067 * @return Valor correspondente à posição no array de armazenamento de dados. 00068 */ 00069 int hashIndex (char* key); 00070 00071 /*! 00072 * @brief Cria um novo hash vazio. 00073 * @return Ponteiro para um hash criado. 00074 */ 00075 00076 Hash* newHash (); 00077 00078 /*! 00079 * @brief Destrói um hash e desaloda todo conteúdo alocado. 00080 * @param[out] refHash Referência para o hash a ser destruído. 00081 */ 00082 00083 void destroyHash (Hash** refHash); 00084 00085 /*! 00086 * @brief Retorna o tamanho, número de elementos ou pares chave-valor, do hash. 00087 * @return Tamanho do hash. 00088 */ 00089 00090 int hlength(Hash* Hash); 00091 00092 /*! 00093 * @brief Informa se o hash possui uma determinada chave armazenada. 00094 * @param[in] hash Hash a ser consultado. 00095 * @param[in] key Chave que se deseja saber se está armazenada no hash. 00096 * @return '1': se houver um elemento correspondente à chave procurada. '0': caso contrário. 00097 */ 00098 00099 int hcontains (Hash* hash, char* key); 00100 00101 00102 /*! 00103 * @brief Retorna do hash o valor armazenado correspondente à chave. 00104 * @param[in] hash Hash a ser consultado. 00105 * @param[in] key Chave do qual se deseja o valor armazenado. 00106 * @return Valor correspondente à chave armazenada no hash ou '\\0' caso o hash não tenha a chave procurada. 00107 */ 00108 00109 double hget (Hash* hash, char* key); 00110 00111 /*! 00112 * @brief Adiciona um par chave-valor em um hash. 00113 * @param[out] refHash Referência para o hash no qual o par chave-valor será armazenado 00114 * @param[in] key Chave do par chave-valor que será armazenado. 00115 * @param[in] value Valor do par chave-valor que será armazenado. 00116 * @return Número de elementos armazenados no hash. 00117 */ 00118 00119 int hput (Hash** refHash,char* key, double value); 00120 00121 /*! 00122 * @brief Cria um novo node da lista ligada utilizada para armazenar os dados do hash. 00123 * @return Ponteiro para um novo node da lista ligada. 00124 */ 00125 00126 HashNode* newHashNode (); 00127 00128 /*! 00129 * @brief Constrói um novo node da lista ligada utilizada para armazenar os dados do hash. 00130 * @param[in] key Chave do par chave-valor que será armazenado. 00131 * @param[in] value Valor do par chave-valor que será armazenado. 00132 * @return Ponteiro para um novo node da lista ligada. 00133 */ 00134 00135 HashNode* buildHashNode (char* key, double value); 00136 00137 /*! 00138 * @brief Destrói um HashNode e desaloda todo conteúdo alocado. 00139 * @param[out] refNode Referência para o node a ser destruído. 00140 */ 00141 00142 void destroyHashNode(HashNode** refNode); 00143 00144 /*! 00145 * @brief Dump do conteúdo armazenado no hash 00146 * @param[in] hash Hash do qual será feito o dump. 00147 */ 00148 00149 void dumpHash(Hash* hash); 00150 00151 #endif