Skip to content

Commit 7da8546

Browse files
committed
[chg] 优化aspect底层逻辑,提供aspect中参数传递功能,增加易用性
1 parent a0b737f commit 7da8546

26 files changed

Lines changed: 307 additions & 64 deletions

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ set(TUTORIAL_LIST
3232
T07-MultiPipeline
3333
T08-Template
3434
T09-Aspect
35+
T10-AspectParam
3536
TU01-ThreadPool
3637
TU02-Lru
3738
TU03-Trie)

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,9 @@ void tutorial_simple() {
150150
* 提供`aspect`(切面)功能,用于横向扩展`node``group`功能
151151
* 更新`tutorial`内容
152152

153-
[2021.10.03 - v1.7.1 - Chunel]
154-
* 优化`aspect`(切面)实现逻辑
153+
[2021.10.05 - v1.7.1 - Chunel]
154+
* 优化`aspect`(切面)实现逻辑,提供切面参数功能
155+
* 更新`tutorial`内容
155156

156157
------------
157158
#### 附录-2. 推荐阅读

src/GraphCtrl/GraphAspect/GAspectObject.h

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,16 @@
1111

1212
#include <string>
1313

14-
#include "../GraphObject.h"
1514
#include "GAspectDefine.h"
15+
#include "../GraphObject.h"
16+
#include "../GraphParam/GParamInclude.h"
1617

1718
class GAspectObject : public GraphObject {
1819
public:
20+
~GAspectObject() override {
21+
CGRAPH_DELETE_PTR(param_)
22+
}
23+
1924
/**
2025
* 获取name信息
2126
* @return
@@ -24,6 +29,23 @@ class GAspectObject : public GraphObject {
2429
return name_;
2530
}
2631

32+
/**
33+
* 获取切面参数内容
34+
* @return
35+
*/
36+
template <typename T = GAspectParam,
37+
std::enable_if_t<std::is_base_of_v<GAspectParam, T>, int> = 0>
38+
T* getParam();
39+
40+
/**
41+
* 设置切面参数内容
42+
* @param param
43+
*/
44+
template <typename T,
45+
std::enable_if_t<std::is_base_of_v<GAspectParam, T>, int> = 0>
46+
GAspectObject* setParam(T* param);
47+
48+
protected:
2749
/**
2850
* 设置名称
2951
* @param name
@@ -32,7 +54,6 @@ class GAspectObject : public GraphObject {
3254
this->name_ = name;
3355
}
3456

35-
protected:
3657
/**
3758
* GAspect 相关内容,不需要执行run方法
3859
* @return
@@ -42,8 +63,15 @@ class GAspectObject : public GraphObject {
4263
}
4364

4465
private:
45-
std::string name_; // 切面类名称,跟element名称保持相同
66+
std::string name_; // 切面类名称,跟element名称保持相同
67+
GAspectParamPtr param_ { nullptr }; // 参数信息
68+
69+
friend class GAspectManager;
70+
friend class GElement;
4671
};
4772

73+
using GAspectObjectPtr = GAspectObject *;
74+
75+
#include "GAspectObject.inl"
4876

4977
#endif //CGRAPH_GASPECTOBJECT_H
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/***************************
2+
@Author: Chunel
3+
4+
@File: GAspectObject.inl
5+
@Time: 2021/10/2 9:46 下午
6+
@Desc:
7+
***************************/
8+
9+
#ifndef CGRAPH_GASPECTOBJECT_INL
10+
#define CGRAPH_GASPECTOBJECT_INL
11+
12+
13+
template <typename T,
14+
std::enable_if_t<std::is_base_of_v<GAspectParam, T>, int>>
15+
GAspectObjectPtr GAspectObject::setParam(T* param) {
16+
/** 传入的param可以为空 */
17+
if (param) {
18+
CGRAPH_DELETE_PTR(param_)
19+
param_ = CGRAPH_SAFE_MALLOC_COBJECT(T);
20+
param_->clone(static_cast<T *>(param));
21+
}
22+
23+
return this;
24+
}
25+
26+
27+
template <typename T,
28+
std::enable_if_t<std::is_base_of_v<GAspectParam, T>, int>>
29+
T* GAspectObject::getParam() {
30+
CGRAPH_ASSERT_NOT_NULL_RETURN_NULL(param_)
31+
32+
T* param = nullptr;
33+
if ((typeid(*param_).name() == typeid(T).name())) {
34+
// 如果类型相同才可以获取成功,否则直接返回nullptr
35+
param = dynamic_cast<T *>(this->param_);
36+
}
37+
return param;
38+
}
39+
40+
#endif //CGRAPH_GASPECTOBJECT_INL

src/GraphCtrl/GraphElement/GElement.cpp

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ const std::string& GElement::getSession() const {
2424
/******** protected ********/
2525
GElement::GElement() {
2626
this->session_ = CGRAPH_GENERATE_SESSION();
27-
aspect_manager_ = CGRAPH_SAFE_MALLOC_COBJECT(GAspectManager);
2827
}
2928

3029

@@ -43,9 +42,12 @@ GElement::GElement(const GElement& element) {
4342
this->session_ = element.session_;
4443
this->loop_ = element.loop_;
4544
this->name_ = element.name_;
46-
this->aspect_manager_ = CGRAPH_SAFE_MALLOC_COBJECT(GAspectManager);
47-
this->aspect_manager_->aspect_arr_ = element.aspect_manager_->aspect_arr_;
48-
this->aspect_manager_->setName(element.aspect_manager_->getName());
45+
46+
if (element.aspect_manager_) {
47+
this->aspect_manager_ = CGRAPH_SAFE_MALLOC_COBJECT(GAspectManager);
48+
this->aspect_manager_->aspect_arr_ = element.aspect_manager_->aspect_arr_;
49+
this->aspect_manager_->setName(element.aspect_manager_->getName());
50+
}
4951
}
5052

5153

@@ -63,9 +65,12 @@ GElement& GElement::operator=(const GElement& element) {
6365
this->session_ = element.session_;
6466
this->loop_ = element.loop_;
6567
this->name_ = element.name_;
66-
this->aspect_manager_ = CGRAPH_SAFE_MALLOC_COBJECT(GAspectManager);
67-
this->aspect_manager_->aspect_arr_ = element.aspect_manager_->aspect_arr_;
68-
this->aspect_manager_->setName(element.aspect_manager_->getName());
68+
69+
if (element.aspect_manager_) {
70+
this->aspect_manager_ = CGRAPH_SAFE_MALLOC_COBJECT(GAspectManager);
71+
this->aspect_manager_->aspect_arr_ = element.aspect_manager_->aspect_arr_;
72+
this->aspect_manager_->setName(element.aspect_manager_->getName());
73+
}
6974

7075
return *this;
7176
}
@@ -150,12 +155,13 @@ CSTATUS GElement::setElementInfo(const GElementPtrSet& dependElements,
150155
GParamManagerPtr paramManager) {
151156
CGRAPH_FUNCTION_BEGIN
152157
CGRAPH_ASSERT_INIT(false)
153-
CGRAPH_ASSERT_NOT_NULL(aspect_manager_)
154158

155159
this->setName(name);
156160
this->setLoop(loop);
157161
param_manager_ = paramManager;
158-
aspect_manager_->setName(name);
162+
if (aspect_manager_) {
163+
aspect_manager_->setName(name);
164+
}
159165
status = this->addDependElements(dependElements);
160166
CGRAPH_FUNCTION_END
161167
}

src/GraphCtrl/GraphElement/GElement.h

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,23 +52,16 @@ class GElement : public GraphObject {
5252

5353
/**
5454
* 实现添加切面的逻辑
55-
* @tparam T
56-
* @tparam Args
55+
* @tparam TAspect
56+
* @tparam TParam
57+
* @param param
5758
* @return
5859
*/
59-
template<typename T, std::enable_if_t<std::is_base_of_v<GAspect, T>, int> = 0>
60-
GElement* addAspect();
60+
template<typename TAspect, typename TParam = GAspectDefaultParam,
61+
std::enable_if_t<std::is_base_of_v<GAspect, TAspect>, int> = 0,
62+
std::enable_if_t<std::is_base_of_v<GAspectParam, TParam>, int> = 0>
63+
GElement* addAspect(TParam* param = nullptr);
6164

62-
/**
63-
* 依次添加两个aspect信息
64-
* @tparam T1
65-
* @tparam T2
66-
* @return
67-
*/
68-
template<typename T1, typename T2,
69-
std::enable_if_t<std::is_base_of_v<GAspect, T1>, int> = 0,
70-
std::enable_if_t<std::is_base_of_v<GAspect, T2>, int> = 0>
71-
GElement* addAspect();
7265

7366
protected:
7467
explicit GElement();

src/GraphCtrl/GraphElement/GElement.inl

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,24 +28,20 @@ T* GElement::getGParam(const std::string& key) {
2828
}
2929

3030

31-
template <typename T, std::enable_if_t<std::is_base_of_v<GAspect, T>, int>>
32-
GElementPtr GElement::addAspect() {
33-
CGRAPH_FUNCTION_BEGIN
34-
CGRAPH_ASSERT_NOT_NULL_RETURN_NULL(aspect_manager_)
35-
36-
GAspectPtr aspect = CGRAPH_SAFE_MALLOC_COBJECT(T);
31+
template<typename TAspect, typename TParam,
32+
std::enable_if_t<std::is_base_of_v<GAspect, TAspect>, int>,
33+
std::enable_if_t<std::is_base_of_v<GAspectParam, TParam>, int>>
34+
GElementPtr GElement::addAspect(TParam* param) {
35+
if (!aspect_manager_) {
36+
/** 采用懒加载的方式执行,这里不会有并发问题,故不需要采用单例模式了 */
37+
aspect_manager_ = CGRAPH_SAFE_MALLOC_COBJECT(GAspectManager);
38+
}
39+
40+
GAspectPtr aspect = CGRAPH_SAFE_MALLOC_COBJECT(TAspect);
3741
aspect->setName(this->getName());
42+
aspect->setParam<TParam>(param);
3843
aspect_manager_->addAspect(aspect);
3944
return this;
4045
}
4146

42-
43-
template<typename T1, typename T2,
44-
std::enable_if_t<std::is_base_of_v<GAspect, T1>, int>,
45-
std::enable_if_t<std::is_base_of_v<GAspect, T2>, int>>
46-
GElement* GElement::addAspect() {
47-
return this->template addAspect<T1>()->template addAspect<T2>();
48-
}
49-
50-
5147
#endif // CGRAPH_GELEMENT_INL
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/***************************
2+
@Author: Chunel
3+
4+
@File: GAspectDefaultParam.h
5+
@Time: 2021/10/5 12:37 上午
6+
@Desc:
7+
***************************/
8+
9+
#ifndef CGRAPH_GASPECTDEFAULTPARAM_H
10+
#define CGRAPH_GASPECTDEFAULTPARAM_H
11+
12+
#include "GAspectParam.h"
13+
14+
class GAspectDefaultParam final : public GAspectParam {
15+
16+
protected:
17+
void clone(GAspectParamPtr param) final {
18+
/**
19+
* 针对原生类型的实现
20+
* 目的是防止无法生成默认类型的 GAspectParam 参数
21+
* 无任何实意,不支持继承
22+
*/
23+
}
24+
};
25+
26+
#endif //CGRAPH_GASPECTDEFAULTPARAM_H
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/***************************
2+
@Author: Chunel
3+
4+
@File: GAspectParam.h
5+
@Time: 2021/10/4 1:47 下午
6+
@Desc:
7+
***************************/
8+
9+
#ifndef CGRAPH_GASPECTPARAM_H
10+
#define CGRAPH_GASPECTPARAM_H
11+
12+
#include "GParamObject.h"
13+
14+
class GAspectParam : public GParamObject {
15+
public:
16+
/**
17+
* 所有的 GAspectParam 类型,内部需要实现一个 clone 方法
18+
* 将外部函数传到 aspect 中
19+
* @param param
20+
*/
21+
virtual void clone(GAspectParam* param) = 0;
22+
};
23+
24+
using GAspectParamPtr = GAspectParam *;
25+
26+
#endif //CGRAPH_GASPECTPARAM_H

src/GraphCtrl/GraphParam/GParamInclude.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
#define CGRAPH_GPARAMINCLUDE_H
1111

1212
#include "GParam.h"
13+
#include "GAspectParam.h"
14+
#include "GAspectDefaultParam.h"
1315
#include "GParamManager.h"
1416

1517
#endif //CGRAPH_GPARAMINCLUDE_H

0 commit comments

Comments
 (0)