/*
 *  Copyright (c) 2014, Oculus VR, Inc.
 *  All rights reserved.
 *
 *  This source code is licensed under the BSD-style license found in the
 *  RakNet License.txt file in the licenses directory of this source tree. An additional grant 
 *  of patent rights can be found in the RakNet Patents.txt file in the same directory.
 *
 */

#ifndef __STATE_H
#define __STATE_H

class FSM;

// States are stored in the FSM class (Finite state machine)
// The FSM only has one active state at a time and stores the state history stack
// State data can be held in this class - however data which is used between states is best stored elsewhere.
class State
{
public:
	State();
	~State();
	// OnEnter is called when this state will not be the current state
	// loadResources true means this state is now in the history stack and was not there before
	virtual void OnEnter(const FSM *caller, bool loadResources);
	// OnLeave is called when this state is currently the current state and will no longer be the current state
	// unloadResources true means this state is no longer in the history stack and we will probably not be entering it again via the back button
	virtual void OnLeave(const FSM *caller, bool unloadResources);
	// Called once for every time this state is added to the FSM history stack
	virtual void FSMAddRef(const FSM *caller);
	// Called once for every time this state is removed from the FSM history stack.
	virtual void FSMRemoveRef(const FSM *caller);
	// The number of times this state is in the FSM history stack.
	unsigned FSMRefCount(void) const;
protected:
	unsigned fsmRefCount;
};

// Same as State, but self-deletes when fsmRefCount==0
class ManagedState : public State
{
public:
	virtual void FSMRemoveRef(const FSM *caller);
};

#endif
