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>
40 virtual bool NextStep() = 0;
41 virtual bool Abort() = 0;
42 virtual size_t GetStepCount() const = 0;
45 template<typename Impl>
50 typedef void (Impl::*Step)();
53 typedef std::list<Step> StepList;
56 StepList m_abortSteps;
57 typename StepList::iterator m_currentStep;
58 typename StepList::iterator m_nextStep;
65 void AddStep(Step step)
67 Assert(!m_running && "AddStep is not allowed after calling NextStep!");
68 Assert(m_steps.end() == std::find(m_steps.begin(),
71 "The same step started twice is not supported");
72 m_steps.push_back(step);
73 m_nextStep = m_steps.begin();
76 void AddAbortStep(Step step)
79 !m_running && "AddAbortStep is not allowed after calling NextStep!");
80 Assert(m_abortSteps.end() ==
81 std::find(m_abortSteps.begin(),
84 "The same step started twice is not supported");
85 m_abortSteps.push_front(step);
88 void SwitchToStep(Step step)
90 /// @TODO There can be problem here if user sets the same method two
91 // times in task list.
92 typename StepList::iterator i = std::find(m_steps.begin(),
94 Assert(i != m_steps.end());
99 Step GetCurrentStep() const
101 if (m_currentStep == m_steps.end()) {
105 return *m_currentStep;
109 TaskDecl(Impl *impl) :
114 Assert(this == m_impl);
115 m_currentStep = m_steps.end();
116 m_nextStep = m_steps.end();
124 m_nextStep != m_steps.end() &&
125 "Step list is empty or all steps done");
129 Step call = *m_nextStep;
132 m_currentStep = m_nextStep;
137 return ++m_nextStep != m_steps.end();
147 if (m_abortSteps.empty()) {
151 FOREACH(it, m_abortSteps)
152 m_steps.push_back(*it);
154 m_nextStep = m_steps.begin();
156 m_abortSteps.clear();
161 size_t GetStepCount() const
163 return static_cast<size_t>(m_steps.size());