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>
42 virtual bool NextStep() = 0;
43 virtual bool Abort() = 0;
44 virtual size_t GetStepCount() const = 0;
47 template<typename Impl>
52 typedef void (Impl::*Step)();
55 typedef std::list<Step> StepList;
58 StepList m_abortSteps;
59 typename StepList::iterator m_currentStep;
60 typename StepList::iterator m_nextStep;
67 void AddStep(Step step)
69 Assert(!m_running && "AddStep is not allowed after calling NextStep!");
70 Assert(m_steps.end() == std::find(m_steps.begin(), m_steps.end(), step) && "The same step started twice is not supported");
71 m_steps.push_back(step);
72 m_nextStep = m_steps.begin();
75 void AddAbortStep(Step step)
77 Assert(!m_running && "AddAbortStep is not allowed after calling NextStep!");
78 Assert(m_abortSteps.end() == std::find(m_abortSteps.begin(), m_abortSteps.end(), step) && "The same step started twice is not supported");
79 m_abortSteps.push_front(step);
82 void SwitchToStep(Step step)
84 /// @TODO There can be problem here if user sets the same method two times in task list.
85 typename StepList::iterator i = std::find(m_steps.begin(), m_steps.end(), step);
86 Assert(i != m_steps.end());
91 Step GetCurrentStep() const
93 if(m_currentStep == m_steps.end())
96 return *m_currentStep;
105 Assert(this == m_impl);
106 m_currentStep = m_steps.end();
107 m_nextStep = m_steps.end();
114 Assert(m_nextStep != m_steps.end() && "Step list is empty or all steps done");
118 Step call = *m_nextStep;
121 m_currentStep = m_nextStep;
126 return ++m_nextStep != m_steps.end();
135 if (m_abortSteps.empty())
138 FOREACH (it, m_abortSteps)
139 m_steps.push_back(*it);
141 m_nextStep = m_steps.begin();
143 m_abortSteps.clear();
148 size_t GetStepCount() const
150 return static_cast<size_t>(m_steps.size());