--- deliantra/server/include/util.h 2012/01/26 19:01:22 1.119 +++ deliantra/server/include/util.h 2016/11/18 20:20:05 1.124 @@ -1,22 +1,22 @@ /* * This file is part of Deliantra, the Roguelike Realtime MMORPG. - * - * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012 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 */ @@ -57,7 +57,7 @@ // use C0X decltype for auto declarations until ISO C++ sanctifies them (if ever) #define auto(var,expr) decltype(expr) var = (expr) -#if cplusplus_does_not_suck +#if cplusplus_does_not_suck /* still sucks in codesize with gcc 6, although local types work now */ // does not work for local types (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm) template static inline int array_length (const T (&arr)[N]) @@ -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;