CAtlListを使えば簡単にキューを作ることができる。
ここではテンプレートクラスとして作成したため、キュー化する変数の型は自由に設定できる。
#include "DnpQue.h"
void Test()
{
int n;
bool ret;
CDnpQue<int> cQue;
cQue.AddData(1); //データ追加
cQue.AddData(2);
cQue.AddData(3);
cQue.AddData(4);
cQue.AddData(5);
do
{
ret = cQue.GetData(n);
if(ret)
{
ATLTRACE("%d ",n);
}
}
while(ret);
}
#pragma once
#include "atlcoll.h"
/*!
* \brief
* キューテンプレートクラス *
* 先に入れたデータが先に出力される。
*
* 以下のコードでは「1 2 3 4 5」が出力する。
* \code
int n;
bool ret;
CDnpQue<int> cQue;
cQue.AddData(1); //データ追加
cQue.AddData(2);
cQue.AddData(3);
cQue.AddData(4);
cQue.AddData(5);
do
{
ret = cQue.GetData(n);
if(ret)
{
ATLTRACE("%d ",n);
}
}
while(ret);
* \endcode
*/
template<class VALUE>
class CDnpQue
{
public:
CDnpQue()
{
}
virtual ~CDnpQue()
{
}
CAtlList<VALUE> _listData; //!< 保持しているキューデータ
/*!
* \brief
* キューにデータ追加
*
* \param data
* 追加するデータ *
*/
void AddData(VALUE data)
{
_listData.AddTail(data);
};
/*!
* \brief
* キューの先頭にデータ追加
*
* \param data
* 追加するデータ *
* \remarks
* 通常のキュー動作を無視して先頭にデータを挿入する。
* 挿入したデータは次回の CDnpQue<VALUE>::GetData(VALUE&) により取得される。
*/
void AddPrimeData(VALUE data)
{
_listData.AddHead(data);
};
/*!
* \brief
* キューからデータ取得
*
* \param[out] data
* 取得したデータ *
* \retval true 成功
* \retval false 失敗
*
*/
bool GetData(VALUE& data)
{
if(_listData.GetCount() > 0)
data = _listData.RemoveHead();
else
{
// data = NULL;
return false;
}
return true;
};
/*!
* \brief
* キューからデータ取得
*
* \return
* 取得したデータ *
* \attention
* データがなかった場合に何が返るか不定になるので、この関数は使わずに
* CDnpQue<VALUE>::GetData(VALUE&) を利用するべき。
*/
VALUE GetData(void)
{
VALUE ret;
GetData(ret);
return ret;
};
/*!
* \brief
* キューデータを見る(GetDataのように削除はしない)
*
* \param[out] data
* 取得したデータ *
* \retval true 成功
* \retval false 失敗
*/
bool ReferData(VALUE& data)
{
if(_listData.GetCount() > 0)
data = _listData.GetHead();
else
{
// data = NULL;
return false;
}
return true;
}
/*!
* \brief
* キューデータを見る(GetDataのように削除はしない)
*
* \return
* 取得したデータ *
* \attention
* データがなかった場合に何が返るか不定になるので、この関数は使わずに
* CDnpQue<VALUE>::ReferData(VALUE&) を利用するべき。
*/
VALUE ReferData(void)
{
VALUE ret;
ReferData(ret);
return ret;
}
/*!
* \brief
* 現在保持しているデータ数を返す
*
* \return
* データ数
*/
int GetSize(void)
{
return (int)_listData.GetCount();
};
/*!
* \brief
* 現在保持している全データを削除
*
*/
void RemoveAll(void)
{
_listData.RemoveAll();
};
};