1
0
mirror of https://github.com/jaredtao/TaoQuick.git synced 2025-01-31 21:22:58 +08:00
2020-10-29 15:26:24 +08:00

150 lines
5.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <functional>
#include <map>
#include <memory>
#include <type_traits>
#include <typeindex>
#include <typeinfo>
#include <unordered_map>
namespace TaoCommon {
//对象存储器
template<typename Key, typename Value>
class ObjectMap
{
public:
virtual ~ObjectMap() { clear(); }
void addObj(const Key &key, const Value &obj) { m_objMap[key] = obj; }
bool removeObj(const Key &key) { return (0 != m_objMap.erase(key)); }
Value getObj(const Key &key) const
{
auto itor = m_objMap.find(key);
if (itor == m_objMap.end()) {
return nullptr;
} else {
return itor->second;
}
}
template<class CallbackType>
void forEach(const CallbackType &callback) const
{
for (const auto &pair : m_objMap) {
callback(pair.second.get());
}
}
void clear() { m_objMap.clear(); }
protected:
std::unordered_map<Key, Value> m_objMap;
};
//智能对象存储器。自动生成key自动管理对象。
template<typename ObjectType>
class CObjectMap
{
public:
virtual ~CObjectMap() { clear(); }
template<typename DeriveObjectType>
DeriveObjectType *getObject() const
{
static_assert(std::is_base_of<ObjectType, DeriveObjectType>::value,
"DeriveObjectType must be derive from ObjectType");
auto objPtr = m_objMap.getObj(std::type_index(typeid(std::shared_ptr<DeriveObjectType>)));
return std::static_pointer_cast<DeriveObjectType>(objPtr).get();
}
template<typename DeriveObjectType, typename... Args>
void createObject(Args &... args)
{
static_assert(std::is_base_of<ObjectType, DeriveObjectType>::value,
"DeriveObjectType must be derive from ObjectType");
auto obj = std::make_shared<DeriveObjectType>(args...);
m_objMap.addObj(std::type_index(typeid(obj)), std::static_pointer_cast<ObjectType>(obj));
}
template<typename DeriveObjectType>
bool destroyObject()
{
static_assert(std::is_base_of<ObjectType, DeriveObjectType>::value,
"DeriveObjectType must be derive from ObjectType");
return m_objMap.removeObj(std::type_index(typeid(std::shared_ptr<DeriveObjectType>)));
}
void forEach(const std::function<void(ObjectType *)> &callback) const
{
m_objMap.forEach(callback);
}
void clear() { m_objMap.clear(); }
protected:
ObjectMap<std::type_index, std::shared_ptr<ObjectType>> m_objMap;
};
//优先级对象存储器。自动生成key自动管理对象。支持按优先级处理
template<typename ObjectType>
class CLevelObjectMap
{
public:
virtual ~CLevelObjectMap() { clear(); }
template<typename DeriveObjectType>
DeriveObjectType *getObject() const
{
static_assert(std::is_base_of<ObjectType, DeriveObjectType>::value,
"DeriveObjectType must be derive from ObjectType");
auto index = std::type_index(typeid(std::shared_ptr<DeriveObjectType>));
for (const auto &mainPair : m_map) {
const std::unordered_map<std::type_index, std::shared_ptr<ObjectType>> &subMap =
mainPair.second;
auto itor = subMap.find(index);
if (itor != subMap.end()) {
return std::static_pointer_cast<DeriveObjectType>(itor->second).get();
}
}
return nullptr;
}
template<typename DeriveObjectType, typename... Args>
void createObject(uint32_t level, Args &&... args)
{
static_assert(std::is_base_of<ObjectType, DeriveObjectType>::value,
"DeriveObjectType must be derive from ObjectType");
auto obj = std::make_shared<DeriveObjectType>(args...);
m_map[level][std::type_index(typeid(obj))] = std::static_pointer_cast<ObjectType>(obj);
}
template<typename DeriveObjectType>
bool destroyObject()
{
static_assert(std::is_base_of<ObjectType, DeriveObjectType>::value,
"DeriveObjectType must be derive from ObjectType");
auto index = std::type_index(typeid(std::shared_ptr<DeriveObjectType>));
for (auto &mainPair : m_map) {
std::unordered_map<std::type_index, std::shared_ptr<ObjectType>> &subMap =
mainPair.second;
auto itor = subMap.find(index);
if (itor != subMap.end()) {
auto retItor = subMap.erase(itor);
return retItor != subMap.end();
}
}
return false;
}
void forEach(const std::function<void(ObjectType *)> &callback) const
{
for (const auto &mainPair : m_map) {
const std::unordered_map<std::type_index, std::shared_ptr<ObjectType>> &subMap =
mainPair.second;
for (const auto &subPair : subMap) {
callback(subPair.second.get());
}
}
}
void clear() { m_map.clear(); }
private:
std::map<uint32_t, std::unordered_map<std::type_index, std::shared_ptr<ObjectType>>> m_map;
};
} // namespace TaoCommon