Revision: 75281
http://sourceforge.net/p/brlcad/code/75281
Author: starseeker
Date: 2020-04-07 12:49:21 +0000 (Tue, 07 Apr 2020)
Log Message:
-----------
Use C++ set and unordered_map instead of the Tcl hash table for dbconcat
Modified Paths:
--------------
brlcad/trunk/src/libged/concat.cpp
Modified: brlcad/trunk/src/libged/concat.cpp
===================================================================
--- brlcad/trunk/src/libged/concat.cpp 2020-04-07 11:22:10 UTC (rev 75280)
+++ brlcad/trunk/src/libged/concat.cpp 2020-04-07 12:49:21 UTC (rev 75281)
@@ -25,6 +25,10 @@
#include "common.h"
+#include <string>
+#include <set>
+#include <unordered_map>
+
#include <string.h>
#include "bu/cmd.h"
@@ -58,23 +62,18 @@
* find a new unique name given a list of previously used names, and
* the type of naming mode that described what type of affix to use.
*/
-static char *
+static std::string
get_new_name(const char *name,
struct db_i *dbip,
- Tcl_HashTable *name_tbl,
- Tcl_HashTable *used_names_tbl,
+ std::unordered_map<std::string, std::string> &name_map,
+ std::set<std::string> &used_names,
struct ged_concat_data *cc_data)
{
struct bu_vls new_name = BU_VLS_INIT_ZERO;
- Tcl_HashEntry *ptr = NULL;
char *aname = NULL;
- char *ret_name = NULL;
- int int_new=0;
long num=0;
RT_CK_DBI(dbip);
- BU_ASSERT(name_tbl);
- BU_ASSERT(used_names_tbl);
BU_ASSERT(cc_data);
if (!name) {
@@ -82,10 +81,11 @@
name = "UNKNOWN";
}
- ptr = Tcl_CreateHashEntry(name_tbl, name, &int_new);
+ std::string nname = std::string(name);
- if (!int_new) {
- return (char *)Tcl_GetHashValue(ptr);
+ // If we already have a mapping assigned for this object name, reuse it.
+ if (name_map.find(nname) != name_map.end()) {
+ return name_map[nname];
}
do {
@@ -148,7 +148,7 @@
num++;
} while (db_lookup(dbip, aname, LOOKUP_QUIET) != RT_DIR_NULL ||
- Tcl_FindHashEntry(used_names_tbl, aname) != NULL);
+ (used_names.find(std::string(aname)) != used_names.end()));
/* if they didn't get what they asked for, warn them */
if (num > 1) {
@@ -161,13 +161,12 @@
}
}
- /* we should now have a unique name. store it in the hash */
- ret_name = bu_vls_strgrab(&new_name);
- Tcl_SetHashValue(ptr, (ClientData)ret_name);
- (void)Tcl_CreateHashEntry(used_names_tbl, ret_name, &int_new);
+ /* we should now have a unique name. store it in the map and the
used_names set */
+ name_map[nname] = std::string(bu_vls_cstr(&new_name));
+ used_names.insert(name_map[nname]);
bu_vls_free(&new_name);
- return ret_name;
+ return name_map[nname];
}
@@ -174,11 +173,12 @@
static void
adjust_names(union tree *trp,
struct db_i *dbip,
- Tcl_HashTable *name_tbl,
- Tcl_HashTable *used_names_tbl,
+ std::unordered_map<std::string, std::string> &name_map,
+ std::set<std::string> &used_names,
struct ged_concat_data *cc_data)
{
- char *new_name;
+ std::string new_name;
+ std::string old_name;
if (trp == NULL) {
return;
@@ -186,11 +186,12 @@
switch (trp->tr_op) {
case OP_DB_LEAF:
+ old_name = std::string(trp->tr_l.tl_name);
new_name = get_new_name(trp->tr_l.tl_name, dbip,
- name_tbl, used_names_tbl, cc_data);
- if (new_name) {
+ name_map, used_names, cc_data);
+ if (old_name != new_name) {
bu_free(trp->tr_l.tl_name, "leaf name");
- trp->tr_l.tl_name = bu_strdup(new_name);
+ trp->tr_l.tl_name = bu_strdup(new_name.c_str());
}
break;
case OP_UNION:
@@ -198,15 +199,15 @@
case OP_SUBTRACT:
case OP_XOR:
adjust_names(trp->tr_b.tb_left, dbip,
- name_tbl, used_names_tbl, cc_data);
+ name_map, used_names, cc_data);
adjust_names(trp->tr_b.tb_right, dbip,
- name_tbl, used_names_tbl, cc_data);
+ name_map, used_names, cc_data);
break;
case OP_NOT:
case OP_GUARD:
case OP_XNOP:
adjust_names(trp->tr_b.tb_left, dbip,
- name_tbl, used_names_tbl, cc_data);
+ name_map, used_names, cc_data);
break;
}
}
@@ -217,8 +218,8 @@
struct directory *input_dp,
struct db_i *input_dbip,
struct db_i *curr_dbip,
- Tcl_HashTable *name_tbl,
- Tcl_HashTable *used_names_tbl,
+ std::unordered_map<std::string, std::string> &name_map,
+ std::set<std::string> &used_names,
struct ged_concat_data *cc_data)
{
struct rt_db_internal ip;
@@ -226,7 +227,7 @@
struct rt_dsp_internal *dsp;
struct rt_comb_internal *comb;
struct directory *new_dp;
- char *new_name;
+ std::string new_name;
if (rt_db_get_internal(&ip, input_dp, input_dbip, NULL, &rt_uniresource) <
0) {
bu_vls_printf(gedp->ged_result_str,
@@ -241,16 +242,16 @@
case DB5_MINORTYPE_BRLCAD_COMBINATION:
comb = (struct rt_comb_internal *)ip.idb_ptr;
RT_CK_COMB(comb);
- adjust_names(comb->tree, curr_dbip, name_tbl, used_names_tbl,
cc_data);
+ adjust_names(comb->tree, curr_dbip, name_map, used_names,
cc_data);
break;
case DB5_MINORTYPE_BRLCAD_EXTRUDE:
extr = (struct rt_extrude_internal *)ip.idb_ptr;
RT_EXTRUDE_CK_MAGIC(extr);
- new_name = get_new_name(extr->sketch_name, curr_dbip, name_tbl,
used_names_tbl, cc_data);
- if (new_name) {
+ new_name = get_new_name(extr->sketch_name, curr_dbip, name_map,
used_names, cc_data);
+ if (new_name.length()) {
bu_free(extr->sketch_name, "sketch name");
- extr->sketch_name = bu_strdup(new_name);
+ extr->sketch_name = bu_strdup(new_name.c_str());
}
break;
case DB5_MINORTYPE_BRLCAD_DSP:
@@ -260,10 +261,10 @@
if (dsp->dsp_datasrc == RT_DSP_SRC_OBJ) {
/* This dsp references a database object, may need to
change its name */
new_name = get_new_name(bu_vls_addr(&dsp->dsp_name),
curr_dbip,
- name_tbl, used_names_tbl,
cc_data);
- if (new_name) {
+ name_map, used_names, cc_data);
+ if (new_name.length()) {
bu_vls_free(&dsp->dsp_name);
- bu_vls_strcpy(&dsp->dsp_name, new_name);
+ bu_vls_strcpy(&dsp->dsp_name, new_name.c_str());
}
}
break;
@@ -270,15 +271,15 @@
}
}
- new_name = get_new_name(input_dp->d_namep, curr_dbip, name_tbl,
used_names_tbl, cc_data);
- if (!new_name) {
- new_name = input_dp->d_namep;
+ new_name = get_new_name(input_dp->d_namep, curr_dbip, name_map,
used_names, cc_data);
+ if (!new_name.length()) {
+ new_name = std::string(input_dp->d_namep);
}
- if ((new_dp = db_diradd(curr_dbip, new_name, RT_DIR_PHONY_ADDR, 0,
input_dp->d_flags,
+ if ((new_dp = db_diradd(curr_dbip, new_name.c_str(), RT_DIR_PHONY_ADDR, 0,
input_dp->d_flags,
(void *)&input_dp->d_minor_type)) == RT_DIR_NULL) {
bu_vls_printf(gedp->ged_result_str,
"Failed to add new object name (%s) to directory -
aborting!!\n",
- new_name);
+ new_name.c_str());
return GED_ERROR;
}
@@ -285,7 +286,7 @@
if (rt_db_put_internal(new_dp, curr_dbip, &ip, &rt_uniresource) < 0) {
bu_vls_printf(gedp->ged_result_str,
"Failed to write new object (%s) to database -
aborting!!\n",
- new_name);
+ new_name.c_str());
return GED_ERROR;
}
@@ -298,10 +299,8 @@
{
struct db_i *newdbp;
struct directory *dp;
- Tcl_HashTable name_tbl;
- Tcl_HashTable used_names_tbl;
- Tcl_HashEntry *ptr;
- Tcl_HashSearch search;
+ std::unordered_map<std::string, std::string> name_map;
+ std::set<std::string> used_names;
struct bu_attribute_value_set g_avs;
const char *cp;
char *colorTab;
@@ -441,9 +440,6 @@
cc_data.old_dbip = gedp->ged_wdbp->dbip;
/* visit each directory pointer in the input database */
- Tcl_InitHashTable(&name_tbl, TCL_STRING_KEYS);
- Tcl_InitHashTable(&used_names_tbl, TCL_STRING_KEYS);
-
if (importUnits || importTitle || importColorTable) {
saveGlobalAttrs = 1;
}
@@ -457,7 +453,7 @@
}
continue;
}
- copy_object(gedp, dp, newdbp, gedp->ged_wdbp->dbip, &name_tbl,
&used_names_tbl, &cc_data);
+ copy_object(gedp, dp, newdbp, gedp->ged_wdbp->dbip, name_map,
used_names, &cc_data);
} FOR_ALL_DIRECTORY_END;
bu_vls_free(&cc_data.affix);
@@ -525,15 +521,6 @@
/* Update references. */
db_update_nref(gedp->ged_wdbp->dbip, &rt_uniresource);
- /* Free the Hash tables */
- ptr = Tcl_FirstHashEntry(&name_tbl, &search);
- while (ptr) {
- bu_free((char *)Tcl_GetHashValue(ptr), "new name");
- ptr = Tcl_NextHashEntry(&search);
- }
- Tcl_DeleteHashTable(&name_tbl);
- Tcl_DeleteHashTable(&used_names_tbl);
-
return GED_OK;
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits