CItem
#ifndef _CITEM_H_
#define _CITEM_H_
#include <map>
#include <memory>
template <typename T>
class CItem
{
public:
static void erase(long long id);
static std::shared_ptr<CItem<T> > at(long long id);
std::shared_ptr<T> data();
void setData(std::shared_ptr<T> ptr);
static std::shared_ptr<CItem<T> > createItem();
static size_t size();
long long ID();
~CItem();
explicit CItem();
private:
long long m_id;
std::shared_ptr<T> m_data;
static std::map<long long, std::shared_ptr<CItem<T>>>* m_items;
static long long g_id;
};
template<typename T>
std::map<long long, std::shared_ptr<CItem<T> >>* CItem<T>::m_items \
= new std::map<long long, std::shared_ptr<CItem<T>>>;
template<typename T>
long long CItem<T>::g_id = 0;
template<typename T>
long long CItem<T>::ID()
{
return m_id;
}
template<typename T>
std::shared_ptr<T> CItem<T>::data()
{
return m_data;
}
template<typename T>
inline void CItem<T>::setData(std::shared_ptr<T> ptr)
{
m_data = std::move(ptr);
}
template<typename T>
inline std::shared_ptr<CItem<T> > CItem<T>::createItem()
{
std::shared_ptr<CItem<T>> item = std::make_shared<CItem<T> >();
std::shared_ptr<T> data = std::make_shared<T>();
static_cast<CItem<T>*>(item.get())->setData(data);
std::pair<long long, std::shared_ptr<CItem<T>>> pair(static_cast<CItem<T>*>(item.get())->ID(),item);
m_items->insert(pair);
return item;
}
template<typename T>
inline size_t CItem<T>::size()
{
return m_items->size();
}
template<typename T>
inline std::shared_ptr<CItem<T> > CItem<T>::at(long long id)
{
if (m_items->find(id) != m_items->end())
return m_items->at(id);
return nullptr;
}
template<typename T>
inline void CItem<T>::erase(long long id)
{
if (m_items->find(id) != m_items->end())
{
m_items->erase(id);
}
}
template<typename T>
CItem<T>::~CItem()
{
}
template<typename T>
CItem<T>::CItem()
{
m_id = g_id++;
}
#endif