X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a18ee7e5c3fa16fd2c277182dd0dfdeab1dc1eb7..9992c04bba629eccd44905b4db102436727a779d:/src/xbt/dict.cpp diff --git a/src/xbt/dict.cpp b/src/xbt/dict.cpp index 5184ea274e..6573bb88ed 100644 --- a/src/xbt/dict.cpp +++ b/src/xbt/dict.cpp @@ -1,6 +1,6 @@ /* dict - a generic dictionary, variation over hash table */ -/* Copyright (c) 2004-2020. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2004-2022. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -8,13 +8,14 @@ #include "xbt/dict.h" #include "dict_private.h" #include "simgrid/Exception.hpp" -#include "src/xbt_modinter.h" #include "xbt/ex.h" #include "xbt/log.h" #include "xbt/mallocator.h" #include "xbt/str.h" #include "xbt/string.hpp" +#include "xbt/xbt_modinter.h" +#include #include #include @@ -89,21 +90,22 @@ static void xbt_dict_rehash(xbt_dict_t dict) const unsigned oldsize = dict->table_size + 1; unsigned newsize = oldsize * 2; - xbt_dictelm_t *currcell = (xbt_dictelm_t *) xbt_realloc((char *) dict->table, newsize * sizeof(xbt_dictelm_t)); - memset(&currcell[oldsize], 0, oldsize * sizeof(xbt_dictelm_t)); /* zero second half */ + auto* newtable = static_cast(xbt_realloc(dict->table, newsize * sizeof(xbt_dictelm_t))); + std::fill(newtable + oldsize, newtable + newsize, nullptr); /* zero second half */ newsize--; dict->table_size = newsize; - dict->table = currcell; + dict->table = newtable; XBT_DEBUG("REHASH (%u->%u)", oldsize, newsize); - for (unsigned i = 0; i < oldsize; i++, currcell++) { + for (unsigned i = 0; i < oldsize; i++) { + xbt_dictelm_t* currcell = &newtable[i]; if (*currcell == nullptr) /* empty cell */ continue; xbt_dictelm_t *twincell = currcell + oldsize; xbt_dictelm_t *pprev = currcell; xbt_dictelm_t bucklet = *currcell; - for (; bucklet != nullptr; bucklet = *pprev) { + while (bucklet != nullptr) { /* Since we use "& size" instead of "%size" and since the size was doubled, each bucklet of this cell must either: - stay in cell i (ie, currcell) - go to the cell i+oldsize (ie, twincell) */ @@ -116,6 +118,7 @@ static void xbt_dict_rehash(xbt_dict_t dict) } else { pprev = &bucklet->next; } + bucklet = *pprev; } if (*currcell == nullptr) /* everything moved */