Prakticke aspekty vývoje softwaru: Projekt 1 – Testování
1.0
Projekt zaměřený na osvojení praktik testování včetně technik test driven development, black box testing a white box testing.
|
Deklarace metod tridy reprezentujici hashovácí tabulku. ...
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <stdbool.h>
Zobrazit zdrojový text tohoto souboru.
Datové struktry | |
struct | hash_map_item |
Záznam v hašovací tabulce. ... | |
struct | hash_map |
Datový typ hašovací tabulky. ... | |
Definice maker | |
#define | HASH_MAP_INIT_SIZE 8 |
Inicializační velikost tabulky. | |
#define | HASH_MAP_PERTURB_SHIFT 5 |
Parametr použit v hledání dalšího indexu při kolizi. | |
#define | HASH_MAP_REALLOCATION_THRESHOLD 3/5. |
Mez zaplnění kdy se má realokovat velikost tabulky. | |
#define | HASH_FUNCTION_PARAM_A 1794967309 |
Hyperparametr v hašovácí funkci. | |
#define | HASH_FUNCTION_PARAM_B 7 |
Hyperparametr v hašovácí funkci. | |
Definice typů | |
typedef struct hash_map_item | hash_map_item_t |
Záznam v hašovací tabulce. ... | |
typedef struct hash_map | hash_map_t |
Datový typ hašovací tabulky. ... | |
Výčty | |
enum | hash_map_state_code_t { OK, MEMORY_ERROR, VALUE_ERROR, KEY_ERROR, KEY_ALREADY_EXISTS } |
Výčet návratových hodnot. ... | |
Funkce | |
hash_map_t * | hash_map_ctor () |
Konstruktor hašovací tabulky. ... | |
void | hash_map_dtor (hash_map_t *self) |
Destruktor hašovací tabulky. ... | |
void | hash_map_clear (hash_map_t *self) |
Dealokace vytvořeních položek a vymazání indexu. ... | |
hash_map_state_code_t | hash_map_reserve (hash_map_t *self, size_t size) |
Realokace rezervovaného místa pro index. ... | |
size_t | hash_map_size (hash_map_t *self) |
Vrací počet vložených záznamů do tabulky. ... | |
size_t | hash_map_capacity (hash_map_t *self) |
Vrací alokované místa pro tabulku. ... | |
bool | hash_map_contains (hash_map_t *self, const char *key) |
Obsahuje tabulka záznam s daným klíčem? ... | |
hash_map_state_code_t | hash_map_put (hash_map_t *self, const char *key, int value) |
Vloží klíč a hodnotu do tabulky. ... | |
hash_map_state_code_t | hash_map_get (hash_map_t *self, const char *key, int *value) |
Uloží hodnotu asociovanou se zadaným klíčem na určené místo v paměti. ... | |
hash_map_state_code_t | hash_map_pop (hash_map_t *self, const char *key, int *value) |
Uloží hodnotu z hašovací tabulky a odstraní záznam. ... | |
hash_map_state_code_t | hash_map_remove (hash_map_t *self, const char *key) |
Odstranění položky z hašovací tabulky. ... | |
Deklarace metod tridy reprezentujici hashovácí tabulku.
Hasovaci tabulka je vyhledavaci datova struktura, ktera asociuje hasovaci klice s hodnotami.
typedef struct hash_map_item hash_map_item_t |
Záznam v hašovací tabulce.
Položka v hašovací tabulce. Pro efektivnější procházení (např. při dealokaci paměti) a prací s pamětí (projeví se při velkých indexech) jsou vložené položky implementované formou obousměrně vázaného seznamu a index obsahuje pouze ukazatele do tohoto seznamu. Pořadí položek v seznamu odpovídá pořadí vložení daného klíče do tabulky.
Uživatel by k položkám struktury neměl přistupovat přímo, ale pomocí definovaného rozhraní níže. Nicméně v rámci testování můžete přímo testovat, zda rozhraní pracuje s tímto datovým typem korektně.
typedef struct hash_map hash_map_t |
Datový typ hašovací tabulky.
Uživatel by k položkám struktury neměl přistupovat přímo, ale pomocí definovaného rozhraní níže. Nicméně v rámci testování můžete přímo testovat, zda rozhraní pracuje s tímto datovým typem korektně.
Výčet návratových hodnot.
Výčet obsahující návratové hodnoty funkcí. Pokud nedojde k chybě, funkce vrací hodnotu OK
. V případě problémů s alokací paměti se vrátí návratová hodnota MEMORY_ERROR
. Podrobnější sémantika ostatních hodnot je popsána u jednotlivých funkcí.
size_t hash_map_capacity | ( | hash_map_t * | self | ) |
Vrací alokované místa pro tabulku.
hash_map_size(map)
se nerovná hash_map_capacity(map)
! Jelikož je alokace (resp. realokace) paměti časově "drahá" operace, alokuje se vždy více paměti než je aktuálně potřeba. K realokaci tedy dochází jen když je potřeba a výrazně méně často.[in] | self | Ukazatel na strukturu hašovací tabulky. |
void hash_map_clear | ( | hash_map_t * | self | ) |
Dealokace vytvořeních položek a vymazání indexu.
[in] | self | Ukazatel na strukturu hašovací tabulky. |
bool hash_map_contains | ( | hash_map_t * | self, |
const char * | key | ||
) |
Obsahuje tabulka záznam s daným klíčem?
Vyhledá zadaný klíč v tabulce a pokud tabulka obsahuje pod daným klíčem záznam, vrátí nenulovou hodnotu.
[in] | self | Ukazatel na strukturu hašovací tabulky. |
[in] | key | Klíč do tabulky. |
hash_map_t* hash_map_ctor | ( | ) |
Konstruktor hašovací tabulky.
Vytvoří a inicializuje hašovací tabulku s velikostí indexu 8, tzn. hašovací tabulka může obsahovat 8 záznamů s různými klíči.
Příklad užití:
NULL
.void hash_map_dtor | ( | hash_map_t * | self | ) |
Destruktor hašovací tabulky.
Uklidí a uvolní paměť alokovanou hašovací tabulkou, tzn. jednotlivé položky seznamu, index a následně samotnou tabulku self
.
Příklad užití:
[in] | self | Ukazatel na hašovací tabulku |
hash_map_state_code_t hash_map_get | ( | hash_map_t * | self, |
const char * | key, | ||
int * | value | ||
) |
Uloží hodnotu asociovanou se zadaným klíčem na určené místo v paměti.
Vyhledá klíč v tabulce a uloží hodnotu přiřazenou ke klíči na místo kde ukazuje argument value
. Pokud tabulka neobsahuje k danému klíči žádný záznam, vrací hodnotu KEY_ERROR
.
Příklad užití:
[in] | self | Ukazatel na strukturu hašovací tabulky. |
[in] | key | Klíč do tabulky. |
[out] | value | Ukazatel na místo, kde se uloží hodnota. |
KEY_ERROR
pokud se klíč nenachází v tabulce, jinak OK
. hash_map_state_code_t hash_map_pop | ( | hash_map_t * | self, |
const char * | key, | ||
int * | value | ||
) |
Uloží hodnotu z hašovací tabulky a odstraní záznam.
Vyhledá klíč v tabulce, uloží hodnotu přiřazenou ke klíči na místo kde ukazuje parametr value
a odstraní záznam z tabulky. Pokud tabulka neobsahuje k danému klíči žádný záznam, vrací hodnotu KEY_ERROR
.
Příklad užití:
[in] | self | Ukazatel na strukturu hašovací tabulky. |
[in] | key | Klíč do tabulky. |
[out] | value | Ukazatel na místo, kde se uloží hodnota. |
KEY_ERROR
pokud se klíč nenachází v tabulce, jinak OK
.hash_map_state_code_t hash_map_put | ( | hash_map_t * | self, |
const char * | key, | ||
int | value | ||
) |
Vloží klíč a hodnotu do tabulky.
Pokud je již index tabulky zaplněn ze 2/3, realokuje pro index 2x větší místo v paměti a provede reindexaci. Pokud tabulka již obsahuje k danému klíči záznam, hodnota záznamu se přepíše a funkce vrací hodnotu KEY_ALREADY_EXISTS
.
Příklad užití:
[in] | self | Ukazatel na strukturu hašovací tabulky. |
[in] | key | Klíč do tabulky. |
[in] | value | Hodnota k uložení. |
KEY_ALREADY_EXISTS
pokud se klíč nachází v tabulce, jinak OK
.hash_map_state_code_t hash_map_remove | ( | hash_map_t * | self, |
const char * | key | ||
) |
Odstranění položky z hašovací tabulky.
Vyhledá klíč v tabulce a odstraní záznam z tabulky. Pokud tabulka neobsahuje k danému klíči žádný záznam, vrací hodnotu KEY_ERROR}
.
Příklad užití:
[in] | self | Ukazatel na strukturu hašovací tabulky. |
[in] | key | Klíč do tabulky. |
KEY_ERROR
pokud se klíč nenachází v tabulce, jinak OK
.hash_map_state_code_t hash_map_reserve | ( | hash_map_t * | self, |
size_t | size | ||
) |
Realokace rezervovaného místa pro index.
Funkce je implicitně volána ve funci hash_map_put
, když je potřeba.
Příklad užití:
VALUE_ERROR
.[in] | self | Ukazatel na strukturu hašovací tabulky. |
[in] | size | Velikost indexu. |
VALUE_ERROR
pokud bude nová rezervovaná velikost hašovací tabulky menší jak počet doposud vložených prvků, jinak OK
.size_t hash_map_size | ( | hash_map_t * | self | ) |
Vrací počet vložených záznamů do tabulky.
[in] | self | Ukazatel na strukturu hašovací tabulky. |