/* * ORXONOX - the hottest 3D action shooter ever to exist * > www.orxonox.net < * * * License notice: * * 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 2 * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Author: * Fabian 'x3n' Landau * Reto Grieder * Co-authors: * ... * */ /** @defgroup COUT COUT(x) output macro @ingroup Util Output */ /** @file @ingroup Util COUT @brief Handles different output-levels of errors, warnings, infos, and debug information. The COUT(level) macro acts like @c std::cout, but the output is only performed if the given level is <= the soft debug level. There are two used values in this file: - The hard debug level is used during compile time. It describes the highest allowed output level. - The soft debug level is used during runtime and is the maximum of the three configurable output-levels for console, log file, and in game shell. The separation between the three devices is done by the OutputHandler. @anchor COUTlevels Possible levels are: - 0: Very important output - 1: Errors - 2: Warnings - 3: Information - 4: Debug information - 5: More debug information - 6: Crazy debug information Example: @code COUT(0) << "Very important output" << std::endl; COUT(1) << "Error: Something went wrong!" << std::endl; COUT(2) << "Warning: There might be a problem." << std::endl; COUT(3) << "Info: It's Monday" << std::endl; COUT(4) << "Debug: x is 1.23456" << std::endl; @endcode */ #ifndef _Util_Debug_H__ #define _Util_Debug_H__ #include "UtilPrereqs.h" #include "OutputHandler.h" namespace orxonox { // Just for convenience using std::endl; // Adjust this to discard certain output with level > hardDebugLevel at compile time already #ifdef ORXONOX_RELEASE const int hardDebugLevel = OutputLevel::Verbose; #elif defined(NDEBUG) const int hardDebugLevel = OutputLevel::Verbose; #else //! Maximum level for debug output that should be even processed at run time const int hardDebugLevel = OutputLevel::Ultra; #endif //! This function simply returns 0 and helps to suppress the "statement has no effect" compiler warning inline int debugDummyFunction() { return 0; } } /** @brief Logs text output: You can use COUT(level) exactly like @c std::cout, but you have to specify an output level as argument. @param level The level of the following output (passed with << "text"). Lower levels are more important. See @ref COUTlevels "the description above" for a list of possible output levels. Example: @code COUT(3) << "Some info" << std::endl; // Output with level 3 @endcode @note (a > b ? 0 : c << "text") is equivalent to (a > b ? 0 : (c << "text") where (a > b ? 0 : ) stands for COUT(x). This should explain how this macro magic can possibly even work ;) @remarks The ? : operator requires both possible results to have the type of the first. This is achieved by the int conversion operator dummy in the @ref orxonox::OutputHandler. */ #define COUT(level) \ /*if*/ (level > orxonox::hardDebugLevel) ? \ orxonox::debugDummyFunction() \ /*else*/ : \ /*if*/ (level > orxonox::OutputHandler::getSoftDebugLevel()) ? \ orxonox::debugDummyFunction() \ /*else*/ : \ orxonox::OutputHandler::getOutStream(level) #endif /* _Util_Debug_H__ */