From c78a8595fbb4c94855ca0a2c5ed93b1c25bf5cce Mon Sep 17 00:00:00 2001 From: David Williams Date: Wed, 26 Dec 2012 01:33:05 +0000 Subject: [PATCH] Initial work on new assert macro. --- library/PolyVoxCore/CMakeLists.txt | 2 + .../include/PolyVoxCore/Impl/ErrorHandling.h | 77 +++++++++++++++++++ .../polyvoxcore/source/Impl/ErrorHandling.cpp | 70 +++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 library/PolyVoxCore/include/PolyVoxCore/Impl/ErrorHandling.h create mode 100644 library/polyvoxcore/source/Impl/ErrorHandling.cpp diff --git a/library/PolyVoxCore/CMakeLists.txt b/library/PolyVoxCore/CMakeLists.txt index 614e05d7..201d8ab5 100644 --- a/library/PolyVoxCore/CMakeLists.txt +++ b/library/PolyVoxCore/CMakeLists.txt @@ -94,6 +94,7 @@ SET(CORE_INC_FILES ) SET(IMPL_SRC_FILES + source/Impl/ErrorHandling.cpp source/Impl/MarchingCubesTables.cpp source/Impl/RandomUnitVectors.cpp source/Impl/RandomVectors.cpp @@ -106,6 +107,7 @@ SET(IMPL_INC_FILES include/PolyVoxCore/Impl/AStarPathfinderImpl.h include/PolyVoxCore/Impl/Block.h include/PolyVoxCore/Impl/Block.inl + include/PolyVoxCore/Impl/ErrorHandling.h include/PolyVoxCore/Impl/MarchingCubesTables.h include/PolyVoxCore/Impl/RandomUnitVectors.h include/PolyVoxCore/Impl/RandomVectors.h diff --git a/library/PolyVoxCore/include/PolyVoxCore/Impl/ErrorHandling.h b/library/PolyVoxCore/include/PolyVoxCore/Impl/ErrorHandling.h new file mode 100644 index 00000000..c3f832a3 --- /dev/null +++ b/library/PolyVoxCore/include/PolyVoxCore/Impl/ErrorHandling.h @@ -0,0 +1,77 @@ +/******************************************************************************* +Copyright (c) 2005-2009 David Williams + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*******************************************************************************/ + +#ifndef __PolyVox_ErrorHandling_H__ +#define __PolyVox_ErrorHandling_H__ + +#define POLYVOX_ASSERTS_ENABLED + +namespace PolyVox +{ + namespace Assert + { + enum FailBehavior + { + Halt, + Continue, + }; + + typedef FailBehavior (*Handler)(const char* condition, const char* msg, const char* file, int line); + + Handler GetHandler(); + void SetHandler(Handler newHandler); + + FailBehavior ReportFailure(const char* condition, + const char* file, + int line, + const char* msg, ...); + } +} + +#define POLYVOX_HALT() __debugbreak() +#define POLYVOX_UNUSED(x) do { (void)sizeof(x); } while(0) + +#ifdef POLYVOX_ASSERTS_ENABLED + + #define POLYVOX_ASSERT(cond, msg, ...) \ + do \ + { \ + if (!(cond)) \ + { \ + if (PolyVox::Assert::ReportFailure(#cond, __FILE__, __LINE__, (msg), __VA_ARGS__) == \ + PolyVox::Assert::Halt) \ + POLYVOX_HALT(); \ + } \ + } while(0) + +#else + + #define POLYVOX_ASSERT(condition, msg, ...) \ + do { POLYVOX_UNUSED(condition); POLYVOX_UNUSED(msg); } while(0) + +#endif + +#define POLYVOX_STATIC_ASSERT(x) \ + typedef char polyvoxStaticAssert[(x) ? 1 : -1]; + +#endif //__PolyVox_ErrorHandling_H__ diff --git a/library/polyvoxcore/source/Impl/ErrorHandling.cpp b/library/polyvoxcore/source/Impl/ErrorHandling.cpp new file mode 100644 index 00000000..40225a44 --- /dev/null +++ b/library/polyvoxcore/source/Impl/ErrorHandling.cpp @@ -0,0 +1,70 @@ +#include "PolyVoxCore/Impl/ErrorHandling.h" + +#include +#include + +namespace PolyVox +{ + +namespace +{ + +Assert::FailBehavior DefaultHandler(const char* condition, + const char* msg, + const char* file, + const int line) +{ + std::printf("%s(%d): Assert Failure: ", file, line); + + if (condition != NULL) + std::printf("'%s' ", condition); + + if (msg != NULL) + std::printf("%s", msg); + + std::printf("\n"); + + return Assert::Halt; +} + +Assert::Handler& GetAssertHandlerInstance() +{ + static Assert::Handler s_handler = &DefaultHandler; + return s_handler; +} + +} + +Assert::Handler Assert::GetHandler() +{ + return GetAssertHandlerInstance(); +} + +void Assert::SetHandler(Assert::Handler newHandler) +{ + GetAssertHandlerInstance() = newHandler; +} + +Assert::FailBehavior Assert::ReportFailure(const char* condition, + const char* file, + const int line, + const char* msg, ...) +{ + const char* message = NULL; + if (msg != NULL) + { + char messageBuffer[1024]; + { + va_list args; + va_start(args, msg); + vsnprintf(messageBuffer, 1024, msg, args); + va_end(args); + } + + message = messageBuffer; + } + + return GetAssertHandlerInstance()(condition, message, file, line); +} + +} \ No newline at end of file