mirror of https://github.com/OpenTTD/OpenTTD
Codechange: use std::string_view to create SQString
parent
fca99967a7
commit
ead3b96883
|
@ -233,7 +233,7 @@ static SQInteger base_array(HSQUIRRELVM v)
|
|||
static SQInteger base_type(HSQUIRRELVM v)
|
||||
{
|
||||
SQObjectPtr &o = stack_get(v,2);
|
||||
v->Push(SQString::Create(_ss(v),GetTypeName(o),-1));
|
||||
v->Push(SQString::Create(_ss(v),GetTypeName(o)));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -372,7 +372,7 @@ static SQInteger number_delegate_tochar(HSQUIRRELVM v)
|
|||
{
|
||||
SQObject &o=stack_get(v,1);
|
||||
SQChar c = (SQChar)tointeger(o);
|
||||
v->Push(SQString::Create(_ss(v),(const SQChar *)&c,1));
|
||||
v->Push(SQString::Create(_ss(v),std::string_view(&c, 1)));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -642,7 +642,7 @@ static SQInteger string_slice(HSQUIRRELVM v)
|
|||
if(eidx < 0)eidx = slen + eidx;
|
||||
if(eidx < sidx) return sq_throwerror(v,"wrong indexes");
|
||||
if(eidx > slen) return sq_throwerror(v,"slice out of range");
|
||||
v->Push(SQString::Create(_ss(v),&_stringval(o)[sidx],eidx-sidx));
|
||||
v->Push(SQString::Create(_ss(v),std::string_view(&_stringval(o)[sidx],eidx-sidx)));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -750,19 +750,19 @@ static SQInteger closure_getinfos(HSQUIRRELVM v) {
|
|||
_array(params)->Set((SQInteger)n,f->_parameters[n]);
|
||||
}
|
||||
if(f->_varparams) {
|
||||
_array(params)->Set(nparams-1,SQString::Create(_ss(v),"...",-1));
|
||||
_array(params)->Set(nparams-1,SQString::Create(_ss(v),"..."));
|
||||
}
|
||||
res->NewSlot(SQString::Create(_ss(v),"native",-1),false);
|
||||
res->NewSlot(SQString::Create(_ss(v),"name",-1),f->_name);
|
||||
res->NewSlot(SQString::Create(_ss(v),"src",-1),f->_sourcename);
|
||||
res->NewSlot(SQString::Create(_ss(v),"parameters",-1),params);
|
||||
res->NewSlot(SQString::Create(_ss(v),"varargs",-1),f->_varparams);
|
||||
res->NewSlot(SQString::Create(_ss(v),"native"),false);
|
||||
res->NewSlot(SQString::Create(_ss(v),"name"),f->_name);
|
||||
res->NewSlot(SQString::Create(_ss(v),"src"),f->_sourcename);
|
||||
res->NewSlot(SQString::Create(_ss(v),"parameters"),params);
|
||||
res->NewSlot(SQString::Create(_ss(v),"varargs"),f->_varparams);
|
||||
}
|
||||
else { //OT_NATIVECLOSURE
|
||||
SQNativeClosure *nc = _nativeclosure(o);
|
||||
res->NewSlot(SQString::Create(_ss(v),"native",-1),true);
|
||||
res->NewSlot(SQString::Create(_ss(v),"name",-1),nc->_name);
|
||||
res->NewSlot(SQString::Create(_ss(v),"paramscheck",-1),nc->_nparamscheck);
|
||||
res->NewSlot(SQString::Create(_ss(v),"native"),true);
|
||||
res->NewSlot(SQString::Create(_ss(v),"name"),nc->_name);
|
||||
res->NewSlot(SQString::Create(_ss(v),"paramscheck"),nc->_nparamscheck);
|
||||
SQObjectPtr typecheck;
|
||||
if(!nc->_typecheck.empty()) {
|
||||
typecheck =
|
||||
|
@ -771,7 +771,7 @@ static SQInteger closure_getinfos(HSQUIRRELVM v) {
|
|||
_array(typecheck)->Set((SQInteger)n,nc->_typecheck[n]);
|
||||
}
|
||||
}
|
||||
res->NewSlot(SQString::Create(_ss(v),"typecheck",-1),typecheck);
|
||||
res->NewSlot(SQString::Create(_ss(v),"typecheck"),typecheck);
|
||||
}
|
||||
v->Push(res);
|
||||
return 1;
|
||||
|
|
|
@ -123,7 +123,7 @@ public:
|
|||
ret = _fs->CreateString(_lex._svalue);
|
||||
break;
|
||||
case TK_STRING_LITERAL:
|
||||
ret = _fs->CreateString(_lex._svalue,_lex._longstr.size()-1);
|
||||
ret = _fs->CreateString(std::string_view(_lex._svalue,_lex._longstr.size()-1));
|
||||
break;
|
||||
case TK_INTEGER:
|
||||
ret = SQObjectPtr(_lex._nvalue);
|
||||
|
@ -598,7 +598,7 @@ public:
|
|||
switch(_token)
|
||||
{
|
||||
case TK_STRING_LITERAL: {
|
||||
_fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(_fs->CreateString(_lex._svalue,_lex._longstr.size()-1)));
|
||||
_fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(_fs->CreateString(std::string_view(_lex._svalue,_lex._longstr.size()-1))));
|
||||
Lex();
|
||||
}
|
||||
break;
|
||||
|
@ -1103,7 +1103,7 @@ public:
|
|||
val._unVal.fFloat = _lex._fvalue;
|
||||
break;
|
||||
case TK_STRING_LITERAL:
|
||||
val = _fs->CreateString(_lex._svalue,_lex._longstr.size()-1);
|
||||
val = _fs->CreateString(std::string_view(_lex._svalue,_lex._longstr.size()-1));
|
||||
break;
|
||||
case '-':
|
||||
Lex();
|
||||
|
|
|
@ -101,15 +101,15 @@ void SQVM::Raise_CompareError(const SQObject &o1, const SQObject &o2)
|
|||
|
||||
void SQVM::Raise_ParamTypeError(SQInteger nparam,SQInteger typemask,SQInteger type)
|
||||
{
|
||||
SQObjectPtr exptypes = SQString::Create(_ss(this), "", -1);
|
||||
SQObjectPtr exptypes = SQString::Create(_ss(this), "");
|
||||
SQInteger found = 0;
|
||||
for(SQInteger i=0; i<16; i++)
|
||||
{
|
||||
SQInteger mask = 0x00000001LL << i;
|
||||
if(typemask & (mask)) {
|
||||
if(found>0) StringCat(exptypes,SQString::Create(_ss(this), "|", -1), exptypes);
|
||||
if(found>0) StringCat(exptypes,SQString::Create(_ss(this), "|"), exptypes);
|
||||
found ++;
|
||||
StringCat(exptypes,SQString::Create(_ss(this), IdType2Name((SQObjectType)mask), -1), exptypes);
|
||||
StringCat(exptypes,SQString::Create(_ss(this), IdType2Name((SQObjectType)mask)), exptypes);
|
||||
}
|
||||
}
|
||||
Raise_Error(fmt::format("parameter {} has an invalid type '{}' ; expected: '{}'", nparam, IdType2Name((SQObjectType)type), _stringval(exptypes)));
|
||||
|
|
|
@ -499,9 +499,9 @@ void SQFuncState::AddInstruction(SQInstruction &i)
|
|||
_instructions.push_back(i);
|
||||
}
|
||||
|
||||
SQObject SQFuncState::CreateString(const SQChar *s,SQInteger len)
|
||||
SQObject SQFuncState::CreateString(std::string_view s)
|
||||
{
|
||||
SQObjectPtr ns(SQString::Create(_sharedstate,s,len));
|
||||
SQObjectPtr ns(SQString::Create(_sharedstate,s));
|
||||
_table(_strings)->NewSlot(ns,(SQInteger)1);
|
||||
return std::move(ns);
|
||||
}
|
||||
|
|
|
@ -43,7 +43,7 @@ struct SQFuncState
|
|||
SQInteger TopTarget();
|
||||
SQInteger GetUpTarget(SQInteger n);
|
||||
bool IsLocal(SQUnsignedInteger stkpos);
|
||||
SQObject CreateString(const SQChar *s,SQInteger len = -1);
|
||||
SQObject CreateString(std::string_view s);
|
||||
SQObject CreateTable();
|
||||
bool IsConstant(const SQObject &name,SQObject &e);
|
||||
SQInteger _returnexp;
|
||||
|
|
|
@ -51,16 +51,16 @@ const SQChar *GetTypeName(const SQObjectPtr &obj1)
|
|||
return IdType2Name(type(obj1));
|
||||
}
|
||||
|
||||
SQString *SQString::Create(SQSharedState *ss,const SQChar *s,SQInteger len)
|
||||
SQString *SQString::Create(SQSharedState *ss,std::string_view s)
|
||||
{
|
||||
SQString *str=ADD_STRING(ss,s,len);
|
||||
SQString *str=ss->_stringtable->Add(s);
|
||||
str->_sharedstate=ss;
|
||||
return str;
|
||||
}
|
||||
|
||||
void SQString::Release()
|
||||
{
|
||||
REMOVE_STRING(_sharedstate,this);
|
||||
_sharedstate->_stringtable->Remove(this);
|
||||
}
|
||||
|
||||
SQInteger SQString::Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval)
|
||||
|
|
|
@ -547,33 +547,34 @@ void SQStringTable::AllocNodes(SQInteger size)
|
|||
memset(_strings,0,sizeof(SQString*)*(size_t)_numofslots);
|
||||
}
|
||||
|
||||
SQString *SQStringTable::Add(const SQChar *news,SQInteger len)
|
||||
static const std::hash<std::string_view> string_table_hash{};
|
||||
|
||||
SQString *SQStringTable::Add(std::string_view new_string)
|
||||
{
|
||||
if(len<0)
|
||||
len = (SQInteger)strlen(news);
|
||||
SQHash h = ::_hashstr(news,(size_t)len)&(_numofslots-1);
|
||||
size_t len = new_string.size();
|
||||
auto slot = string_table_hash(new_string) & (_numofslots-1);
|
||||
SQString *s;
|
||||
for (s = _strings[h]; s; s = s->_next){
|
||||
if(s->_len == len && (!memcmp(news,s->_val,(size_t)len)))
|
||||
for (s = _strings[slot]; s; s = s->_next){
|
||||
if(static_cast<size_t>(s->_len) == len && (!memcmp(new_string.data(),s->_val,len)))
|
||||
return s; //found
|
||||
}
|
||||
|
||||
SQString *t=(SQString *)SQ_MALLOC(len+sizeof(SQString));
|
||||
new (t) SQString(news, len);
|
||||
t->_next = _strings[h];
|
||||
_strings[h] = t;
|
||||
new (t) SQString(new_string);
|
||||
t->_next = _strings[slot];
|
||||
_strings[slot] = t;
|
||||
_slotused++;
|
||||
if (_slotused > _numofslots) /* too crowded? */
|
||||
Resize(_numofslots*2);
|
||||
return t;
|
||||
}
|
||||
|
||||
SQString::SQString(const SQChar *news, SQInteger len)
|
||||
SQString::SQString(std::string_view new_string)
|
||||
{
|
||||
memcpy(_val,news,(size_t)len);
|
||||
_val[len] = '\0';
|
||||
_len = len;
|
||||
_hash = ::_hashstr(news,(size_t)len);
|
||||
memcpy(_val,new_string.data(),new_string.size());
|
||||
_val[new_string.size()] = '\0';
|
||||
_len = new_string.size();
|
||||
_hash = string_table_hash(new_string);
|
||||
_next = nullptr;
|
||||
_sharedstate = nullptr;
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ struct SQStringTable
|
|||
{
|
||||
SQStringTable();
|
||||
~SQStringTable();
|
||||
SQString *Add(const SQChar *,SQInteger len);
|
||||
SQString *Add(std::string_view str);
|
||||
void Remove(SQString *);
|
||||
private:
|
||||
void Resize(SQInteger size);
|
||||
|
@ -49,9 +49,6 @@ private:
|
|||
RefNode **_buckets;
|
||||
};
|
||||
|
||||
#define ADD_STRING(ss,str,len) ss->_stringtable->Add(str,len)
|
||||
#define REMOVE_STRING(ss,bstr) ss->_stringtable->Remove(bstr)
|
||||
|
||||
struct SQObjectPtr;
|
||||
|
||||
struct SQSharedState
|
||||
|
|
|
@ -2,28 +2,18 @@
|
|||
#ifndef _SQSTRING_H_
|
||||
#define _SQSTRING_H_
|
||||
|
||||
inline SQHash _hashstr (const SQChar *s, size_t l)
|
||||
{
|
||||
SQHash h = (SQHash)l; /* seed */
|
||||
size_t step = (l>>5)|1; /* if string is too long, don't hash all its chars */
|
||||
for (; l>=step; l-=step)
|
||||
h = h ^ ((h<<5)+(h>>2)+(unsigned short)*(s++));
|
||||
return h;
|
||||
}
|
||||
|
||||
struct SQString : public SQRefCounted
|
||||
{
|
||||
SQString(const SQChar *news, SQInteger len);
|
||||
SQString(std::string_view str);
|
||||
~SQString(){}
|
||||
public:
|
||||
static SQString *Create(SQSharedState *ss, const SQChar *, SQInteger len = -1 );
|
||||
static SQString *Create(SQSharedState *ss, std::string_view str) { return Create(ss, str.data(), str.size()); }
|
||||
static SQString *Create(SQSharedState *ss, std::string_view str);
|
||||
SQInteger Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval);
|
||||
void Release() override;
|
||||
SQSharedState *_sharedstate;
|
||||
SQString *_next; //chain for the string table
|
||||
SQInteger _len;
|
||||
SQHash _hash;
|
||||
std::size_t _hash;
|
||||
SQChar _val[1];
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue