demotool/common.cc

78 lines
1.6 KiB
C++
Raw Normal View History

#include "externals.hh"
#include "common.hh"
#include "c-filewatcher.hh"
#include "c-opcomp.hh"
#include "c-ops.hh"
#include "c-project.hh"
#include "c-sync.hh"
#include "c-undo.hh"
namespace {
struct CommonData_
{
T_Project project;
T_FilesWatcher watcher;
T_SyncManager sync;
T_ScriptManager ops;
T_UndoManager undo;
2017-12-27 14:15:49 +01:00
CommonData_( T_FSPath const& path ) noexcept
: project{ path }
{}
};
2017-12-28 10:27:23 +01:00
uint32_t Initialised_{ 0 };
std::aligned_storage_t< sizeof( CommonData_ ) , alignof( CommonData_ ) > Instance_;
} // namespace <anon>
/*----------------------------------------------------------------------------*/
2017-12-28 10:27:23 +01:00
Common::Common(
2017-12-27 14:15:49 +01:00
T_FSPath const& path ) noexcept
{
2017-12-28 10:27:23 +01:00
if ( !Initialised_ ++ ) {
new ((char*)&Instance_) CommonData_( path );
}
}
2017-12-28 10:27:23 +01:00
Common::~Common( ) noexcept
{
2017-12-28 10:27:23 +01:00
assert( Initialised_ );
if ( !-- Initialised_ ) {
((CommonData_*)(char*)&Instance_)->~CommonData_( );
}
}
/*----------------------------------------------------------------------------*/
#define M_ACCESS_() ((CommonData_*)(char*)&Instance_)
#define M_GET_( P ) M_ACCESS_()->P
void Common::SetInteractiveMode( ) noexcept
{
auto* d{ M_ACCESS_( ) };
d->sync.enable( );
d->ops.enable( );
}
/*----------------------------------------------------------------------------*/
T_Project& Common::Project( ) noexcept
{ return M_GET_( project ); }
T_FilesWatcher& Common::Watcher( ) noexcept
{ return M_GET_( watcher ); }
T_SyncManager& Common::Sync( ) noexcept
{ return M_GET_( sync ); }
T_ScriptManager& Common::Ops( ) noexcept
{ return M_GET_( ops ); }
T_UndoManager& Common::Undo( ) noexcept
{ return M_GET_( undo ); }