Added POLYVOX_THROW_IF macro to simplify error handling.
This commit is contained in:
parent
77a340f2b3
commit
56cf423bfd
@ -73,10 +73,7 @@ namespace PolyVox
|
||||
template <uint32_t noOfDims, typename ElementType>
|
||||
SubArray<noOfDims-1, ElementType> Array<noOfDims, ElementType>::operator[](uint32_t uIndex)
|
||||
{
|
||||
if(uIndex >= m_pDimensions[0])
|
||||
{
|
||||
POLYVOX_THROW(std::out_of_range, "Array index out of range");
|
||||
}
|
||||
POLYVOX_THROW_IF(uIndex >= m_pDimensions[0], std::out_of_range, "Array index out of range");
|
||||
|
||||
return
|
||||
SubArray<noOfDims-1, ElementType>(&m_pElements[uIndex*m_pOffsets[0]],
|
||||
@ -95,10 +92,7 @@ namespace PolyVox
|
||||
template <uint32_t noOfDims, typename ElementType>
|
||||
const SubArray<noOfDims-1, ElementType> Array<noOfDims, ElementType>::operator[](uint32_t uIndex) const
|
||||
{
|
||||
if(uIndex >= m_pDimensions[0])
|
||||
{
|
||||
POLYVOX_THROW(std::out_of_range, "Array index out of range");
|
||||
}
|
||||
POLYVOX_THROW_IF(uIndex >= m_pDimensions[0], std::out_of_range, "Array index out of range");
|
||||
|
||||
return
|
||||
SubArray<noOfDims-1, ElementType>(&m_pElements[uIndex*m_pOffsets[0]],
|
||||
@ -147,10 +141,7 @@ namespace PolyVox
|
||||
m_uNoOfElements = 1;
|
||||
for (uint32_t i = 0; i<noOfDims; i++)
|
||||
{
|
||||
if(pDimensions[i] == 0)
|
||||
{
|
||||
POLYVOX_THROW(std::out_of_range, "Invalid array dimension");
|
||||
}
|
||||
POLYVOX_THROW_IF(pDimensions[i] == 0, std::out_of_range, "Invalid array dimension");
|
||||
|
||||
m_uNoOfElements *= pDimensions[i];
|
||||
m_pDimensions[i] = pDimensions[i];
|
||||
@ -197,10 +188,7 @@ namespace PolyVox
|
||||
template <uint32_t noOfDims, typename ElementType>
|
||||
uint32_t Array<noOfDims, ElementType>::getDimension(uint32_t uDimension)
|
||||
{
|
||||
if(uDimension >= noOfDims)
|
||||
{
|
||||
POLYVOX_THROW(std::out_of_range, "Array dimension out of range");
|
||||
}
|
||||
POLYVOX_THROW_IF(uDimension >= noOfDims, std::out_of_range, "Array dimension out of range");
|
||||
|
||||
return m_pDimensions[uDimension];
|
||||
}
|
||||
@ -266,10 +254,7 @@ namespace PolyVox
|
||||
template <typename ElementType>
|
||||
ElementType& Array<1, ElementType>::operator[] (uint32_t uIndex)
|
||||
{
|
||||
if(uIndex >= m_pDimensions[0])
|
||||
{
|
||||
POLYVOX_THROW(std::out_of_range, "Array index out of range");
|
||||
}
|
||||
POLYVOX_THROW_IF(uIndex >= m_pDimensions[0], std::out_of_range, "Array index out of range");
|
||||
|
||||
return m_pElements[uIndex];
|
||||
}
|
||||
@ -277,10 +262,7 @@ namespace PolyVox
|
||||
template <typename ElementType>
|
||||
const ElementType& Array<1, ElementType>::operator[] (uint32_t uIndex) const
|
||||
{
|
||||
if(uIndex >= m_pDimensions[0])
|
||||
{
|
||||
POLYVOX_THROW(std::out_of_range, "Array index out of range");
|
||||
}
|
||||
POLYVOX_THROW_IF(uIndex >= m_pDimensions[0], std::out_of_range, "Array index out of range");
|
||||
|
||||
return m_pElements[uIndex];
|
||||
}
|
||||
|
@ -255,15 +255,36 @@ namespace PolyVox
|
||||
* ...
|
||||
*/
|
||||
#ifdef POLYVOX_THROW_ENABLED
|
||||
#define POLYVOX_THROW(type, message) \
|
||||
PolyVox::logError() << (message); \
|
||||
throw type((message))
|
||||
|
||||
// Some fast functions (getVoxel(), etc) use exceptions for error handling but don't want the overhead of logging.
|
||||
// This overhead is present even if no exception is thrown, probably because the presence of the logging code prevents
|
||||
// some inlining. Therefore we provide this macro which doesn't log for such specialised circumstances.
|
||||
#define POLYVOX_THROW_DONT_LOG(type, message) \
|
||||
throw type((message))
|
||||
#define POLYVOX_THROW_IF(condition, type, message) \
|
||||
/* We use the do...while(0) construct in our macros (for reasons see here: http://stackoverflow.com/a/154138) \
|
||||
but Visual Studio gives unhelpful 'conditional expression is constant' warnings. The recommended solution \
|
||||
(http://stackoverflow.com/a/1946485) is to disable these warnings. */ \
|
||||
POLYVOX_MSC_WARNING_PUSH \
|
||||
POLYVOX_DISABLE_MSC_WARNING(4127) \
|
||||
do \
|
||||
{ \
|
||||
if ((condition)) \
|
||||
{ \
|
||||
PolyVox::logError() << (message); \
|
||||
throw type((message)); \
|
||||
} \
|
||||
} while(0) \
|
||||
POLYVOX_MSC_WARNING_POP
|
||||
|
||||
#define POLYVOX_THROW(type, message) \
|
||||
/* We use the do...while(0) construct in our macros (for reasons see here: http://stackoverflow.com/a/154138) \
|
||||
but Visual Studio gives unhelpful 'conditional expression is constant' warnings. The recommended solution \
|
||||
(http://stackoverflow.com/a/1946485) is to disable these warnings. */ \
|
||||
POLYVOX_MSC_WARNING_PUSH \
|
||||
POLYVOX_DISABLE_MSC_WARNING(4127) \
|
||||
do \
|
||||
{ \
|
||||
PolyVox::logError() << (message); \
|
||||
throw type((message)); \
|
||||
} while(0) \
|
||||
POLYVOX_MSC_WARNING_POP
|
||||
|
||||
#else
|
||||
namespace PolyVox
|
||||
{
|
||||
@ -273,17 +294,37 @@ namespace PolyVox
|
||||
void setThrowHandler(ThrowHandler newHandler);
|
||||
}
|
||||
|
||||
#define POLYVOX_THROW(type, message) \
|
||||
PolyVox::logError() << (message); \
|
||||
type except = (type)((message)); \
|
||||
getThrowHandler()((except), __FILE__, __LINE__)
|
||||
#define POLYVOX_THROW_IF(condition, type, message) \
|
||||
/* We use the do...while(0) construct in our macros (for reasons see here: http://stackoverflow.com/a/154138) \
|
||||
but Visual Studio gives unhelpful 'conditional expression is constant' warnings. The recommended solution \
|
||||
(http://stackoverflow.com/a/1946485) is to disable these warnings. */ \
|
||||
POLYVOX_MSC_WARNING_PUSH \
|
||||
POLYVOX_DISABLE_MSC_WARNING(4127) \
|
||||
do \
|
||||
{ \
|
||||
if ((condition)) \
|
||||
{ \
|
||||
PolyVox::logError() << (message); \
|
||||
type except = (type)((message)); \
|
||||
getThrowHandler()((except), __FILE__, __LINE__); \
|
||||
} \
|
||||
} while(0) \
|
||||
POLYVOX_MSC_WARNING_POP
|
||||
|
||||
#define POLYVOX_THROW(type, message) \
|
||||
/* We use the do...while(0) construct in our macros (for reasons see here: http://stackoverflow.com/a/154138) \
|
||||
but Visual Studio gives unhelpful 'conditional expression is constant' warnings. The recommended solution \
|
||||
(http://stackoverflow.com/a/1946485) is to disable these warnings. */ \
|
||||
POLYVOX_MSC_WARNING_PUSH \
|
||||
POLYVOX_DISABLE_MSC_WARNING(4127) \
|
||||
do \
|
||||
{ \
|
||||
PolyVox::logError() << (message); \
|
||||
type except = (type)((message)); \
|
||||
getThrowHandler()((except), __FILE__, __LINE__); \
|
||||
} while(0) \
|
||||
POLYVOX_MSC_WARNING_POP
|
||||
|
||||
// Some fast functions (getVoxel(), etc) use exceptions for error handling but don't want the overhead of logging.
|
||||
// This overhead is present even if no exception is thrown, probably because the presence of the logging code prevents
|
||||
// some inlining. Therefore we provide this macro which doesn't log for such specialised circumstances.
|
||||
#define POLYVOX_THROW_DONT_LOG(type, message) \
|
||||
type except = (type)((message)); \
|
||||
getThrowHandler()((except), __FILE__, __LINE__)
|
||||
#endif
|
||||
|
||||
namespace PolyVox
|
||||
|
Loading…
x
Reference in New Issue
Block a user