티스토리 뷰
게임 서버 프로그래밍 책을보다가 기초라이브러리 제작목록에 유용한 코드들이 있어서
따라해봤다. 앞으로 책을읽다 흥미가 가는 코드들은 따라해본다음 포스팅할 예정이다...
오늘은 원형큐(CircularQueue)이다. 이 포스팅을 보시는분이라면 원형큐가 어떻게 동작하는지는 알고
있으실꺼라 생각하고 따로 설명은 하지 않겠다.
이 원형큐의 특징은 나머지연산자(%)를 통해서 마지막까지 갔을때 처음으로 돌아온다는 것이다.
사용한 필요준비물은 <windows.h>이다.
CircularQueue는 다음과 같다.
CircularQueue.h
#include <windows.h>
#define MAX_QUEUE_LENGTH 10
template<class T>
class CCircularQueue
{
public:
CCircularQueue(VOID)
{
ZeroMemory(mQueue, sizeof(mQueue));
mQueueHead = mQueueTail = 0;
}
~CCircularQueue(VOID){}
private:
T mQueue[MAX_QUEUE_LENGTH];
DWORD mQueueHead;
DWORD mQueueTail;
public:
BOOL Begin(VOID)
{
ZeroMemory(mQueue,sizeof(mQueue));
mQueueHead = mQueueTail = 0;
return TRUE;
}
BOOL End(VOID)
{
return TRUE;
}
BOOL Push(T data)
{
DWORD TempTail = (mQueueTail + 1) % MAX_QUEUE_LENGTH;
if(TempTail == mQueueHead)
return FALSE;
CopyMemory(&mQueue[TempTail] , &data, sizeof(T));
mQueueTail = TempTail;
return TRUE;
}
BOOL Pop(T& data)
{
if(mQueueHead == mQueueTail)
return FALSE;
DWORD TempHead = (mQueueHead + 1) % MAX_QUEUE_LENGTH;
CopyMemory(&data, &mQueue[TempHead], sizeof(T));
mQueueHead = TempHead;
return TRUE;
}
BOOL IsEmpty(VOID)
{
if( mQueueHead== mQueueTail ) return TRUE;
return false;
}
};
사용예이다.
main.cpp
#include <stdio.h>
#include "CCircularQueue.h"
typedef struct _QUEUE_DATA
{
INT iData1;
BYTE aData2[100];
}QUEUE_DATA;
void PrintQueueData(QUEUE_DATA& data)
{
printf(" iData : %d \n",data.iData1);
printf(" aData2 : %s \n", data.aData2);
}
int main(VOID)
{
CCircularQueue<QUEUE_DATA> queue;
queue.Begin();
BYTE Q1_Data[]="Q1_Data";
BYTE Q2_Data[]="Q2_Data";
QUEUE_DATA pushData;
pushData.iData1 = 10;
ZeroMemory(pushData.aData2, sizeof(pushData.aData2));
CopyMemory(pushData.aData2, Q1_Data, sizeof(Q1_Data));
QUEUE_DATA pushData2;
pushData2.iData1 = 20;
ZeroMemory(pushData2.aData2, sizeof(pushData2.aData2));
CopyMemory(pushData2.aData2, Q2_Data, sizeof(Q2_Data));
printf("----- PUSH ----- \n");
PrintQueueData(pushData);
queue.Push(pushData);
PrintQueueData(pushData2);
queue.Push(pushData2);
QUEUE_DATA popData;
QUEUE_DATA popData2;
queue.Pop(popData);
queue.Pop(popData2);
printf("----- POP ----- \n");
PrintQueueData(popData);
PrintQueueData(popData2);
return 0;
}
결과 화면이다.
누군가에게는 작은도움이 되었기를 바라면서 오늘의 포스팅 끝~
'C & C++' 카테고리의 다른 글
[C++] 임계영역(CriticalSection)을 이용해서 동기화(ThreadSync) 객체 만들기 (0) | 2016.02.01 |
---|---|
[C++] pthread를 이용해서 쓰레드 만들기. (0) | 2016.02.01 |
[C++] Windows에서 pthread 사용하기 (2) | 2016.02.01 |
[C++] 암호화,복호화(Encrypt,Decrypt) 만들기 (0) | 2016.02.01 |
[C++] 메모리풀(MemoryPool) 만들기 (0) | 2016.02.01 |
- Total
- Today
- Yesterday
- ruby
- 엘라스틱서치 기초
- 페어 프로그래밍
- MySQL
- dead lock
- 루비 메타프로그래밍
- 갭 락
- next key lock
- 되추적
- 넥스트 키 락
- ruby meta programming
- MySQL 인덱스
- MySQL 족보
- 트랜잭션
- InnoDB
- Autoloading
- metaprogramming
- 인덱스
- mysql lock
- 페어프로그래밍
- 루비 상수
- db
- gap lock
- lock
- 루비
- 메타프로그래밍
- autoload_paths
- Pair-programming
- Elasticsearch Cluster
- innoDB lock
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |