text: #pragma once
  
  #include "Config/Atomic.h"
  #include "Config/Char.h"
  
  //////////////////////////////////////////////////////////////////////////
  #ifndef MENGINE_THREAD_GUARD
  #   ifdef MENGINE_DEBUG
  #       define MENGINE_THREAD_GUARD 1
  #   else
  #       define MENGINE_THREAD_GUARD 0
  #   endif
  #endif
  //////////////////////////////////////////////////////////////////////////
  namespace Mengine
  {
      class ThreadGuard
      {
      public:
          ThreadGuard();
          ~ThreadGuard();
  
      public:
          void reset();
          void check( const Char * _doc ) const;
          bool lock( bool _value ) const;
  
      protected:
          AtomicUInt32 m_id;
          mutable AtomicBool m_lock;
      };
  }
  //////////////////////////////////////////////////////////////////////////
  #if MENGINE_THREAD_GUARD
      //////////////////////////////////////////////////////////////////////////
  #   define MENGINE_THREAD_GUARD_INIT(Type)\
      public:\
      Mengine::ThreadGuard __mengine_thread_guard##Type\
      //////////////////////////////////////////////////////////////////////////
  #   define MENGINE_THREAD_GUARD_CHECK(Type, Self, Doc)\
      Self->__mengine_thread_guard##Type.check( Doc )
      //////////////////////////////////////////////////////////////////////////
  #   define MENGINE_THREAD_GUARD_RESET(Type, Self)\
      Self->__mengine_thread_guard##Type.reset()
      //////////////////////////////////////////////////////////////////////////
  #else
      //////////////////////////////////////////////////////////////////////////
  #   define MENGINE_THREAD_GUARD_INIT(Type)
      //////////////////////////////////////////////////////////////////////////
  #   define MENGINE_THREAD_GUARD_CHECK(Type, Self, Doc)
      //////////////////////////////////////////////////////////////////////////
  #   define MENGINE_THREAD_GUARD_RESET(Type, Self)
      //////////////////////////////////////////////////////////////////////////
  #endif