1//
2// This file is part of the aMule Project.
3//
4// Copyright (c) 2005-2011 aMule Team ( admin@amule.org / http://www.amule.org )
5// Copyright (c) 2004-2011 Marcelo Roberto Jimenez ( phoenix@amule.org )
6//
7// Any parts of this program derived from the xMule, lMule or eMule project,
8// or contributed by third-party developers are copyrighted by their
9// respective authors.
10//
11// This program is free software; you can redistribute it and/or modify
12// it under the terms of the GNU General Public License as published by
13// the Free Software Foundation; either version 2 of the License, or
14// (at your option) any later version.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
24//
25
26//
27// Generic state machine implementation
28//
29
30#ifndef STATE_MACHINE_H
31#define STATE_MACHINE_H
32
33#include <queue>
34
35#include <wx/thread.h>		/* For wxMutex, wxMutexLocker	*/
36#include <wx/string.h>		/* For wxString			*/
37
38typedef unsigned int t_sm_state;
39
40typedef unsigned int t_sm_event;
41
42class CStateMachine
43{
44public:
45	CStateMachine(
46		const wxString &name,
47		const unsigned int maxStates,
48		const t_sm_state initialState );
49	virtual ~CStateMachine() = 0;
50	void Clock();
51	void Schedule(t_sm_event event);
52	t_sm_state GetState() const			{ return m_state; }
53	unsigned int GetClocksInCurrentState() const	{ return m_clocksInCurrentState; }
54	virtual t_sm_state next_state(t_sm_event event) = 0;
55	virtual void process_state(t_sm_state state, bool entry) = 0;
56
57private:
58	void flush_queue();
59
60	t_sm_state		m_state;
61	wxMutex			m_stateMutex;
62	std::queue <t_sm_event>	m_queue;
63	wxMutex			m_queueMutex;
64	const wxString		m_name;
65	const unsigned int	m_maxStates;
66	const unsigned int	m_initialState;
67	unsigned int		m_clockCounter;
68	unsigned int		m_clocksInCurrentState;
69};
70
71#endif // STATE_MACHINE_H
72// File_checked_for_headers
73