/**
* This file is part of Code::Blocks Studio, an open-source cross-platform IDE
* Copyright (C) 2003 Yiannis An. Mandravellos
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Contact e-mail: Yiannis An. Mandravellos <mandrav@codeblocks.org>
* Program URL : http://www.codeblocks.org
*
* @file managerproxy.h
* @author Muhammad Haggag (MHaggag@optimize-eg.com)
* @brief Implements proxy functionality required for sharing codeblocks managers across DLLs
*/
#if !defined( __SDK_MANAGERPROXY_H )
#define __SDK_MANAGERPROXY_H
// Forward decls must come before including manangers.h
class wxConfigBase;
class Manager;
class TemplateManager;
class PluginManager;
class EditorManager;
class MacrosManager;
class MessageManager;
class ProjectManager;
class ToolsManager;
class PersonalityManager;
#ifdef STATIC_SDK
#include "Managers/Managers.h"
#endif
/**
* VC++ can't export/import classes easily, so we build the sdk as a lib. However, singleton
* managers should be in a DLL to be shared across "src" and all plugins. So, we do the
* following for static lib SDK builds:
* Define an instance of every (singleton) manager in a "CodeBlocksManagers.dll". The
* manager classes use those instances instead of local ones.
*
* We define accessor functions (GetManager/SetManager) to the manager instance for both
* implementations (static and dynamic lib SDK)
*
* @todo Perhaps use an overloaded assignment operator instead of "Set"
*/
template <class ManagerT>
class GenericManagerProxy
{
#ifndef STATIC_SDK
static ManagerT* m_Manager;
#endif
public:
#ifndef STATIC_SDK
static inline ManagerT* Get() { return m_Manager; }
static inline void Set( ManagerT* manager ) { m_Manager = manager; }
#else
static inline ManagerT* Get()
{
// We need to pass the null manager pointer so that the compiler can know which
// overload to user
return Managers::Get( (ManagerT*)0 );
}
static inline void Set( ManagerT* manager ) { Managers::Set( manager ); }
#endif
};
#ifndef STATIC_SDK
template <class ManagerT> ManagerT* GenericManagerProxy<ManagerT>::m_Manager;
#endif
typedef GenericManagerProxy<Manager> ManagerProxy;
typedef GenericManagerProxy<wxConfigBase> ConfigBaseProxy;
typedef GenericManagerProxy<TemplateManager> TemplateManagerProxy;
typedef GenericManagerProxy<PluginManager> PluginManagerProxy;
typedef GenericManagerProxy<EditorManager> EditorManagerProxy;
typedef GenericManagerProxy<MacrosManager> MacrosManagerProxy;
typedef GenericManagerProxy<MessageManager> MessageManagerProxy;
typedef GenericManagerProxy<ProjectManager> ProjectManagerProxy;
typedef GenericManagerProxy<ToolsManager> ToolsManagerProxy;
typedef GenericManagerProxy<PersonalityManager> PersonalityManagerProxy;
#endif // if !defined( __SDK_MANAGERPROXY_H )
syntax highlighted by Code2HTML, v. 0.9.1