ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/include/util.h
(Generate patch)

Comparing deliantra/server/include/util.h (file contents):
Revision 1.122 by root, Mon Nov 12 02:39:51 2012 UTC vs.
Revision 1.127 by root, Sat Nov 17 23:40:02 2018 UTC

1/* 1/*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG. 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 * 3 *
4 * Copyright (©) 2017,2018 Marc Alexander Lehmann / the Deliantra team
4 * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 5 * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * 6 *
6 * Deliantra is free software: you can redistribute it and/or modify it under 7 * Deliantra is free software: you can redistribute it and/or modify it under
7 * the terms of the Affero GNU General Public License as published by the 8 * the terms of the Affero GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or (at your 9 * Free Software Foundation, either version 3 of the License, or (at your
9 * option) any later version. 10 * option) any later version.
55#endif 56#endif
56 57
57// use C0X decltype for auto declarations until ISO C++ sanctifies them (if ever) 58// use C0X decltype for auto declarations until ISO C++ sanctifies them (if ever)
58#define auto(var,expr) decltype(expr) var = (expr) 59#define auto(var,expr) decltype(expr) var = (expr)
59 60
60#if cplusplus_does_not_suck 61#if cplusplus_does_not_suck /* still sucks in codesize with gcc 6, although local types work now */
61// does not work for local types (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm) 62// does not work for local types (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm)
62template<typename T, int N> 63template<typename T, int N>
63static inline int array_length (const T (&arr)[N]) 64static inline int array_length (const T (&arr)[N])
64{ 65{
65 return N; 66 return N;
81 82
82// in range excluding end 83// in range excluding end
83#define IN_RANGE_EXC(val,beg,end) \ 84#define IN_RANGE_EXC(val,beg,end) \
84 ((unsigned int)(val) - (unsigned int)(beg) < (unsigned int)(end) - (unsigned int)(beg)) 85 ((unsigned int)(val) - (unsigned int)(beg) < (unsigned int)(end) - (unsigned int)(beg))
85 86
86void cleanup (const char *cause, bool make_core = false); 87ecb_cold void cleanup (const char *cause, bool make_core = false);
87void fork_abort (const char *msg); 88ecb_cold void fork_abort (const char *msg);
88 89
89// rationale for using (U) not (T) is to reduce signed/unsigned issues, 90// rationale for using (U) not (T) is to reduce signed/unsigned issues,
90// as a is often a constant while b is the variable. it is still a bug, though. 91// as a is often a constant while b is the variable. it is still a bug, though.
91template<typename T, typename U> static inline T min (T a, U b) { return a < (T)b ? a : (T)b; } 92template<typename T, typename U> static inline T min (T a, U b) { return a < (T)b ? a : (T)b; }
92template<typename T, typename U> static inline T max (T a, U b) { return a > (T)b ? a : (T)b; } 93template<typename T, typename U> static inline T max (T a, U b) { return a > (T)b ? a : (T)b; }
283absdir (int d) 284absdir (int d)
284{ 285{
285 return ((d - 1) & 7) + 1; 286 return ((d - 1) & 7) + 1;
286} 287}
287 288
288// avoid ctz name because netbsd or freebsd spams it's namespace with it
289#if GCC_VERSION(3,4)
290static inline int least_significant_bit (uint32_t x)
291{
292 return __builtin_ctz (x);
293}
294#else
295int least_significant_bit (uint32_t x);
296#endif
297
298#define for_all_bits_sparse_32(mask, idxvar) \ 289#define for_all_bits_sparse_32(mask, idxvar) \
299 for (uint32_t idxvar, mask_ = mask; \ 290 for (uint32_t idxvar, mask_ = mask; \
300 mask_ && ((idxvar = least_significant_bit (mask_)), mask_ &= ~(1 << idxvar), 1);) 291 mask_ && ((idxvar = ecb_ctz32 (mask_)), mask_ &= ~(1 << idxvar), 1);)
301 292
302extern ssize_t slice_alloc; // statistics 293extern ssize_t slice_alloc; // statistics
303 294
304void *salloc_ (int n) throw (std::bad_alloc); 295void *salloc_ (int n);
305void *salloc_ (int n, void *src) throw (std::bad_alloc); 296void *salloc_ (int n, void *src);
306 297
307// strictly the same as g_slice_alloc, but never returns 0 298// strictly the same as g_slice_alloc, but never returns 0
308template<typename T> 299template<typename T>
309inline T *salloc (int n = 1) throw (std::bad_alloc) { return (T *)salloc_ (n * sizeof (T)); } 300inline T *salloc (int n = 1) { return (T *)salloc_ (n * sizeof (T)); }
310 301
311// also copies src into the new area, like "memdup" 302// also copies src into the new area, like "memdup"
312// if src is 0, clears the memory 303// if src is 0, clears the memory
313template<typename T> 304template<typename T>
314inline T *salloc (int n, T *src) throw (std::bad_alloc) { return (T *)salloc_ (n * sizeof (T), (void *)src); } 305inline T *salloc (int n, T *src) { return (T *)salloc_ (n * sizeof (T), (void *)src); }
315 306
316// clears the memory 307// clears the memory
317template<typename T> 308template<typename T>
318inline T *salloc0(int n = 1) throw (std::bad_alloc) { return (T *)salloc_ (n * sizeof (T), 0); } 309inline T *salloc0(int n = 1) { return (T *)salloc_ (n * sizeof (T), 0); }
319 310
320// for symmetry 311// for symmetry
321template<typename T> 312template<typename T>
322inline void sfree (T *ptr, int n = 1) throw () 313inline void sfree (T *ptr, int n = 1) noexcept
323{ 314{
324 if (expect_true (ptr)) 315 if (expect_true (ptr))
325 { 316 {
326 slice_alloc -= n * sizeof (T); 317 slice_alloc -= n * sizeof (T);
327 if (DEBUG_POISON) memset (ptr, DEBUG_POISON, n * sizeof (T)); 318 if (DEBUG_POISON) memset (ptr, DEBUG_POISON, n * sizeof (T));
329 } 320 }
330} 321}
331 322
332// nulls the pointer 323// nulls the pointer
333template<typename T> 324template<typename T>
334inline void sfree0 (T *&ptr, int n = 1) throw () 325inline void sfree0 (T *&ptr, int n = 1) noexcept
335{ 326{
336 sfree<T> (ptr, n); 327 sfree<T> (ptr, n);
337 ptr = 0; 328 ptr = 0;
338} 329}
339 330
413 struct rebind 404 struct rebind
414 { 405 {
415 typedef slice_allocator<U> other; 406 typedef slice_allocator<U> other;
416 }; 407 };
417 408
418 slice_allocator () throw () { } 409 slice_allocator () noexcept { }
419 slice_allocator (const slice_allocator &) throw () { } 410 slice_allocator (const slice_allocator &) noexcept { }
420 template<typename Tp2> 411 template<typename Tp2>
421 slice_allocator (const slice_allocator<Tp2> &) throw () { } 412 slice_allocator (const slice_allocator<Tp2> &) noexcept { }
422 413
423 ~slice_allocator () { } 414 ~slice_allocator () { }
424 415
425 pointer address (reference x) const { return &x; } 416 pointer address (reference x) const { return &x; }
426 const_pointer address (const_reference x) const { return &x; } 417 const_pointer address (const_reference x) const { return &x; }
433 void deallocate (pointer p, size_type n) 424 void deallocate (pointer p, size_type n)
434 { 425 {
435 sfree<Tp> (p, n); 426 sfree<Tp> (p, n);
436 } 427 }
437 428
438 size_type max_size () const throw () 429 size_type max_size () const noexcept
439 { 430 {
440 return size_t (-1) / sizeof (Tp); 431 return size_t (-1) / sizeof (Tp);
441 } 432 }
442 433
443 void construct (pointer p, const Tp &val) 434 void construct (pointer p, const Tp &val)
536 // p if not null 527 // p if not null
537 refcnt_base::refcnt_t *refcnt_ref () { return p ? &p->refcnt : &refcnt_dummy; } 528 refcnt_base::refcnt_t *refcnt_ref () { return p ? &p->refcnt : &refcnt_dummy; }
538 529
539 void refcnt_dec () 530 void refcnt_dec ()
540 { 531 {
541 if (!is_constant (p)) 532 if (!ecb_is_constant (p))
542 --*refcnt_ref (); 533 --*refcnt_ref ();
543 else if (p) 534 else if (p)
544 --p->refcnt; 535 --p->refcnt;
545 } 536 }
546 537
547 void refcnt_inc () 538 void refcnt_inc ()
548 { 539 {
549 if (!is_constant (p)) 540 if (!ecb_is_constant (p))
550 ++*refcnt_ref (); 541 ++*refcnt_ref ();
551 else if (p) 542 else if (p)
552 ++p->refcnt; 543 ++p->refcnt;
553 } 544 }
554 545
814 805
815int similar_direction (int a, int b); 806int similar_direction (int a, int b);
816 807
817// like v?sprintf, but returns a "static" buffer 808// like v?sprintf, but returns a "static" buffer
818char *vformat (const char *format, va_list ap); 809char *vformat (const char *format, va_list ap);
819char *format (const char *format, ...) attribute ((format (printf, 1, 2))); 810char *format (const char *format, ...) ecb_attribute ((format (printf, 1, 2)));
820 811
821// safety-check player input which will become object->msg 812// safety-check player input which will become object->msg
822bool msg_is_safe (const char *msg); 813bool msg_is_safe (const char *msg);
823 814
824///////////////////////////////////////////////////////////////////////////// 815/////////////////////////////////////////////////////////////////////////////

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines