
///////////////////////////////////////////////////////////////////////////////
//
// File   : Asura_Streaming_JobQueue.h
// Author : Andy Tate
// Date   : 4-May-2006
//
// Copyright (C) 2006 Rebellion, All Rights Reserved.
//
///////////////////////////////////////////////////////////////////////////////

// RJT NOTE: Required for GCC builds as the file list generation doesn't account for VC project exclusion from build
#ifdef ASURA_USE_STREAMING

#ifdef ASURA_USE_PRAGMA_ONCE
	#pragma once
#endif   // ifdef ASURA_USE_PRAGMA_ONCE

#ifndef __ASURA_STREAMING_JOBQUEUE_H__
#define __ASURA_STREAMING_JOBQUEUE_H__

////////////////////////////////////////////////////////////////////////////////
// Include files...
////////////////////////////////////////////////////////////////////////////////

#include "Core/Asura_LinkList.h"
#include "Core/Asura_Maths.h"


////////////////////////////////////////////////////////////////////////////////
// Forward class declarations...
////////////////////////////////////////////////////////////////////////////////

class Asura_Streaming_Job;


////////////////////////////////////////////////////////////////////////////////
// Class declaration...
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Class        : Asura_Streaming_JobQueue
// Author       : Andy Tate
// Date         : 4-May-2006
//
// Description  : Queue to handle jobs when streaming, first job added is the
//				  first one handled.
////////////////////////////////////////////////////////////////////////////////

class Asura_Streaming_JobQueue
{
private:
	// Internal typedefs...
	typedef Asura_LinkList<Asura_Streaming_Job*> List;
	typedef Asura_ListElt<Asura_Streaming_Job*> ListElement;


public:
	// Public functions...
	Asura_Streaming_JobQueue  (void)	{}
	~Asura_Streaming_JobQueue ();

	// Manipulation functions...
	bool	AddJobToStart	(Asura_Streaming_Job* pxJob);
	bool	AddJobToEnd		(Asura_Streaming_Job* pxJob);
	bool	RemoveJob		(Asura_Streaming_Job* pxJob);

	bool	Update			(float& fTimeAllowed);
	void	UpdateAll		(void);

	// Accessor functions...
	u_int	Size			(void) const	{ return(m_xQueue.Size()); }


protected:
	// Protected variables...


	// Protected functions...


private:
	// Private variables...
	List	m_xQueue;		// Queue containing all outstanding jobs.


	// Private functions...
	Asura_Streaming_JobQueue  (const Asura_Streaming_JobQueue& xOther);

	Asura_Streaming_JobQueue&	operator=	(const Asura_Streaming_JobQueue& xOther);

	// Job update functions...
	static	bool	UpdateJob	(float& fTimeAllowed, Asura_Streaming_Job* pxCurrentJob, Asura_Streaming_Job*& pxLastJob);
};   // End of class 'Asura_Streaming_JobQueue'.


#endif   // ifndef __ASURA_STREAMING_JOBQUEUE_H__

#endif	// ASURA_USE_STREAMING

/// End of file. ///
