From: Francois Fleuret Date: Mon, 6 Apr 2009 06:05:43 +0000 (+0200) Subject: Added some comments in the hash-table routines. X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=commitdiff_plain;h=90ff57010b59be548e67b6d49353d2ec3b6c4cff;p=selector.git Added some comments in the hash-table routines. --- diff --git a/selector.cc b/selector.cc index 71768e7..9c863a4 100644 --- a/selector.cc +++ b/selector.cc @@ -87,6 +87,10 @@ void check_opt(int argc, char **argv, int n_opt, int n, const char *help) { ////////////////////////////////////////////////////////////////////// // A quick and dirty hash table +// The table itself stores index of the strings in a char +// **table. When a string is added, if it was already in the table, +// the new index replaces the previous one. + int *new_hash_table(int hash_table_size) { int *result; result = new int[hash_table_size]; @@ -96,6 +100,10 @@ int *new_hash_table(int hash_table_size) { return result; } +// Adds new_string in the table, associated to new_index. If this +// string was not already in the table, returns -1. Otherwise, returns +// the previous index it had. + int test_and_add(char *new_string, int new_index, char **strings, int *hash_table, int hash_table_size) { unsigned int code = 0; @@ -110,16 +118,23 @@ int test_and_add(char *new_string, int new_index, code = code % hash_table_size; while(hash_table[code] >= 0) { + // There is a string with that code if(strcmp(new_string, strings[hash_table[code]]) == 0) { + // It is the same string, we keep a copy of the stored index int result = hash_table[code]; + // Put the new one hash_table[code] = new_index; + // And return the previous one return result; } + // This collision was not the same string, let's move to the next + // in the table code = (code + 1) % hash_table_size; } + // This string was not already in there, store the index in the + // table and return -1 hash_table[code] = new_index; - return -1; } @@ -622,8 +637,8 @@ int main(int argc, char **argv) { lines[nb_lines] = new char[strlen(s) + 1]; strcpy(lines[nb_lines], s); } else { - // We do not allocate a new string but use the pointer to the - // first occurence of it + // The string was already in there, so we do not allocate a + // new string but use the pointer to the first occurence of it lines[nb_lines] = lines[dup]; lines[dup] = 0; }