You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
2.7 KiB
C++
153 lines
2.7 KiB
C++
#ifndef MultiBase_h__
|
|
#define MultiBase_h__
|
|
|
|
|
|
#include <boost/thread.hpp>
|
|
#include <string>
|
|
#include <map>
|
|
#include <QString>
|
|
#include <QMap>
|
|
|
|
template <class T>
|
|
class CMultiBase
|
|
{
|
|
|
|
public:
|
|
class PTR
|
|
{
|
|
|
|
public:
|
|
PTR(T* ptr){
|
|
m_PTR = ptr;
|
|
}
|
|
|
|
~PTR(){
|
|
if (m_PTR != 0){
|
|
m_PTR->m_mutexlock.unlock_shared();
|
|
}
|
|
}
|
|
|
|
bool valid(){
|
|
if (m_PTR != 0)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
T* operator->() { return m_PTR; }
|
|
|
|
private:
|
|
T* m_PTR;
|
|
};
|
|
|
|
protected:
|
|
static boost::recursive_mutex m_mutex_instancemap;
|
|
static std::map<std::string, T*> m_mapInstances;
|
|
QString m_strInstanceName;
|
|
boost::shared_mutex m_mutexlock;
|
|
|
|
public:
|
|
CMultiBase(const QString& strInstanceName)
|
|
{
|
|
m_strInstanceName = strInstanceName;
|
|
};
|
|
|
|
virtual ~CMultiBase(void)
|
|
{
|
|
|
|
};
|
|
|
|
virtual void Close()
|
|
{
|
|
return;
|
|
};
|
|
|
|
static void createinstance(const QString& strInstanceName)
|
|
{
|
|
|
|
boost::recursive_mutex::scoped_lock lock(m_mutex_instancemap);
|
|
|
|
if (strInstanceName.isEmpty())
|
|
return;
|
|
|
|
std::string sname = strInstanceName.toStdString();
|
|
typename std::map<std::string, T*>::iterator itr;
|
|
itr = m_mapInstances.find(sname);
|
|
|
|
if (itr == m_mapInstances.end())
|
|
{
|
|
m_mapInstances[sname] = new T(strInstanceName);
|
|
}
|
|
};
|
|
|
|
static T* getinstance(const QString& strInstanceName)
|
|
{
|
|
boost::recursive_mutex::scoped_lock lock(m_mutex_instancemap);
|
|
|
|
if (strInstanceName.isEmpty())
|
|
return 0;
|
|
|
|
std::string sname = strInstanceName.toStdString();
|
|
typename std::map<std::string, T*>::iterator itr;
|
|
itr = m_mapInstances.find(sname);
|
|
|
|
if (itr != m_mapInstances.end())
|
|
{
|
|
itr->second->m_mutexlock.lock_shared();
|
|
return itr->second;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
};
|
|
|
|
static void uninstance(const QString& strInstanceName)
|
|
{
|
|
boost::recursive_mutex::scoped_lock lock(m_mutex_instancemap);
|
|
|
|
if (strInstanceName.isEmpty())
|
|
return;
|
|
|
|
std::string sname = strInstanceName.toStdString();
|
|
typename std::map<std::string, T*>::iterator itr;
|
|
itr = m_mapInstances.find(sname);
|
|
|
|
if (itr != m_mapInstances.end())
|
|
{
|
|
T* pptr = itr->second;
|
|
pptr->m_mutexlock.lock();
|
|
pptr->m_mutexlock.unlock();
|
|
m_mapInstances.erase(itr);
|
|
pptr->Close();
|
|
}
|
|
};
|
|
|
|
static void uninstanceall()
|
|
{
|
|
boost::recursive_mutex::scoped_lock lock(m_mutex_instancemap);
|
|
|
|
for (typename std::map<std::string, T*>::iterator itr = m_mapInstances.begin(); itr != m_mapInstances.end();)
|
|
{
|
|
T* pptr = itr->second;
|
|
pptr->m_mutexlock.lock();
|
|
pptr->m_mutexlock.unlock();
|
|
m_mapInstances.erase(itr++);
|
|
pptr->Close();
|
|
}
|
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
template <class T>
|
|
std::map<std::string, T*> CMultiBase<T>::m_mapInstances;
|
|
template <class T>
|
|
boost::recursive_mutex CMultiBase<T>::m_mutex_instancemap;
|
|
|
|
|
|
#endif // MultiBase_h__
|