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:
parent
fe7e9c4af9
commit
c28398a1b3
1 changed files with 32 additions and 0 deletions
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue