ngl_server 1.0
基于 Actor 模型的 C++ 服务器框架
ndefine.h File Reference

序列化宏、类型别名和协议ID定义。 More...

#include "tools/script/lua/serialize_lua.h"
#include "tools/serialize/nserialize.h"
#include "tools/tab/json/njson.h"
#include "lua.hpp"
#include <atomic>
#include <string>
#include <tuple>
#include <array>

Macros

#define DEF_PROTOCOL(...)
 定义协议结构体的序列化方法。
#define DEF_RCSV(...)
 定义CSV读取方法。
#define DEF_WCSV(...)
 定义CSV写入方法。
#define NUMARGS(...)
 计算可变参数宏的参数个数。
#define DEF_PARMNAME_(ISMG, ...)
 定义参数名称数组。
#define DEF_PARMNAME(...)
 定义参数名称数组(去除"m_"前缀)。
#define DEF_JSONFUNCTION_SPECIAL(...)
 定义JSON序列化方法(特殊版本)。
#define DEF_JSONFUNCTION(...)
 定义JSON序列化方法。
#define DEF_NLUA_FUNCTION(...)
 定义Lua绑定方法。
#define DEF_NLUA_SPECIAL_FUNCTION(KEYS, ...)
 定义Lua绑定方法(特殊版本)。
#define DPROTOCOL(NAME, ...)
 定义完整的协议结构体。

Detailed Description

序列化宏、类型别名和协议ID定义。

包含用于简化序列化、JSON、Lua绑定和协议定义的宏。 这些宏提供了统一的接口,用于自动生成序列化/反序列化代码。

Author
NingLeixueR
Date
2020-2025

Macro Definition Documentation

◆ DEF_JSONFUNCTION

#define DEF_JSONFUNCTION ( ...)
Value:
bool json_pop(rapidjson::Value& ajson) \
{ \
return ngl::njson::pop(ajson, parms() __VA_OPT__(, )__VA_ARGS__); \
} \
bool json_push(rapidjson::Value& ajson, rapidjson::Document::AllocatorType* aallocator) const \
{ \
return ngl::njson::push(ajson, aallocator, parms() __VA_OPT__(, )__VA_ARGS__); \
}

定义JSON序列化方法。

为结构体自动生成json_pop和json_push方法,用于JSON序列化/反序列化。 使用parms()方法获取参数名称。

Parameters
...要序列化的成员变量列表

◆ DEF_JSONFUNCTION_SPECIAL

#define DEF_JSONFUNCTION_SPECIAL ( ...)
Value:
bool json_pop(rapidjson::Value& ajson) \
{ \
return ngl::njson::pop(ajson __VA_OPT__(, )__VA_ARGS__); \
} \
bool json_push(rapidjson::Value& ajson, rapidjson::Document::AllocatorType* aallocator) const \
{ \
return ngl::njson::push(ajson, aallocator __VA_OPT__(, )__VA_ARGS__); \
}

定义JSON序列化方法(特殊版本)。

为结构体自动生成json_pop和json_push方法,用于JSON序列化/反序列化。 不使用parms()方法,直接传递参数。

Parameters
...要序列化的成员变量列表

◆ DEF_NLUA_FUNCTION

#define DEF_NLUA_FUNCTION ( ...)
Value:
void nlua_push(lua_State* aL, const char* aname = nullptr)const \
{ \
ngl::nlua_table::table_push(aL, aname, parms() __VA_OPT__(, )__VA_ARGS__); \
} \
bool nlua_pop(lua_State* aL, const char* aname = nullptr) \
{ \
return ngl::nlua_table::table_pop(aL, aname, parms() __VA_OPT__(, )__VA_ARGS__);\
}

定义Lua绑定方法。

为结构体自动生成nlua_push和nlua_pop方法,用于Lua绑定。 使用parms()方法获取参数名称。

Parameters
...要绑定的成员变量列表

◆ DEF_NLUA_SPECIAL_FUNCTION

#define DEF_NLUA_SPECIAL_FUNCTION ( KEYS,
... )
Value:
void nlua_push(lua_State* aL, const char* aname = nullptr)const \
{ \
ngl::nlua_table::table_push(aL, aname, KEYS __VA_OPT__(, )__VA_ARGS__); \
} \
bool nlua_pop(lua_State* aL, const char* aname = nullptr) \
{ \
return ngl::nlua_table::table_pop(aL, aname, KEYS __VA_OPT__(, )__VA_ARGS__); \
}

定义Lua绑定方法(特殊版本)。

为结构体自动生成nlua_push和nlua_pop方法,用于Lua绑定。 使用自定义的KEYS参数名称。

Parameters
KEYS参数名称列表
...要绑定的成员变量列表

◆ DEF_PARMNAME

#define DEF_PARMNAME ( ...)
Value:
DEF_PARMNAME_(true __VA_OPT__(, )__VA_ARGS__)

定义参数名称数组(去除"m_"前缀)。

为结构体自动生成parms()方法,返回成员变量名称数组,自动去除"m_"前缀。

Parameters
...成员变量列表

◆ DEF_PARMNAME_

#define DEF_PARMNAME_ ( ISMG,
... )
Value:
static std::array<const char*, NUMARGS(__VA_ARGS__)>& parms() \
{ \
static std::array<const char*, NUMARGS(__VA_ARGS__)> tempvec{}; \
static std::string tempstr(#__VA_ARGS__); \
if(!tempstr.empty()) \
{ \
static std::once_flag lfirst; \
std::call_once(lfirst, [&]() \
{ \
ngl::tools::split_str<NUMARGS(__VA_ARGS__)>(&tempstr[0], (int32_t)tempstr.size(), tempvec); \
if constexpr(ISMG) \
{ \
for (const char*& item : tempvec) \
{ \
if (memcmp("m_", item, 2) == 0) \
{ \
item = &(item[2]); \
} \
} \
} \
}); \
} \
return tempvec; \
}

定义参数名称数组。

为结构体自动生成parms()方法,返回成员变量名称数组。 支持去除"m_"前缀(当ISMG为true时)。

Parameters
ISMG是否去除"m_"前缀
...成员变量列表

◆ DEF_PROTOCOL

#define DEF_PROTOCOL ( ...)
Value:
bool push_format(ngl::ser::serialize_push* aser)const \
{ \
return ngl::ser::nserialize::push(aser __VA_OPT__(, )__VA_ARGS__); \
} \
bool pop_format(ngl::ser::serialize_pop* aser) \
{ \
return ngl::ser::nserialize::pop(aser __VA_OPT__(, )__VA_ARGS__); \
} \
void bytes_format(ngl::ser::serialize_byte* aser)const \
{ \
ngl::ser::nserialize::bytes(aser __VA_OPT__(, )__VA_ARGS__); \
}

定义协议结构体的序列化方法。

为协议结构体自动生成push_format、pop_format和bytes_format方法。 这些方法使用nserialize引擎进行序列化/反序列化操作。

Parameters
...要序列化的成员变量列表
Note
使用示例:
struct my_protocol {
int32_t id;
std::string name;
DEF_PROTOCOL(id, name)
};

◆ DEF_RCSV

#define DEF_RCSV ( ...)
Value:
return ngl::rcsv::readcsv(apair __VA_OPT__(, )__VA_ARGS__);

定义CSV读取方法。

为结构体自动生成readcsv方法,用于从CSV文件读取数据。

Parameters
...要读取的成员变量列表

◆ DEF_WCSV

#define DEF_WCSV ( ...)
Value:
return ngl::wcsv::writecsv(apair __VA_OPT__(, )__VA_ARGS__);

定义CSV写入方法。

为结构体自动生成writecsv方法,用于将数据写入CSV文件。

Parameters
...要写入的成员变量列表

◆ DPROTOCOL

#define DPROTOCOL ( NAME,
... )
Value:
DEF_PARMNAME(__VA_ARGS__) \
DEF_JSONFUNCTION(__VA_ARGS__) \
DEF_PROTOCOL(__VA_ARGS__) \
DEF_NLUA_FUNCTION(__VA_ARGS__)

定义完整的协议结构体。

为协议结构体自动生成所有必要的序列化方法,包括:

  • parms():参数名称数组
  • json_pop/json_push:JSON序列化方法
  • push_format/pop_format/bytes_format:二进制序列化方法
  • nlua_push/nlua_pop:Lua绑定方法
    Parameters
    NAME协议名称(未使用,仅为可读性)
    ...要序列化的成员变量列表
    Note
    使用示例:
    struct my_protocol {
    int32_t id;
    std::string name;
    DPROTOCOL(my_protocol, id, name)
    };

◆ NUMARGS

#define NUMARGS ( ...)
Value:
std::tuple_size<decltype(std::make_tuple(__VA_ARGS__))>::value

计算可变参数宏的参数个数。

使用模板元编程技术,在编译期计算可变参数的数量。

Parameters
...可变参数列表
Returns
参数个数(编译期常量)