1
0
Fork 0
mirror of https://github.com/KingDuckZ/dindexer.git synced 2024-11-29 01:33:46 +00:00

Assert if get_or_create() causes other calls to itself.

This is to try and prevent infinite recursions.
This commit is contained in:
King_DuckZ 2016-03-09 21:35:22 +01:00
parent fe7e9c4af9
commit c28398a1b3

View file

@ -21,8 +21,29 @@
#include <ciso646>
#include <cassert>
#if !defined(NDEBUG)
# define LEANBASE_ASSERT_REENTRANCY
#endif
namespace mchlib {
namespace scantask {
#if defined(LEANBASE_ASSERT_REENTRANCY)
struct AutoSetBool {
explicit AutoSetBool ( bool* parBool ) :
m_bool(parBool)
{
assert(m_bool);
assert(not *m_bool);
*m_bool = true;
}
~AutoSetBool ( void ) noexcept {
*m_bool = false;
}
bool* m_bool;
};
#endif
template <typename T>
class LeanBase {
protected:
@ -39,16 +60,27 @@ namespace mchlib {
virtual T& on_data_get ( void ) = 0;
bool m_data_created;
#if defined(LEANBASE_ASSERT_REENTRANCY)
bool m_inside_call;
#endif
};
template <typename T>
LeanBase<T>::LeanBase() :
m_data_created(false)
#if defined(LEANBASE_ASSERT_REENTRANCY)
, m_inside_call(false)
#endif
{
}
template <typename T>
T& LeanBase<T>::get_or_create() {
#if defined(LEANBASE_ASSERT_REENTRANCY)
assert(not m_inside_call);
AutoSetBool auto_bool(&m_inside_call);
#endif
if (not m_data_created) {
m_data_created = true;
this->on_data_fill();