EString _EString_add(EString _str0, const char* _str1, const char* _file_name, euint32 _file_line) { /** estring* estr = (estring*)((ref_ptr)_str0 - (ref_ptr)sizeof(estring)); euint32 length = strlen(_str1); estring* ret = _Malloc(sizeof(estring) + estr->length + length + 1, _file_name, _file_line); memcpy(&ret->str[0], &estr->str[0], estr->length); memcpy((vptr)((ref_ptr)&ret->str[0] + (ref_ptr)estr->length), _str1, length + 1); ret->length = estr->length + length; ret->hash = calc_hashnr(&ret->str[0], ret->length); return &ret->str[0]; **/ estring* estr = _get_estring(_str0); euint32 length = (euint32)strlen(_str1); estring* ret = (estring*)_Malloc(sizeof(estring) + estr->length + length + 1, _file_name, (euint32)_file_line); char* dest = &ret->str[0]; memcpy(dest, _str0, estr->length); dest += estr->length; memcpy(dest, _str1, length + 1); ret->length = estr->length + length; ret->hash = calc_hashnr(&ret->str[0], ret->length); return &ret->str[0]; }
euint32 hash_value() const { int count = 0; while (m_str[count]) { count++; } return calc_hashnr ( (const char*)m_str, count * sizeof(*m_str) ); }
EString _EString_new(const char* _str, const char* _file_name, euint32 _file_line) { euint32 length = _string_length(_str); estring* ret = (estring*)_Malloc(sizeof(estring) + length + 1, _file_name, (euint32)_file_line); ret->length = length; memcpy(&ret->str[0], _str, length + 1); ret->hash = calc_hashnr(&ret->str[0], length); return &ret->str[0]; }
static_string ( const char *str ) { euint32 hash_value = calc_hashnr ( str, _strlen ( str ) ); xhn::hash_set<string>::bucket& b = s_static_string_set.get_bucket(hash_value); { SpinLock::Instance inst = b.m_lock.Lock(); xhn::list<xhn::string>::iterator iter = b.begin(); xhn::list<xhn::string>::iterator end = b.begin(); for (; iter != end; iter++) { if (*iter == str) { m_str = (*iter).c_str(); return; } } } string value ( str ); const string &v = s_static_string_set.insert ( value ); m_str = v.c_str(); }
static_string ( const char *str ) { if (!s_static_string_set) { s_static_string_set = VNEW hash_set<string>; } euint32 hash_value = calc_hashnr ( str, strlen ( str ) ); xhn::hash_set<string>::bucket& b = s_static_string_set->get_bucket(hash_value); { SpinLock::Instance inst = b.m_lock.Lock(); xhn::list<xhn::string>::iterator iter = b.begin(); xhn::list<xhn::string>::iterator end = b.end(); for (; iter != end; iter++) { if (strcmp(iter->c_str(),str) == 0) { m_str = iter->c_str(); return; } } } string value ( str ); const string &v = s_static_string_set->insert ( value ); m_str = v.c_str(); }
euint32 operator() (const T& v) { return calc_hashnr ( (const char*)v, sizeof(T) ); }