73 lines
2.4 KiB
C++
73 lines
2.4 KiB
C++
#pragma once
|
|
|
|
#define DECLARE_COMMON_HEAD(classname, base, filename, key, tbl_type) \
|
|
class classname : public base \
|
|
{ \
|
|
protected: \
|
|
friend class MetaMgr; \
|
|
static constexpr int table_type = tbl_type; \
|
|
static constexpr const char* prim_key = key; \
|
|
static constexpr const char* table_name= filename; \
|
|
static std::vector<classname*> raw_list; \
|
|
static std::map<long long, classname*> id_hash; \
|
|
static std::map<std::string, classname*> name_hash; \
|
|
public: \
|
|
static void Traverse(std::function<void (const classname*, bool&)> cb); \
|
|
static void MutTraverse(std::function<void (classname*, bool&)> cb);
|
|
|
|
#define DECLARE_ID_TABLE(classname, base, filename, key) \
|
|
DECLARE_COMMON_HEAD(classname, base, filename, key, 1) \
|
|
public: \
|
|
static classname* GetById(long long id) \
|
|
{ \
|
|
auto itr = id_hash.find(id); \
|
|
return itr != id_hash.end() ? itr->second : nullptr; \
|
|
};
|
|
|
|
#define DECLARE_AUTO_ID_TABLE(classname, base, filename) \
|
|
DECLARE_COMMON_HEAD(classname, base, filename, "", 0) \
|
|
public: \
|
|
static classname* GetById(long long id) \
|
|
{ \
|
|
auto itr = id_hash.find(id); \
|
|
return itr != id_hash.end() ? itr->second : nullptr; \
|
|
};
|
|
|
|
#define DECLARE_NAME_TABLE(classname, base, filename, key) \
|
|
DECLARE_COMMON_HEAD(classname, base, filename, key, 2) \
|
|
public: \
|
|
static classname* GetByName(const std::string& name) \
|
|
{ \
|
|
auto itr = name_hash.find(name); \
|
|
return itr != name_hash.end() ? itr->second : nullptr; \
|
|
};
|
|
|
|
|
|
#define IMPL_TABLE(classname) \
|
|
std::vector<classname*> classname::raw_list; \
|
|
std::map<long long, classname*> classname::id_hash; \
|
|
std::map<std::string, classname*> classname::name_hash; \
|
|
namespace mt \
|
|
{ \
|
|
void classname::Traverse(std::function<void (const classname*, bool&)> cb) \
|
|
{ \
|
|
bool stop = false; \
|
|
for (auto& itr : raw_list) { \
|
|
cb(itr, stop); \
|
|
if (stop) { \
|
|
break; \
|
|
} \
|
|
} \
|
|
} \
|
|
void classname::MutTraverse(std::function<void (classname*, bool&)> cb) \
|
|
{ \
|
|
bool stop = false; \
|
|
for (auto& itr : raw_list) { \
|
|
cb(itr, stop); \
|
|
if (stop) { \
|
|
break; \
|
|
} \
|
|
} \
|
|
} \
|
|
}
|