mirror of
https://github.com/nmap/nmap.git
synced 2025-12-07 05:01:29 +00:00
Use lookup table for 1-char strings, not std::map for string_pool.
This commit is contained in:
23
charpool.cc
23
charpool.cc
@@ -84,6 +84,24 @@ void cp_free(void) {
|
|||||||
return g_charpool.clear();
|
return g_charpool.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class StrTable {
|
||||||
|
public:
|
||||||
|
StrTable() {
|
||||||
|
memset(table, 0, sizeof(table));
|
||||||
|
for (int i = 1; i <= CHAR_MAX; i++) {
|
||||||
|
table[i*2] = static_cast<char>(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const char *get(char c) { assert(c >= 0); return &table[c*2]; }
|
||||||
|
private:
|
||||||
|
char table[2*(CHAR_MAX + 1)];
|
||||||
|
};
|
||||||
|
static StrTable g_table;
|
||||||
|
|
||||||
|
const char *cp_char2str(char c) {
|
||||||
|
return g_table.get(c);
|
||||||
|
}
|
||||||
|
|
||||||
CharPool::CharPool(size_t init_sz) {
|
CharPool::CharPool(size_t init_sz) {
|
||||||
assert(init_sz >= 256);
|
assert(init_sz >= 256);
|
||||||
/* Create our char pool */
|
/* Create our char pool */
|
||||||
@@ -103,6 +121,11 @@ void CharPool::clear(void) {
|
|||||||
const char *CharPool::dup(const char *src, int len) {
|
const char *CharPool::dup(const char *src, int len) {
|
||||||
if (len < 0)
|
if (len < 0)
|
||||||
len = strlen(src);
|
len = strlen(src);
|
||||||
|
if (len == 0)
|
||||||
|
return g_table.get('\0');
|
||||||
|
else if (len == 1)
|
||||||
|
return g_table.get(*src);
|
||||||
|
|
||||||
int sz = len + 1;
|
int sz = len + 1;
|
||||||
char *p = buckets.back() + nexti;
|
char *p = buckets.back() + nexti;
|
||||||
|
|
||||||
|
|||||||
@@ -70,6 +70,8 @@
|
|||||||
/* len does not include null terminator */
|
/* len does not include null terminator */
|
||||||
const char *cp_strndup(const char *src, int len);
|
const char *cp_strndup(const char *src, int len);
|
||||||
const char *cp_strdup(const char *src);
|
const char *cp_strdup(const char *src);
|
||||||
|
// Returns a pointer to a 1-char string
|
||||||
|
const char *cp_char2str(char c);
|
||||||
|
|
||||||
void cp_free(void);
|
void cp_free(void);
|
||||||
|
|
||||||
|
|||||||
@@ -100,6 +100,11 @@ typedef std::set<StringPoolItem> StringPool;
|
|||||||
const char *string_pool_insert_len(const char *s, int len)
|
const char *string_pool_insert_len(const char *s, int len)
|
||||||
{
|
{
|
||||||
static StringPool pool;
|
static StringPool pool;
|
||||||
|
if (len == 0)
|
||||||
|
return "";
|
||||||
|
else if (len == 1)
|
||||||
|
return cp_char2str(*s);
|
||||||
|
|
||||||
StringPoolItem spi (s, len);
|
StringPoolItem spi (s, len);
|
||||||
|
|
||||||
StringPool::iterator it = pool.insert(spi).first;
|
StringPool::iterator it = pool.insert(spi).first;
|
||||||
|
|||||||
Reference in New Issue
Block a user