Loading...
Searching...
No Matches
tworker.inl
1#pragma once
2
5
6namespace by {
7
8 template <typename R, typename T> struct workerAdapter {
9 static R adaptWork(tworker<R, T>& w);
10 };
11
12 template <typename T> struct workerAdapter<void, T> {
13 static void adaptWork(tworker<void, T>& w);
14 };
15
16#define TEMPLATE template <typename R, typename T>
17#define ME tworker<R, T>
18
19 TEMPLATE ME::tworker(): tworker(thread::get().getEx()) {}
20
21 TEMPLATE ME::tworker(const errReport& rpt): _rpt(rpt), _logFlag(0) {}
22
23 TEMPLATE errReport& ME::getReport() { return *_rpt; }
24
25 TEMPLATE
26 ME& ME::setReport(errReport& rpt) {
27 _rpt.bind(rpt);
28 return *this;
29 }
30
31 TEMPLATE
32 ME& ME::setFlag(nint newFlag) {
33 _logFlag = newFlag;
34 return *this;
35 }
36
37 TEMPLATE
38 ME& ME::addFlag(nint newFlag) {
39 _logFlag |= newFlag;
40 return *this;
41 }
42
43 TEMPLATE
44 ME& ME::delFlag(nint clear) {
45 _logFlag &= ~clear;
46 return *this;
47 }
48
49 TEMPLATE nbool ME::isFlag(nint flag) const { return (_logFlag & flag) == flag; }
50
51 TEMPLATE nint ME::getFlag() const { return _logFlag; }
52
53 TEMPLATE
54 ME& ME::setTask(const T& task) {
55 _task.bind(task);
56 return *this;
57 }
58
59 TEMPLATE T* ME::getTask() { return _task.get(); }
60
61 TEMPLATE void ME::rel() { _rel(); }
62
63 TEMPLATE
64 void ME::_rel() {
65 _rpt.bind(dummyErrReport::singleton);
66 _task.rel();
67 _logFlag = 0;
68 }
69
70 TEMPLATE
71 void ME::_prepare() { _area.rel(); }
72
73 TEMPLATE
74 void ME::_report(baseErr* e) {
75 _rpt->add(e);
76 if(isFlag(LOG_ON_EX)) {
77 enablesZone zone(true);
78 e->log();
79 } else if(isFlag(DUMP_ON_EX)) {
80 enablesZone zone(true);
81 e->dump();
82 }
83 }
84
85 TEMPLATE area& ME::_getArea() { return _area; }
86
87 TEMPLATE nbool ME::isOk() const { return !_rpt->inErr(); }
88
89 TEMPLATE
90 void ME::_onEndWork() {
91 _area.rel();
92 _onEndErrReport(*_rpt);
93 }
94
95 TEMPLATE
96 R ME::work() { return workerAdapter<R, T>::adaptWork(*this); }
97
98 TEMPLATE
99 void ME::_onEndErrReport(const errReport& rpt) const {
100 WHEN(!isFlag(DUMP_ON_END | LOG_ON_END) || !rpt) .ret(); // ## print errors.
101
102 BY_I("errors:");
103 if(isFlag(DUMP_ON_END)) {
104 rpt.dump();
105 return;
106 }
107 if(isFlag(LOG_ON_END)) rpt.log();
108 }
109
110#undef ME
111#define ME workerAdapter<R, T>
112
113 TEMPLATE
114 R ME::adaptWork(tworker<R, T>& w) {
115 if(w.isFlag(tworker<R, T>::GUARD)) {
116 line::incLv();
117 BY_I("▶ %s.work()", w);
118 }
119
120 w._prepare();
121
122 R ret;
123 enablesZone internal;
124 if(!w.isFlag(tworker<R, T>::INTERNAL)) internal.setEnable(false);
125 ret = w._onWork();
126 internal.setPrev().rel();
127
128 if(w.isFlag(tworker<R, T>::GUARD)) BY_I("%s._onEndWork()", w);
129
130 w._onEndWork();
131
132 if(w.isFlag(tworker<R, T>::GUARD)) {
133 line::decLv();
134 BY_I("◀ %s ends!", w);
135 }
136 return ret;
137 }
138
139#undef ME
140#undef TEMPLATE
141#define TEMPLATE template <typename T>
142#define ME workerAdapter<void, T>
143
144 TEMPLATE
145 void ME::adaptWork(tworker<void, T>& w) {
146 if(w.isFlag(tworker<void, T>::GUARD)) {
147 BY_I("▶ %s.work()", w);
148 line::incLv();
149 }
150
151 w._prepare();
152
153 enablesZone prev;
154 {
155 enablesZone internal;
156 if(!w.isFlag(tworker<void, T>::INTERNAL)) logger::get().setEnable(false);
157 w._onWork();
158 }
159
160 if(w.isFlag(tworker<void, T>::GUARD)) BY_I("%s._onEndWork()", w);
161
162 prev.setPrev();
163 w._onEndWork();
164
165 if(w.isFlag(tworker<void, T>::GUARD)) {
166 line::decLv();
167 BY_I("◀ %s ends!", w);
168 }
169 }
170
171#undef ME
172#undef TEMPLATE
173} // namespace by
Thread execution context for byeol runtime.
Definition thread.hpp:46
Definition tnarr.hpp:9
Base worker template for processing tasks.
Definition tworker.hpp:58
Definition tworker.inl:8
to Top