2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
19 * @author Radoslaw Wicik (r.wicik@samsung.com)
21 * @brief Header file for abstaract task definition
26 #include <dpl/noncopyable.h>
27 #include <dpl/foreach.h>
28 #include <dpl/assert.h>
41 virtual bool NextStep() = 0;
42 virtual bool Abort() = 0;
43 virtual size_t GetStepCount() const = 0;
46 template<typename Impl>
51 typedef void (Impl::*Step)();
54 typedef std::list<Step> StepList;
57 StepList m_abortSteps;
58 typename StepList::iterator m_currentStep;
59 typename StepList::iterator m_nextStep;
66 void AddStep(Step step)
68 Assert(!m_running && "AddStep is not allowed after calling NextStep!");
69 Assert(m_steps.end() == std::find(m_steps.begin(),
72 "The same step started twice is not supported");
73 m_steps.push_back(step);
74 m_nextStep = m_steps.begin();
77 void AddAbortStep(Step step)
80 !m_running && "AddAbortStep is not allowed after calling NextStep!");
81 Assert(m_abortSteps.end() ==
82 std::find(m_abortSteps.begin(),
85 "The same step started twice is not supported");
86 m_abortSteps.push_front(step);
89 void SwitchToStep(Step step)
91 /// @TODO There can be problem here if user sets the same method two
92 // times in task list.
93 typename StepList::iterator i = std::find(m_steps.begin(),
95 Assert(i != m_steps.end());
100 Step GetCurrentStep() const
102 if (m_currentStep == m_steps.end()) {
106 return *m_currentStep;
110 TaskDecl(Impl *impl) :
115 Assert(this == m_impl);
116 m_currentStep = m_steps.end();
117 m_nextStep = m_steps.end();
125 m_nextStep != m_steps.end() &&
126 "Step list is empty or all steps done");
130 Step call = *m_nextStep;
133 m_currentStep = m_nextStep;
138 return ++m_nextStep != m_steps.end();
148 if (m_abortSteps.empty()) {
152 FOREACH(it, m_abortSteps)
153 m_steps.push_back(*it);
155 m_nextStep = m_steps.begin();
157 m_abortSteps.clear();
162 size_t GetStepCount() const
164 return static_cast<size_t>(m_steps.size());