--- deliantra/server/include/shstr.h 2009/11/03 23:44:21 1.34 +++ deliantra/server/include/shstr.h 2018/11/17 23:33:18 1.44 @@ -1,22 +1,22 @@ /* * This file is part of Deliantra, the Roguelike Realtime MMORPG. - * - * Copyright (©) 2005,2006,2007,2008,2009 Marc Alexander Lehmann / Robin Redeker / the Deliantra team - * + * + * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team + * * Deliantra is free software: you can redistribute it and/or modify it under * the terms of the Affero GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your * option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the Affero GNU General Public License * and the GNU General Public License along with this program. If not, see * . - * + * * The authors can be reached via e-mail to */ @@ -35,14 +35,16 @@ template struct shstr_vec { + uint32_t hash; uint32_t len; uint32_t refcnt; - char string[size]; + // pointer points here + char string [size]; }; // this class is a non-refcounted shared string // it cannot be used to create or store shared strings, but -// it can be used to apss shared strings around, i.e. as function arguments +// it can be used to pass shared strings around, i.e. as function arguments // or return values. their lifetime must not span a gc () call, i.e. // they are only valid as temporary values within the same server tick. struct shstr_tmp @@ -52,6 +54,16 @@ const char *s; + static unsigned int &hash (const char *s) + { + return *((unsigned int *)s - 3); + } + + int hash () const + { + return hash (s); + } + static unsigned int &length (const char *s) { return *((unsigned int *)s - 2); @@ -74,10 +86,7 @@ // returns true if the substring is contained in the shstr // if the shstr is 0, then this always returns false. // the shstr is (theoretically) treated as a comma/colon/space etc. separated list. - bool contains (const char *substring) const - { - return s != null () && strstr (s, substring); - } + bool contains (const char *substring) const; //TODO: case sensitive should be eradicated bool eq_nc (const char *otherstring) const @@ -130,7 +139,7 @@ return sh.length (); } -static std::ostream &operator <<(std::ostream &o, shstr_tmp sh) +static inline std::ostream &operator <<(std::ostream &o, shstr_tmp sh) { o.write (sh.s, sh.length ()); @@ -171,7 +180,7 @@ } explicit shstr (const char *str) - : shstr_tmp (0, is_constant (str) && !str ? null () : intern (str)) + : shstr_tmp (0, ecb_is_constant (str) && !str ? null () : intern (str)) { } @@ -203,7 +212,7 @@ shstr &operator =(const char *str) { --refcnt (); - s = is_constant (str) && !str ? null () : intern (str); + s = ecb_is_constant (str) && !str ? null () : intern (str); return *this; }