/***************************************************************************
  Queue Class
  -----------------------------------------
	begin      : 2013/09/16
	copyright  : (C) 2005 Solbox Inc.
	author     : Development 1 Team
					- 2013/09/16
	email      : dev1@solbox.com
	version    : 3.2.0

	CopyRight(C) 2005 Solbox Inc. All Rights reserved.
	Redistribution and use in source and binary forms, with or with out
	modification, are not permitted in outside of Solbox Inc.
***************************************************************************/



#ifndef __DATA_QUEUE_H__
#define __DATA_QUEUE_H__

#include <pthread.h>
#include <queue>

#define DEFAULT_MAX_QUEUE_SIZE 0
template <class DataClass>
/// @brief CQueue class
class CQueue
{
	public :
		CQueue();
		~CQueue();
		/// @brief clear queue
		void Init(void);

		/// @brief  push data
		/// @param userData [in] DataClass
		/// @return 성공은 return true, 그 외에는 return false
		bool Push(DataClass& userData);

		/// @brief  pop data ( just remove from queue )
		/// @return 성공은 return true, 그 외에는 return false
		bool Pop();

		/// @brief  GetDataClass, (it doesn't remove data from queue)
		/// @return 성공은 return true, 그 외에는 return false
		DataClass Front();

		/// @brief get max queue size, default is 0 (0 means infinity)
		/// @return 성공은 0,+ 그 외에는 - 
		int  GetCurrentMaxSize(void);

		/// @brief  set max queue size, it have nothing to do with memory allocation in this class.
		//          please use it for infinity queue size to limit the speed what job processing.
		/// @param userData [in] set 0 to infinity or positive integer( default: 0)
		/// @return 성공은 return true, 그 외에는 return false
		bool SetCurrentMaxSize(int& nMaxSize);

		/// @brief  현재 Queue의 Depth(size)를 리턴한다.
		/// @return stl queue의 size 값
		int  GetDepth(void);

	private :
		/// @brief 각 데이터별로 Queue에 들어있는 1건의 실제 데이터.
		std::queue <DataClass> m_qData;
		/// @brief 큐의 최대크기를 설정하는 변수
		int m_nMaxSize;
		/// @brief 큐의 현재 크기를 갖는 변수
		int m_nDepth;
		/// @brief Data에 대한 뮤텍스 변수
		pthread_mutex_t m_mxData;
		/// @brief MaxSize에 대한 뮤텍스 변수
		pthread_mutex_t m_mxMaxSize;
}; // ~class CQueue
#endif //__DATA_QUEUE_H__
