--- deliantra/server/include/util.h 2012/01/03 11:23:41 1.117 +++ deliantra/server/include/util.h 2016/11/16 23:42:01 1.123 @@ -1,22 +1,22 @@ /* * This file is part of Deliantra, the Roguelike Realtime MMORPG. - * - * Copyright (©) 2005,2006,2007,2008,2009,2010,2011 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 */ @@ -239,9 +239,9 @@ #else // and has a max. error of 9 in the range -100..+100. #endif -inline int +inline int idistance (int dx, int dy) -{ +{ unsigned int dx_ = abs (dx); unsigned int dy_ = abs (dy); @@ -409,7 +409,7 @@ typedef const Tp &const_reference; typedef Tp value_type; - template + template struct rebind { typedef slice_allocator other; @@ -462,7 +462,7 @@ refcnt_buf (const refcnt_buf &src) { data = src.data; - ++_refcnt (); + inc (); } ~refcnt_buf (); @@ -481,30 +481,37 @@ protected: enum { - overhead = sizeof (unsigned int) * 2 + overhead = sizeof (uint32_t) * 2 }; - unsigned int &_size () const + uint32_t &_size () const { return ((unsigned int *)data)[-2]; } - unsigned int &_refcnt () const + uint32_t &_refcnt () const { return ((unsigned int *)data)[-1]; } - void _alloc (unsigned int size) + void _alloc (uint32_t size) { data = ((char *)salloc (size + overhead)) + overhead; _size () = size; _refcnt () = 1; } + void _dealloc (); + + void inc () + { + ++_refcnt (); + } + void dec () { if (!--_refcnt ()) - sfree (data - overhead, size () + overhead); + _dealloc (); } }; @@ -592,7 +599,7 @@ // runs concurrently with the looping logic. // we modify the hash a bit to improve its distribution uint32_t hash = STRHSH_NULL; - + while (*s) hash = (hash ^ *s++) * 16777619U; @@ -603,7 +610,7 @@ memhsh (const char *s, size_t len) { uint32_t hash = STRHSH_NULL; - + while (len--) hash = (hash ^ *s++) * 16777619U; @@ -656,7 +663,7 @@ // This container blends advantages of linked lists // (efficiency) with vectors (random access) by -// by using an unordered vector and storing the vector +// using an unordered vector and storing the vector // index inside the object. // // + memory-efficient on most 64 bit archs @@ -703,7 +710,7 @@ void erase (T *obj) { - unsigned int pos = obj->*indexmember; + object_vector_index pos = obj->*indexmember; obj->*indexmember = 0; if (pos < this->size ())