| | |
| | | #include "PipeLine.h"
|
| | | #include "logger.h"
|
| | |
|
| | | PipeMaterial::PipeMaterial() :
|
| | | type(PMT__FIRST), buffer(nullptr), buffSize(0),
|
| | |
| | | return elem;
|
| | | }
|
| | |
|
| | | class PipeDebugger
|
| | | {
|
| | | private:
|
| | | PipeLine* pipeLine;
|
| | |
|
| | | public:
|
| | | PipeLineElem* retElem;
|
| | | PipeMaterial* pm;
|
| | |
|
| | | PipeDebugger(PipeLine* _pipeLine) : |
| | | pipeLine(_pipeLine), retElem(nullptr), pm(nullptr)
|
| | | {
|
| | | LOG(DEBUG) << "pipe line begin";
|
| | | }
|
| | | |
| | | ~PipeDebugger()
|
| | | {
|
| | | bool retOK = (*(pipeLine->elems).rbegin() == retElem);
|
| | | if (retOK)
|
| | | LOG(DEBUG) << "pipe line end, ret OK";
|
| | | else
|
| | | LOG(WARN) << "pipe line end, ret ERROR";
|
| | | }
|
| | | };
|
| | |
|
| | | PipeLineElem* PipeLine::pipe(PipeMaterial* pm /*= nullptr*/)
|
| | | {
|
| | | PipeDebugger debugger(this);
|
| | | |
| | | PipeLineElem* elem_begin = *elems.begin();
|
| | | PipeLineElem* elem_last = *elems.rbegin();
|
| | |
|
| | |
| | | uint8_t pmPlacement[sizeof(PipeMaterial)];
|
| | | if (pm == nullptr)
|
| | | pm = new (pmPlacement) PipeMaterial;
|
| | | |
| | | debugger.pm = pm;
|
| | |
|
| | | if (elems.size() == 1)
|
| | | {
|
| | | elem_begin->gain(*pm);
|
| | | pm->exec_deleter();
|
| | | return elem_begin;
|
| | | return debugger.retElem = elem_begin;
|
| | | }
|
| | | else if (elems.size() == 2)
|
| | | {
|
| | |
| | | pm->exec_deleter();
|
| | | }
|
| | | else
|
| | | return elem_begin;
|
| | | return elem_last;
|
| | | return debugger.retElem = elem_begin;
|
| | | return debugger.retElem = elem_last;
|
| | | }
|
| | | else
|
| | | {
|
| | | if (!elem_begin->gain(*pm))
|
| | | return elem_begin;
|
| | | return debugger.retElem = elem_begin;
|
| | |
|
| | | bool lastRet = true;
|
| | | elem_vec_t::iterator iter = elems.begin();
|
| | |
| | | lastRet = elem_begin->gain(*pm);
|
| | | }
|
| | | else
|
| | | return elem_begin;//#todo this may memory leakage in pm
|
| | | return debugger.retElem = elem_begin;
|
| | |
|
| | | ++iter;
|
| | | elem_begin = *iter;
|
| | |
| | | elem_last->pay(*pm);
|
| | | pm->exec_deleter();
|
| | | }
|
| | | return elem_last;
|
| | | return debugger.retElem = elem_last;
|
| | | }
|
| | |
|
| | | return nullptr;
|