#pragma once

#ifdef CHECK_SOFTWARE_MODES
  #define MODE  inSoftwareMode
  #define MODE_ inSoftwareMode,
#else
  #define MODE
  #define MODE_
#endif

#ifdef CHECK_SOFTWARE_MODES
  class BOOT_mode_class {
    private: BOOT_mode_class (void) = delete ;
    private: BOOT_mode_class & operator = (const BOOT_mode_class &) = delete ;

    public: BOOT_mode_class (const BOOT_mode_class &) ;
  } ;
#endif

#ifdef CHECK_SOFTWARE_MODES
  #define BOOT_MODE const BOOT_mode_class MODE
  #define BOOT_MODE_ const BOOT_mode_class MODE,
#else
  #define BOOT_MODE void
  #define BOOT_MODE_
#endif

#ifdef CHECK_SOFTWARE_MODES
  class INIT_mode_class {
    private: INIT_mode_class (void) = delete ;
    private: INIT_mode_class & operator = (const INIT_mode_class &) = delete ;

    public: INIT_mode_class (const INIT_mode_class &) ;
  };
#endif

#ifdef CHECK_SOFTWARE_MODES
  #define INIT_MODE  const INIT_mode_class MODE
  #define INIT_MODE_ const INIT_mode_class MODE,
#else
  #define INIT_MODE  void
  #define INIT_MODE_
#endif

#ifdef CHECK_SOFTWARE_MODES
  class USER_mode_class {
    private: USER_mode_class (void) = delete ;
    private: USER_mode_class & operator = (const USER_mode_class &) = delete ;

    public: USER_mode_class (const USER_mode_class &) ;
  } ;
#endif

#ifdef CHECK_SOFTWARE_MODES
  #define USER_MODE   const USER_mode_class MODE
  #define USER_MODE_  const USER_mode_class MODE,
#else
  #define USER_MODE  void
  #define USER_MODE_
#endif

#ifdef CHECK_SOFTWARE_MODES
  class KERNEL_mode_class {
    private: KERNEL_mode_class (void) = delete ;
    private: KERNEL_mode_class & operator = (const KERNEL_mode_class &) = delete ;

    public: KERNEL_mode_class (const KERNEL_mode_class &) ;
  } ;
#endif

#ifdef CHECK_SOFTWARE_MODES
  #define KERNEL_MODE   const KERNEL_mode_class MODE
  #define KERNEL_MODE_  const KERNEL_mode_class MODE,
#else
  #define KERNEL_MODE   void
  #define KERNEL_MODE_
#endif

#ifdef CHECK_SOFTWARE_MODES
  class IRQ_mode_class {
    private: IRQ_mode_class (void) = delete ;
    private: IRQ_mode_class & operator = (const IRQ_mode_class &) = delete ;

    public: IRQ_mode_class (const IRQ_mode_class &) ;
    public: IRQ_mode_class (const KERNEL_mode_class &) ;
    public: IRQ_mode_class (const INIT_mode_class &) ;
  } ;
#endif

#ifdef CHECK_SOFTWARE_MODES
  #define IRQ_MODE   const IRQ_mode_class MODE
  #define IRQ_MODE_  const IRQ_mode_class MODE,
#else
  #define IRQ_MODE   void
  #define IRQ_MODE_
#endif

#ifdef CHECK_SOFTWARE_MODES
  class SECTION_mode_class {
    private: SECTION_mode_class (void) = delete ;
    private: SECTION_mode_class & operator = (const SECTION_mode_class &) = delete ;

    public: SECTION_mode_class (const SECTION_mode_class &) ;
    public: SECTION_mode_class (const IRQ_mode_class &) ;
    public: SECTION_mode_class (const KERNEL_mode_class &) ;
    public: SECTION_mode_class (const INIT_mode_class &) ;
  } ;
#endif

#ifdef CHECK_SOFTWARE_MODES
  #define SECTION_MODE  const SECTION_mode_class MODE
  #define SECTION_MODE_ const SECTION_mode_class MODE,
#else
  #define SECTION_MODE  void
  #define SECTION_MODE_
#endif

#ifdef CHECK_SOFTWARE_MODES
  class FAULT_mode_class {
    private: FAULT_mode_class (void) = delete ;
    private: FAULT_mode_class & operator = (const FAULT_mode_class &) = delete ;

    public: FAULT_mode_class (const FAULT_mode_class &) ;
  } ;
#endif

#ifdef CHECK_SOFTWARE_MODES
  #define FAULT_MODE  const FAULT_mode_class MODE
  #define FAULT_MODE_ const FAULT_mode_class MODE,
#else
  #define FAULT_MODE  void
  #define FAULT_MODE_
#endif

#ifdef CHECK_SOFTWARE_MODES
  class ANY_mode_class {
    private: ANY_mode_class (void) = delete ;
    private: ANY_mode_class & operator = (const ANY_mode_class &) = delete ;

    public: ANY_mode_class (const ANY_mode_class &) ;
    public: ANY_mode_class (const SECTION_mode_class &) ;
    public: ANY_mode_class (const IRQ_mode_class &) ;
    public: ANY_mode_class (const KERNEL_mode_class &) ;
    public: ANY_mode_class (const INIT_mode_class &) ;
    public: ANY_mode_class (const USER_mode_class &) ;
  } ;
#endif

#ifdef CHECK_SOFTWARE_MODES
  #define ANY_MODE  const ANY_mode_class MODE
  #define ANY_MODE_ const ANY_mode_class MODE,
#else
  #define ANY_MODE  void
  #define ANY_MODE_
#endif