idhash.cpp
来自「一个用C++实现的C的Compiler。 代码风格良好。 原作者自己写了」· C++ 代码 · 共 77 行
CPP
77 行
#ifndef __IDHASH_CPP__
#define __IDHASH_CPP__
#include <string>
#include <memory>
#include "common.cpp"
using namespace std;
const int IDHash_LimitHash = 99997;
struct IDHash_IDStruct {
string str;
int next;
};
IDHash_IDStruct IDHash_Data[Limit_ID];
int IDHash[IDHash_LimitHash];
int IDCount = 0;
struct IDHash_Init {
IDHash_Init() { memset(IDHash, 0xff, sizeof(IDHash)); }
} IDHash_Init;
int IDHash_ID2int(char* str, int create_new);
int IDHash_ID2int(const string& str, int create_new);
string IDHash_int2ID(int id);
int IDHash_ID2int(char* str, int create_new = 1)
{
int hashnum = 0;
for (int i = 0; str[i]; i++)
{
hashnum = (hashnum * 100 + (str[i] - ' ')) % IDHash_LimitHash;
}
for (int i = IDHash[hashnum]; i != -1; i = IDHash_Data[i].next)
{
if (IDHash_Data[i].str == str)
{
return i;
}
}
if (!create_new) return -1;
IDHash_Data[IDCount].str = str;
IDHash_Data[IDCount].next = IDHash[hashnum];
IDHash[hashnum] = IDCount;
return IDCount ++;
}
int IDHash_ID2int(const string& str, int create_new = 1)
{
int hashnum = 0;
for (unsigned int i = 0; i < str.length(); i++)
{
hashnum = (hashnum * 100 + (str[i] - ' ')) % IDHash_LimitHash;
}
for (int i = IDHash[hashnum]; i != -1; i = IDHash_Data[i].next)
{
if (IDHash_Data[i].str == str)
{
return i;
}
}
if (!create_new) return -1;
IDHash_Data[IDCount].str = str;
IDHash_Data[IDCount].next = IDHash[hashnum];
IDHash[hashnum] = IDCount;
return IDCount ++;
}
string IDHash_int2ID(int id)
{
return IDHash_Data[id].str;
}
#endif // __IDHASH_CPP__
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?