diff --git a/core/basic/marco/basic.h b/core/basic/marco/basic.h new file mode 100644 index 0000000..6b9934c --- /dev/null +++ b/core/basic/marco/basic.h @@ -0,0 +1,6 @@ +#pragma once +#define STR_MARCO(marco) #marco +#define MARCO_CONNECT2(a, b) a##b +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) +#endif \ No newline at end of file diff --git a/core/basic/marco/data.hpp b/core/basic/marco/data.hpp new file mode 100644 index 0000000..283e359 --- /dev/null +++ b/core/basic/marco/data.hpp @@ -0,0 +1,88 @@ +// +// Created by zhaohe on 19-5-30. +// + +#pragma once +#include "iflytopcpp/core/basic/marco/marco_list.h" + +#define DATA_ID(x) x +#define DATA(...) \ + DATA_ID(DATA_APPLY(DATA_PP_MAP_VAR_COUNT, \ + ZWSD_PARAMETER_COUNT(__VA_ARGS__))(__VA_ARGS__)) +#define DATA_PP_MAP_VAR_COUNT(count) DATAM##count +#define DATA_APPLY(macro, ...) DATA_ID(macro(__VA_ARGS__)) + +#define DATA1(v1) \ + __typeof__(v1) &v1Value() { return v1; } + +#define DATA2(v1, v2) \ + __typeof__(v1) &v1Value() { return v1; } \ + __typeof__(v2) &v2Value() { return v2; } + +#define DATA3(v1, v2, v3) \ + __typeof__(v1) &v1Value() { return v1; } \ + __typeof__(v2) &v2Value() { return v2; } \ + __typeof__(v3) &v3Value() { return v3; } + +#define DATA4(v1, v2, v3, v4) \ + __typeof__(v1) &v1Value() { return v1; } \ + __typeof__(v2) &v2Value() { return v2; } \ + __typeof__(v3) &v3Value() { return v3; } \ + __typeof__(v4) &v4Value() { return v4; } + +#define DATA5(v1, v2, v3, v4, v5) \ + __typeof__(v1) &v1Value() { return v1; } \ + __typeof__(v2) &v2Value() { return v2; } \ + __typeof__(v3) &v3Value() { return v3; } \ + __typeof__(v4) &v4Value() { return v4; } \ + __typeof__(v5) &v5Value() { return v5; } + +#define DATA6(v1, v2, v3, v4, v5, v6) \ + __typeof__(v1) &v1Value() { return v1; } \ + __typeof__(v2) &v2Value() { return v2; } \ + __typeof__(v3) &v3Value() { return v3; } \ + __typeof__(v4) &v4Value() { return v4; } \ + __typeof__(v5) &v5Value() { return v5; } \ + __typeof__(v6) &v6Value() { return v6; } + +#define DATA7(v1, v2, v3, v4, v5, v6, v7) \ + __typeof__(v1) &v1Value() { return v1; } \ + __typeof__(v2) &v2Value() { return v2; } \ + __typeof__(v3) &v3Value() { return v3; } \ + __typeof__(v4) &v4Value() { return v4; } \ + __typeof__(v5) &v5Value() { return v5; } \ + __typeof__(v6) &v6Value() { return v6; } \ + __typeof__(v7) &v7Value() { return v7; } + +#define DATA8(v1, v2, v3, v4, v5, v6, v7, v8) \ + __typeof__(v1) &v1Value() { return v1; } \ + __typeof__(v2) &v2Value() { return v2; } \ + __typeof__(v3) &v3Value() { return v3; } \ + __typeof__(v4) &v4Value() { return v4; } \ + __typeof__(v5) &v5Value() { return v5; } \ + __typeof__(v6) &v6Value() { return v6; } \ + __typeof__(v7) &v7Value() { return v7; } \ + __typeof__(v8) &v8Value() { return v8; } + +#define DATA9(v1, v2, v3, v4, v5, v6, v7, v8, v9) \ + __typeof__(v1) &v1Value() { return v1; } \ + __typeof__(v2) &v2Value() { return v2; } \ + __typeof__(v3) &v3Value() { return v3; } \ + __typeof__(v4) &v4Value() { return v4; } \ + __typeof__(v5) &v5Value() { return v5; } \ + __typeof__(v6) &v6Value() { return v6; } \ + __typeof__(v7) &v7Value() { return v7; } \ + __typeof__(v8) &v8Value() { return v8; } \ + __typeof__(v9) &v9Value() { return v9; } + +#define DATA10(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) \ + __typeof__(v1) &v1Value() { return v1; } \ + __typeof__(v2) &v2Value() { return v2; } \ + __typeof__(v3) &v3Value() { return v3; } \ + __typeof__(v4) &v4Value() { return v4; } \ + __typeof__(v5) &v5Value() { return v5; } \ + __typeof__(v6) &v6Value() { return v6; } \ + __typeof__(v7) &v7Value() { return v7; } \ + __typeof__(v8) &v8Value() { return v8; } \ + __typeof__(v9) &v9Value() { return v9; } \ + __typeof__(v10) &v1Value0() { return v10; } diff --git a/core/basic/marco/marco.hpp b/core/basic/marco/marco.hpp new file mode 100644 index 0000000..02a147d --- /dev/null +++ b/core/basic/marco/marco.hpp @@ -0,0 +1,7 @@ +#pragma once +// +#include "iflytopcpp/core/basic/marco/basic.h" +// +#include "iflytopcpp/core/basic/marco/marco_list.h" +// +#include "iflytopcpp/core/basic/marco/data.hpp" \ No newline at end of file diff --git a/core/basic/marco/marco_list.h b/core/basic/marco/marco_list.h new file mode 100644 index 0000000..54467fb --- /dev/null +++ b/core/basic/marco/marco_list.h @@ -0,0 +1,259 @@ +#pragma once +// #include "zwtimecpp/core/utils/better-enums/enum.h" +// #include "/home/zhaohe/workplace/project/MobileWrappingMachines/tmp/enum.h" +#define ZWSD_MACROS_ID(x) x +#define ZMID(...) __VA_ARGS__ + +#define ZWSD_APPLY(macro, ...) ZWSD_MACROS_ID(macro(__VA_ARGS__)) +#define MARCO_APPLY ZWSD_APPLY +/** + * @brief 参数的数量最大是64个,当大于64的时候会出错 + */ +#define ZWSD_COUNT_BASIC(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ + _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, \ + _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, \ + _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, \ + _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, \ + _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, \ + _63, _64, count, ...) \ + count + +#define ZWSD_PARAMETER_COUNT(...) \ + ZWSD_MACROS_ID(ZWSD_COUNT_BASIC( \ + __VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \ + 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, \ + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, \ + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)) + +/** + * @brief MARCO_LIST + * @Usage: + * + * 这个工具用来使宏支持多参数功能 + * 例如定义一个宏LIST实现下面功能 + * + * LIST(int,3,a,b,c,d,e) + * 展开后如下 + * int a = 3; + * int b = 3; + * int c = 3; + * int d = 3; + * int e = 3; + * + * LIST(int,3,a) + * 展开后如下 + * int a = 3; + * + * 实现方法 + * + * #define EACH_EXPTR(type,initvalue,v3,v4,v5,index,varName) \ + * type varName = initvalue; + * + * #define LIST(type,initvalue,...) \ + * MARCO_LIST(EACH_EXPTR,type,initvalue,_3,_4,_5,__VA_ARGS__) + */ +/** + * @brief + * + */ +#define MARCO_LIST(marco, v1, v2, v3, v4, v5, ...) \ + ZWSD_MACROS_ID( \ + V5M_PP_MAP(ZWSD_MACROS_ID(marco), v1, v2, v3, v4, v5, __VA_ARGS__)) + +#define V5M_PP_MAP(macro, v1, v2, v3, v4, v5, ...) \ + ZWSD_MACROS_ID( \ + ZWSD_APPLY(V5_PP_MAP_VAR_COUNT, ZWSD_PARAMETER_COUNT(__VA_ARGS__))( \ + macro, v1, v2, v3, v4, v5, __VA_ARGS__)) + +#define V5_PP_MAP_VAR_COUNT(count) V5M##count +#define V5M1(m, v1, v2, v3, v4, v5, x) m(v1, v2, v3, v4, v5, 0, x) +#define V5M2(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 1, x) \ + ZWSD_MACROS_ID(V5M1(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M3(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 2, x) \ + ZWSD_MACROS_ID(V5M2(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M4(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 3, x) \ + ZWSD_MACROS_ID(V5M3(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M5(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 4, x) \ + ZWSD_MACROS_ID(V5M4(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M6(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 5, x) \ + ZWSD_MACROS_ID(V5M5(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M7(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 6, x) \ + ZWSD_MACROS_ID(V5M6(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M8(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 7, x) \ + ZWSD_MACROS_ID(V5M7(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M9(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 8, x) \ + ZWSD_MACROS_ID(V5M8(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M10(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 9, x) \ + ZWSD_MACROS_ID(V5M9(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M11(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 10, x) \ + ZWSD_MACROS_ID(V5M10(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M12(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 11, x) \ + ZWSD_MACROS_ID(V5M11(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M13(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 12, x) \ + ZWSD_MACROS_ID(V5M12(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M14(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 13, x) \ + ZWSD_MACROS_ID(V5M13(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M15(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 14, x) \ + ZWSD_MACROS_ID(V5M14(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M16(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 15, x) \ + ZWSD_MACROS_ID(V5M15(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M17(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 16, x) \ + ZWSD_MACROS_ID(V5M16(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M18(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 17, x) \ + ZWSD_MACROS_ID(V5M17(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M19(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 18, x) \ + ZWSD_MACROS_ID(V5M18(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M20(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 19, x) \ + ZWSD_MACROS_ID(V5M19(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M21(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 20, x) \ + ZWSD_MACROS_ID(V5M20(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M22(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 21, x) \ + ZWSD_MACROS_ID(V5M21(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M23(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 22, x) \ + ZWSD_MACROS_ID(V5M22(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M24(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 23, x) \ + ZWSD_MACROS_ID(V5M23(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M25(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 24, x) \ + ZWSD_MACROS_ID(V5M24(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M26(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 25, x) \ + ZWSD_MACROS_ID(V5M25(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M27(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 26, x) \ + ZWSD_MACROS_ID(V5M26(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M28(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 27, x) \ + ZWSD_MACROS_ID(V5M27(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M29(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 28, x) \ + ZWSD_MACROS_ID(V5M28(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M30(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 29, x) \ + ZWSD_MACROS_ID(V5M29(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M31(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 30, x) \ + ZWSD_MACROS_ID(V5M30(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M32(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 31, x) \ + ZWSD_MACROS_ID(V5M31(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M33(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 32, x) \ + ZWSD_MACROS_ID(V5M32(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M34(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 33, x) \ + ZWSD_MACROS_ID(V5M33(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M35(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 34, x) \ + ZWSD_MACROS_ID(V5M34(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M36(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 35, x) \ + ZWSD_MACROS_ID(V5M35(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M37(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 36, x) \ + ZWSD_MACROS_ID(V5M36(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M38(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 37, x) \ + ZWSD_MACROS_ID(V5M37(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M39(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 38, x) \ + ZWSD_MACROS_ID(V5M38(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M40(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 39, x) \ + ZWSD_MACROS_ID(V5M39(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M41(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 40, x) \ + ZWSD_MACROS_ID(V5M40(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M42(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 41, x) \ + ZWSD_MACROS_ID(V5M41(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M43(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 42, x) \ + ZWSD_MACROS_ID(V5M42(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M44(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 43, x) \ + ZWSD_MACROS_ID(V5M43(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M45(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 44, x) \ + ZWSD_MACROS_ID(V5M44(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M46(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 45, x) \ + ZWSD_MACROS_ID(V5M45(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M47(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 46, x) \ + ZWSD_MACROS_ID(V5M46(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M48(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 47, x) \ + ZWSD_MACROS_ID(V5M47(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M49(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 48, x) \ + ZWSD_MACROS_ID(V5M48(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M50(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 49, x) \ + ZWSD_MACROS_ID(V5M49(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M51(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 50, x) \ + ZWSD_MACROS_ID(V5M50(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M52(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 51, x) \ + ZWSD_MACROS_ID(V5M51(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M53(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 52, x) \ + ZWSD_MACROS_ID(V5M52(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M54(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 53, x) \ + ZWSD_MACROS_ID(V5M53(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M55(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 54, x) \ + ZWSD_MACROS_ID(V5M54(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M56(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 55, x) \ + ZWSD_MACROS_ID(V5M55(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M57(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 56, x) \ + ZWSD_MACROS_ID(V5M56(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M58(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 57, x) \ + ZWSD_MACROS_ID(V5M57(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M59(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 58, x) \ + ZWSD_MACROS_ID(V5M58(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M60(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 59, x) \ + ZWSD_MACROS_ID(V5M59(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M61(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 60, x) \ + ZWSD_MACROS_ID(V5M60(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M62(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 61, x) \ + ZWSD_MACROS_ID(V5M61(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M63(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 62, x) \ + ZWSD_MACROS_ID(V5M62(m, v1, v2, v3, v4, v5, __VA_ARGS__)) +#define V5M64(m, v1, v2, v3, v4, v5, x, ...) \ + m(v1, v2, v3, v4, v5, 63, x) \ + ZWSD_MACROS_ID(V5M63(m, v1, v2, v3, v4, v5, __VA_ARGS__)) + diff --git a/core/components/config_template/config_template.hpp b/core/components/config_template/config_template.hpp new file mode 100644 index 0000000..8981235 --- /dev/null +++ b/core/components/config_template/config_template.hpp @@ -0,0 +1,116 @@ +// +// Created by zhaohe on 19-5-30. +// + +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +// #include "zwtimecpp/core/core.hpp" +// #include "zwtimecpp/core/exception/base_exception.hpp" +// #include "zwtimecpp/core/exception/base_exception.hpp" +// #include "zwtimecpp/core/exception/null_expection.hpp" +// #include "zwtimecpp/core/logger/logger_factory.hpp" +// #include "zwtimecpp/core/utils/data.hpp" +#include "iflytopcpp/core/basic/marco/data.hpp" +#include "iflytopcpp/core/basic/nlohmann/json.hpp" +#include "iflytopcpp/core/components/file_util.hpp" +#include "iflytopcpp/core/spdlogfactory/logger.hpp" +#include "iflytopcpp/core/zexception/zexception.hpp" +// #include "zwtimecpp/core/utils/zmath.hpp" + +// ConfigurationService的实现 +/*----------------------------------------------------------------*/ +#define ConfigServiceENABLE_GET_AND_SET2(type, propertyName, defaultValue) \ + private: \ + type propertyName = defaultValue; \ + \ + public: \ + virtual const type &get_##propertyName() const { \ + lock_guard lock(lock_); \ + return propertyName; \ + } \ + virtual void set_##propertyName(const type &propertyName) { \ + lock_guard lock(lock_); \ + this->propertyName = propertyName; \ + flushConfigToFile(); \ + } + +#define configTemplateGET_CONFIG2(type, propertyName, defaultValue) \ + try { \ + j3.at(#propertyName).get_to(propertyName); \ + } catch (const std::exception &e) { \ + onParseConfigFail(#propertyName, e); \ + } + +#define configTemplateSAVE_CONFIG2(type, propertyName, defaultValue) j[#propertyName] = propertyName; + +#define configTemplateDEFILE_CONFIG_SERVICE2(name, configList, configfilePath, onParseFiale) \ + namespace iflytop { \ + using namespace std; \ + using namespace core; \ + using namespace nlohmann; \ + class name { \ + ENABLE_LOGGER(name) \ + string configFile; \ + \ + mutable recursive_mutex lock_; \ + bool forTest = false; \ + \ + public: \ + name() {} \ + \ + public: \ + void initialize(string configFile = configfilePath) { \ + logger->debug("initialize"); \ + \ + this->configFile = configFile; \ + json j3; \ + \ + string config; \ + if (!FileUtil().exist(configFile)) { \ + logger->error("can't find configfile ,create default config:{}", configFile); \ + auto defaultConfigFile = FileUtil().openTrunc(configFile); \ + defaultConfigFile->write("{}", 2); \ + } \ + config = FileUtil().readFileAsString(configFile); \ + if (config.empty()) { \ + flushConfigToFile(); \ + config = FileUtil().readFileAsString(configFile); \ + } \ + \ + try { \ + j3 = json::parse(config); \ + } catch (const std::exception &e) { \ + throw zexception("Parse config fail......" + string(e.what())); \ + } \ + configList(configTemplateGET_CONFIG2); \ + flushConfigToFile(); \ + } \ + configList(ConfigServiceENABLE_GET_AND_SET2); \ + \ + public: \ + private: \ + void flushConfigToFile() { \ + json j; \ + configList(configTemplateSAVE_CONFIG2); \ + bool flushSuccess = FileUtil().writeToFile(configFile, j.dump(2)); \ + if (!flushSuccess) { \ + logger->error("flush config to logfile fail"); \ + } \ + }; \ + static shared_ptr &instance() { \ + static shared_ptr value; \ + return value; \ + } \ + void onParseConfigFail(string file_name, const std::exception &e) { onParseFiale; }; \ + }; \ + } diff --git a/core/components/file_util.cpp b/core/components/file_util.cpp index 1b72513..48b1cf6 100644 --- a/core/components/file_util.cpp +++ b/core/components/file_util.cpp @@ -82,6 +82,13 @@ std::vector FileUtil::readFileAsBuffer(const string &filePath) { bool FileUtil::writeToFile(const string &fileName, const string &buf) { return writeToFile(fileName, buf.c_str(), buf.size()); } + +shared_ptr FileUtil::openTrunc(const string &fileName) { + makeDirIfNoExist(fileName); + shared_ptr file(new ofstream(fileName, std::ios::trunc | std::ios::binary)); + return file; +} + bool FileUtil::writeToFile(const string &fileName, const char *buf, size_t size) { std::ofstream outfile1(fileName, std::ios::trunc | std::ios::binary); if (outfile1.is_open()) { diff --git a/core/components/file_util.hpp b/core/components/file_util.hpp index 572219e..c695226 100644 --- a/core/components/file_util.hpp +++ b/core/components/file_util.hpp @@ -38,6 +38,9 @@ class FileUtil { // write file bool writeToFile(const string &fileName, const string &buf); bool writeToFile(const string &fileName, const char *buf, size_t size); + + shared_ptr openTrunc(const string &fileName); + // filename operat // bool getRepetitionFileName(string fileName, string suffix, string &outfilename, int maxNum = -1); // bool getRepetitionDirName(string fileName, string &outfilename, int maxNum = -1);