#pragma once // nullpo.hpp - Non-fatal pointer assertions. // // Copyright © ????-2004 Athena Dev Teams // Copyright © 2004-2011 The Mana World Development Team // Copyright © 2011-2014 Ben Longbons // // This file is part of The Mana World (Athena server) // // This program is free software: you can redistribute it and/or modify // it under the terms of the 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 GNU General Public License // along with this program. If not, see . /// Uncomment this to live dangerously /// (really exist to detect mostly-unused variables) //# define BUG_FREE /// All functions print to standard error (was: standard output) /// nullpo_retn(cond) - return nullptr if given pointer is nullptr /// nullpo_retz(cond) - return 0 if given pointer is nullptr /// nullpo_retv(cond) - just return (function returns void) /// nullpo_retr(rv, cond) - return given value instead #ifndef BUG_FREE # define nullpo_retr(ret, t) \ if (nullpo_chk(__FILE__, __LINE__, __PRETTY_FUNCTION__, t)) \ return ret; #else // BUG_FREE # define nullpo_retr(ret, t) /*t*/ #endif // BUG_FREE #define nullpo_retn(t) nullpo_retr(nullptr, t) #define nullpo_retz(t) nullpo_retr(0, t) #define nullpo_retv(t) nullpo_retr(, t) #include "fwd.hpp" namespace tmwa { /// Used by macros in this header bool nullpo_chk(const char *file, int line, const char *func, const void *target); template bool nullpo_chk(const char *, int, const char *, Borrowed) = delete; template bool nullpo_chk(const char *file, int line, const char *func, T *target) { return nullpo_chk(file, line, func, static_cast(target)); } template bool nullpo_chk(const char *file, int line, const char *func, T target) { return nullpo_chk(file, line, func, target.operator->()); } } // namespace tmwa