Loading...
Searching...
No Matches
tworker.hpp
Go to the documentation of this file.
1
2#pragma once
3
4#include "core/type/ntype.hpp"
7
8namespace by {
9
10#define myExErr_1(code) exErr(errCode::code, getReport())
11#define myExErr_2(me, code) exErr(me, errCode::code, getReport())
12#define myExErr_3(me, code, a1) exErr(me, errCode::code, getReport(), a1)
13#define myExErr_4(me, code, a1, a2) exErr(me, errCode::code, getReport(), a1, a2)
14#define myExErr_5(me, code, a1, a2, a3) exErr(me, errCode::code, getReport(), a1, a2, a3)
15#define myExErr(...) BY_OVERLOAD(myExErr, __VA_ARGS__)
16
17#define myExWarn_1(code) exErr(errCode::code, getReport())
18#define myExWarn_2(me, code) exErr(me, errCode::code, getReport())
19#define myExWarn_3(me, code, a1) exErr(me, errCode::code, getReport(), a1)
20#define myExWarn_4(me, code, a1, a2) exErr(me, errCode::code, getReport(), a1, a2)
21#define myExWarn_5(me, code, a1, a2, a3) exErr(me, errCode::code, getReport(), a1, a2, a3)
22#define myExWarn(...) BY_OVERLOAD(myExWarn, __VA_ARGS__)
23
24#define BY_WORKER_GUARD(msg) \
25 BY_I("▶ '%s' %s@%s: " msg, i, me.getType(), &me); \
26 line::incLv(); \
27 _stepN = 0; \
28 BY_END_BLOCK({ \
29 line::decLv(); \
30 BY_I("◀ '%s' %s@%s: " msg, i, me.getType(), &me); \
31 });
32
58 template <typename R, typename T> class tworker: public typeProvidable, public clonable {
59 BY(ADT(tworker))
60 template <typename R1, typename T1> friend struct workerAdapter;
61 typedef R RetType;
62
63 public:
64 enum logFlag {
65 LOG_ON_EX = 1, // logs the err instance when it just got reported.
66 DUMP_ON_EX = 1 << 1, // log and leave callstack from an err instance when it just got reported.
67 GUARD = 1 << 2, // logs when func in, out.
68 INTERNAL = 1 << 3, // logs all except above case.
69 LOG_ON_END = 1 << 4, // log all report info when the work ends.
70 DUMP_ON_END = 1 << 5, // log and leave callstack for all report info when the work ends.
71#if BY_IS_DBG
72 DEFAULT = DUMP_ON_EX | GUARD | INTERNAL | LOG_ON_END
73#else
74 DEFAULT = LOG_ON_EX
75#endif
76 };
77
78 public:
79 tworker();
80 tworker(const errReport& rpt);
81
82 public:
83 errReport& getReport();
84 const errReport& getReport() const BY_CONST_FUNC(getReport())
85 me& setReport(errReport& rpt);
86
87 me& setFlag(nint newFlag);
88 me& addFlag(nint flag);
89 me& delFlag(nint clear);
90 nbool isFlag(nint flag) const;
91 nint getFlag() const;
92
93 me& setTask(const T& root);
94 me& setTask(const T* it) BY_SIDE_FUNC(it, setTask(*it), *this);
95 T* getTask();
96 const T* getTask() const BY_CONST_FUNC(getTask())
97
98 virtual void rel();
99
100 R work();
101
102 const area& getArea() const BY_CONST_FUNC(_getArea())
103
104 nbool isOk() const;
105
106 protected:
112 virtual void _prepare();
113
114 void _report(baseErr* e);
115
121 virtual void _onEndWork();
122 virtual R _onWork() = 0;
123
124 area& _getArea();
125
126 void _onEndErrReport(const errReport& rpt) const;
127
128 private:
129 void _rel();
130
131 private:
132 tstr<errReport> _rpt;
133 area _area;
134 tstr<T> _task;
135 nint _logFlag;
136 };
137} // namespace by
Base class for error hierarchy.
Definition baseErr.hpp:48
Error report collector.
Definition errReport.hpp:24
Definition tnarr.hpp:9
Base worker template for processing tasks.
Definition tworker.hpp:58
virtual void _prepare()
Protected virtual method for preparation before starting the work.
virtual void _onEndWork()
Protected virtual method called after the work is completed.
Definition tworker.inl:8
to Top