キューテンプレートライブラリ。テスト。


順番が前後してますが FIFO データ構造も作ってみました。
LIFO のものをベースに手直しです。


Queue template library test


main.c

/*---------------------------------------------------------------------------------
	
	Queue template library test
	
	version 0.01 test
	Jun 21, 2010
	
	By REGEKATSU
	
---------------------------------------------------------------------------------*/

#include <stdio.h>
#include <nds.h>
#include "libmy/Queue.h"


void drawQueue(void);


//---------------------------------------------------------------------------------
int main(void){
//---------------------------------------------------------------------------------
	
	int value = 0;
	
	consoleDemoInit();
	printf("Queue template library test\n\nversion 0.01 test\nJun 21, 2010\n\nBy REGEKATSU\n\n\n");
	printf("\x01b[22;0HQueue Act  :null");
	
	Queue_Init();
	
	while(1) {
		
		swiWaitForVBlank();
		scanKeys();
		
		drawQueue();
		
		//push
		if(keysDown() & KEY_A){
			if(Queue_Size() != QUEUE_SIZE){
				Queue_Push(++value);
				printf("\x01b[22;12HPush");
			}
			
		//pop
		}else if(keysDown() & KEY_B){
			if(Queue_Empty() == false){
				Queue_Pop();
				printf("\x01b[22;12HPop ");
			}
		}
		
	}
	
}

//---------------------------------------------------------------------------------
void drawQueue(void){
//---------------------------------------------------------------------------------
	
	printf("\x01b[8;0HQueue:Value\n");
	
	int i;
	for(i = 0;i < QUEUE_SIZE;i++){
		printf(
			"\x01b[%d;0H\x01b[2K\r   %02d:%d\n", 
			9 + i, 
			QUEUE_SIZE - (i + 1), 
			*Queue_Request(QUEUE_SIZE - (i + 1))
		);
	}
	printf("\n");
	
	printf("Queue Empty:%s\n", (Queue_Empty() == true) ? "true ":"false");
	printf("Queue Size :%02d\n", Queue_Size());
	
}

//---------------------------------------------------------------------------------


Queue.h

/*---------------------------------------------------------------------------------
	
	Queue template library header
	
	version 0.01 test
	Jun 21, 2010
	
	By REGEKATSU
	
---------------------------------------------------------------------------------*/

#ifndef _QUEUE_H_
#define _QUEUE_H_


#include <nds/ndstypes.h>//bool


#define QUEUE_SIZE (10)


#ifdef __cplusplus
extern "C" {
#endif


//キューデータ構造を初期化します。
void Queue_Init(void);

//現在のキューの最後の要素への参照を返します。
int *Queue_Back(void);
//現在のキューが空ならtrueを返します。空でない場合にはfalseを返します。
bool Queue_Empty(void);
//現在のキューの先頭の要素への参照を返します。
int *Queue_Front(void);
//現在のキューの先頭の要素を破棄します。
void Queue_Pop(void);
//現在のキューに値を追加します。
void Queue_Push(int value);
//現在のキューの任意の要素への参照を返します。
int *Queue_Request(int number);
//現在のキューの要素数を返します。
int Queue_Size(void);


#ifdef __cplusplus
}
#endif

#endif	//_QUEUE_H_


Queue.c

/*---------------------------------------------------------------------------------
	
	Queue template library routine
	
	version 0.01 test
	Jun 21, 2010
	
	By REGEKATSU
	
---------------------------------------------------------------------------------*/

#include <string.h>
#include "Queue.h"


typedef struct _Queue{
	int value[QUEUE_SIZE];
	int front;
	int back;
	int size;
}_Queue;


static _Queue st_queue;


#define SET_INDEX(idx)  (((idx) >= QUEUE_SIZE) ? idx - QUEUE_SIZE:idx)
#define NEXT_INDEX(idx) (((idx) + 1) % QUEUE_SIZE)


//---------------------------------------------------------------------------------
void Queue_Init(void){
//---------------------------------------------------------------------------------
	
	//キューデータ構造を初期化します。
	
	memset(&st_queue, 0, sizeof(st_queue));
	
}

//---------------------------------------------------------------------------------
int *Queue_Back(void){
//---------------------------------------------------------------------------------
	
	//現在のキューの最後の要素への参照を返します。
	
	if(st_queue.size == 0) return NULL;
	
	return &st_queue.value[st_queue.back];
	
}

//---------------------------------------------------------------------------------
bool Queue_Empty(void){
//---------------------------------------------------------------------------------
	
	//現在のキューが空ならtrueを返します。空でない場合にはfalseを返します。
	
	return (st_queue.size == 0) ? true:false;
	
}

//---------------------------------------------------------------------------------
int *Queue_Front(void){
//---------------------------------------------------------------------------------
	
	//現在のキューの先頭の要素への参照を返します。
	
	if(st_queue.size == 0) return NULL;
	
	return &st_queue.value[st_queue.front];
	
}

//---------------------------------------------------------------------------------
void Queue_Pop(void){
//---------------------------------------------------------------------------------
	
	//現在のキューの先頭の要素を破棄します。
	
	if(st_queue.size > 0){
		st_queue.value[st_queue.front] = 0;
		st_queue.front = NEXT_INDEX(st_queue.front);
		st_queue.size--;
	}
	
}

//---------------------------------------------------------------------------------
void Queue_Push(int value){
//---------------------------------------------------------------------------------
	
	//現在のキューに値を追加します。
	
	if(st_queue.size < QUEUE_SIZE){
		st_queue.value[st_queue.back] = value;
		st_queue.back = NEXT_INDEX(st_queue.back);
		st_queue.size++;
	}
	
}

//---------------------------------------------------------------------------------
int *Queue_Request(int number){
//---------------------------------------------------------------------------------
	
	//現在のキューの任意の要素への参照を返します。
	
	if(number < 0 || number >= QUEUE_SIZE) return NULL;
	
	if(st_queue.size == 0) return NULL;
	
	return &st_queue.value[SET_INDEX(st_queue.front + number)];
	
}

//---------------------------------------------------------------------------------
int Queue_Size(void){
//---------------------------------------------------------------------------------
	
	//現在のキューの要素数を返します。
	
	return st_queue.size;
	
}

//---------------------------------------------------------------------------------