summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/rltiles/tool
diff options
context:
space:
mode:
authorennewalker <ennewalker@c06c8d41-db1a-0410-9941-cceddc491573>2008-12-07 19:13:56 +0000
committerennewalker <ennewalker@c06c8d41-db1a-0410-9941-cceddc491573>2008-12-07 19:13:56 +0000
commitb43c29a0451184b817fb46f73989df0c9ae9407d (patch)
tree171c1a59e5d46cc03b0befd2e60ed6a499f6413d /crawl-ref/source/rltiles/tool
parent669510fbfe20f5094a3cf5c48a1ccde908c6cfe5 (diff)
downloadcrawl-ref-b43c29a0451184b817fb46f73989df0c9ae9407d.tar.gz
crawl-ref-b43c29a0451184b817fb46f73989df0c9ae9407d.zip
Changing rltiles to store name -> idx lookup in a straight array, rather than a std::map. (This should hopefully fix Johanna's compile troubles.)
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7771 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/rltiles/tool')
-rw-r--r--crawl-ref/source/rltiles/tool/tile_list_processor.cc56
1 files changed, 38 insertions, 18 deletions
diff --git a/crawl-ref/source/rltiles/tool/tile_list_processor.cc b/crawl-ref/source/rltiles/tool/tile_list_processor.cc
index 35df77d221..37b12176bf 100644
--- a/crawl-ref/source/rltiles/tool/tile_list_processor.cc
+++ b/crawl-ref/source/rltiles/tool/tile_list_processor.cc
@@ -5,6 +5,7 @@
#include <fstream>
#include <string.h>
#include <stdlib.h>
+#include <map>
tile_list_processor::tile_list_processor() :
m_last_enum(~0),
@@ -646,7 +647,6 @@ bool tile_list_processor::write_data()
fprintf(fp, "// This file has been automatically generated.\n\n");
fprintf(fp, "#include \"tiledef-%s.h\"\n\n", lcname.c_str());
- fprintf(fp, "#include <map>\n");
fprintf(fp, "#include <string>\n");
fprintf(fp, "#include <assert.h>\n");
fprintf(fp, "using namespace std;\n\n");
@@ -727,17 +727,15 @@ bool tile_list_processor::write_data()
fprintf(fp, "};\n\n");
}
- fprintf(fp, "\nclass tile_%s_map : public map<string, int>\n"
- "{\n"
- "public:\n"
- " tile_%s_map();\n"
- "} %s_name_map;\n\n",
- lcname.c_str(), lcname.c_str(), lcname.c_str());
+ fprintf(fp, "\ntypedef std::pair<const char*, int> _tile_pair;\n\n");
fprintf(fp,
- "tile_%s_map::tile_%s_map()\n"
+ "_tile_pair %s_map_pairs[] =\n"
"{\n",
- lcname.c_str(), lcname.c_str());
+ lcname.c_str());
+
+ typedef std::map<std::string, int> sort_map;
+ sort_map table;
for (unsigned int i = 0; i < m_page.m_tiles.size(); i++)
{
@@ -750,11 +748,17 @@ bool tile_list_processor::write_data()
for (unsigned int c = 0; c < enumname.size(); c++)
lcenum[c] = std::tolower(enumname[c]);
- fprintf(fp, " insert(map<string, int>::value_type(\"%s\", %d + %s));\n",
- lcenum.c_str(), i, m_start_value.c_str());
+ table.insert(sort_map::value_type(lcenum, i));
}
- fprintf(fp, "}\n\n");
+ sort_map::iterator itor;
+ for (itor = table.begin(); itor != table.end(); itor++)
+ {
+ fprintf(fp, " _tile_pair(\"%s\", %d + %s),\n",
+ itor->first.c_str(), itor->second, m_start_value.c_str());
+ }
+
+ fprintf(fp, "};\n\n");
fprintf(fp,
"bool tile_%s_index(const char *str, unsigned int &idx)\n"
@@ -767,14 +771,30 @@ bool tile_list_processor::write_data()
" for (unsigned int i = 0; i < lc.size(); i++)\n"
" lc[i] = tolower(lc[i]);\n"
"\n"
- " map<string, int>::const_iterator itr = %s_name_map.find(lc);\n"
- " if (itr == %s_name_map.end())\n"
- " return false;\n"
+ " int num_pairs = sizeof(%s_map_pairs) / sizeof(%s_map_pairs[0]);\n"
+ "\n"
+ " int first = 0;\n"
+ " int last = num_pairs - 1;\n"
+ "\n"
+ " do\n"
+ " {\n"
+ " int half = (last - first) / 2 + first;\n"
+ " int cmp = strcmp(str, %s_map_pairs[half].first);\n"
+ " if (cmp < 0)\n"
+ " last = half - 1;\n"
+ " else if (cmp > 0)\n"
+ " first = half + 1;\n"
+ " else\n"
+ " {\n"
+ " idx = %s_map_pairs[half].second;\n"
+ " return true;\n"
+ " }\n"
+ "\n"
+ " } while (first <= last);\n"
"\n"
- " idx = itr->second;\n"
- " return true;\n"
+ " return false;\n"
"}\n",
- lcname.c_str(), lcname.c_str(), lcname.c_str());
+ lcname.c_str(), lcname.c_str(), lcname.c_str(), lcname.c_str(), lcname.c_str());
}
delete[] part_min;