スタックテンプレートライブラリ。テスト2。


継承して使うことを前提にして組んでみた版です。
ぶっちゃけスタック操作だけを提供するようなライブラリでも良かった感じです。
これは没にしてもう一度書き直そうと思います。


C言語で継承のやり方は以下の書物を参考にしました。
…というか継承を使ってみたかっただけなのがバレますね(笑)。


C言語 入門書の次に読む本


C言語によるオブジェクト指向プログラミング入門


Stack template library test(没バージョン)


main.c

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

#include <stdio.h>
#include <nds.h>
#include "Sample.h"


#define STACK_SIZE_MAX (10)


void drawSample(Sample sample);


//---------------------------------------------------------------------------------
int main(void){
//---------------------------------------------------------------------------------
	
	int value = 0;
	
	consoleDemoInit();
	printf("Stack template library test\n\nversion 0.01\nJun 21, 2010\n\nBy REGEKATSU\n\n\n");
	printf("\x01b[22;0HStack Act  :null");
	
	Sample sample1 = Sample_Create(STACK_SIZE_MAX);
	
	while(1) {
		
		swiWaitForVBlank();
		scanKeys();
		
		drawSample(sample1);
		
		//push
		if(keysDown() & KEY_A){
			if(Sample_Size(sample1) != STACK_SIZE_MAX){
				Sample_Push(sample1, ++value);
				printf("\x01b[22;12HPush");
			}
			
		//pop
		}else if(keysDown() & KEY_B){
			if(Sample_Empty(sample1) == false){
				Sample_Pop(sample1);
				printf("\x01b[22;12HPop ");
			}
		}
		
	}
	
}

//---------------------------------------------------------------------------------
void drawSample(Sample sample){
//---------------------------------------------------------------------------------
	
	if(sample == NULL) return;
	
	printf("\x01b[8;0HStack:Value\n");
	
	int i;
	for(i = 0;i < STACK_SIZE_MAX;i++){
		printf(
			"\x01b[%d;0H\x01b[2K\r   %02d:%d\n", 
			9 + i, 
			STACK_SIZE_MAX - (i + 1), 
			*Sample_Request(sample, STACK_SIZE_MAX - (i + 1))
		);
	}
	printf("\n");
	
	printf("Stack Empty:%s\n", (Sample_Empty(sample) == true) ? "true ":"false");
	printf("Stack Size :%02d\n", Sample_Size(sample));
	
}

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


Sample.h

/*---------------------------------------------------------------------------------
	
	Stack template sample header
	
	version 0.01
	Jun 21, 2010
	
	By REGEKATSU
	
---------------------------------------------------------------------------------*/

#ifndef _SAMPLE_H_
#define _SAMPLE_H_


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


typedef struct _Sample *Sample;


#ifdef __cplusplus
extern "C" {
#endif


//スタックデータ構造を生成します。
Sample Sample_Create(int size_max);
//スタックデータ構造を破棄します。
Sample Sample_Destroy(Sample sample);

//現在のスタックが空の時にtrueを返し、そうでないときはfalseを返します。
bool Sample_Empty(Sample sample);
//現在のスタックの先頭の要素を削除します。
void Sample_Pop(Sample sample);
//値を現在のスタックの先頭に追加します。
void Sample_Push(Sample sample, int value);
//現在のスタックの任意の要素への参照を返します。
int *Sample_Request(Sample sample, int index);
//現在のスタックの要素数を返します。
int Sample_Size(Sample sample);
//現在のスタックの先頭の要素への参照を返します。
int *Sample_Top(Sample sample);


#ifdef __cplusplus
}
#endif

#endif	//_SAMPLE_H_


Sample.c

/*---------------------------------------------------------------------------------
	
	Stack template sample routine
	
	version 0.01
	Jun 21, 2010
	
	By REGEKATSU
	
---------------------------------------------------------------------------------*/

#include <stdlib.h>
#include "libmy/Stack.h"
#include "Sample.h"


typedef struct _Sample{
	
	_Stack stack;
	
	int *value;
	
}_Sample;


//---------------------------------------------------------------------------------
Sample Sample_Create(int size_max){
//---------------------------------------------------------------------------------
	
	//スタックデータ構造を生成します。
	
	Sample sample;
	
	sample = (Sample)malloc(sizeof(_Sample));
	
	Stack_Init((Stack)sample, size_max);
	
	sample->value = malloc(sizeof(int) * ((Stack)sample)->size_max);
	
	return sample;
	
}


//---------------------------------------------------------------------------------
Sample Sample_Destroy(Sample sample){
//---------------------------------------------------------------------------------
	
	//スタックデータ構造を破棄します。
	
	if(sample == NULL) return NULL;
	
	free(sample->value);
	free(sample);
	
	return NULL;
	
}

//---------------------------------------------------------------------------------
bool Sample_Empty(Sample sample){
//---------------------------------------------------------------------------------
	
	//現在のスタックが空の時にtrueを返し、そうでないときはfalseを返します。
	
	if(sample == NULL) return true;
	
	return Stack_Empty((Stack)sample);
	
}

//---------------------------------------------------------------------------------
void Sample_Pop(Sample sample){
//---------------------------------------------------------------------------------
	
	//現在のスタックの先頭の要素を削除します。
	
	if(sample == NULL) return;
	
	if(Stack_Empty((Stack)sample) == false){
		
		int index = Stack_Top((Stack)sample);
		
		sample->value[index] = 0;
		
		Stack_Pop((Stack)sample);
		
	}
	
}

//---------------------------------------------------------------------------------
void Sample_Push(Sample sample, int value){
//---------------------------------------------------------------------------------
	
	//値を現在のスタックの先頭に追加します。
	
	if(sample == NULL) return;
	
	if(Stack_Size((Stack)sample) < ((Stack)sample)->size_max) {
		
		int index = Stack_Top((Stack)sample) + 1;
		
		sample->value[index] = value;
		
		Stack_Push((Stack)sample);
		
	}
	
}

//---------------------------------------------------------------------------------
int *Sample_Request(Sample sample, int index){
//---------------------------------------------------------------------------------
	
	//現在のスタックの任意の要素への参照を返します。
	
	if(sample == NULL) return NULL;
	
	if(index < 0 || index >= ((Stack)sample)->size_max) return NULL;
	
	return &sample->value[index];
	
}


//---------------------------------------------------------------------------------
int Sample_Size(Sample sample){
//---------------------------------------------------------------------------------
	
	//現在のスタックの要素数を返します。
	
	if(sample == NULL) return -1;
	
	return Stack_Size((Stack)sample);
	
}

//---------------------------------------------------------------------------------
int *Sample_Top(Sample sample){
//---------------------------------------------------------------------------------
	
	//現在のスタックの先頭の要素への参照を返します。
	
	if(sample == NULL) return NULL;
	
	int index = Stack_Top((Stack)sample);
	
	if(index < 0) return NULL;
	
	return &sample->value[index];
	
}

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


Stack.h

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

#ifndef _STACK_H_
#define _STACK_H_


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


typedef struct _Stack *Stack;


typedef struct _Stack{
	int sp;
	int size_max;
}_Stack;


#ifdef __cplusplus
extern "C" {
#endif


//スタックデータ構造を初期化します。
void Stack_Init(Stack stack, int size_max);

//現在のスタックが空の時にtrueを返し、そうでないときはfalseを返します。
bool Stack_Empty(Stack stack);
//現在のスタックの先頭の要素を削除します。
void Stack_Pop(Stack stack);
//値を現在のスタックの先頭に追加します。
void Stack_Push(Stack stack);
//現在のスタックの要素数を返します。
int Stack_Size(Stack stack);
//現在のスタックの先頭の要素へのインデックスを返します。
int Stack_Top(Stack stack);


#ifdef __cplusplus
}
#endif

#endif	//_STACK_H_


Stack.c

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

#include <stddef.h>
#include "Stack.h"


//---------------------------------------------------------------------------------
void Stack_Init(Stack stack, int size_max){
//---------------------------------------------------------------------------------
	
	//スタックデータ構造を初期化します。
	
	if(stack == NULL) return;
	
	stack->sp = 0;
	stack->size_max = (size_max <= 0) ? 1:size_max;
	
}

//---------------------------------------------------------------------------------
bool Stack_Empty(Stack stack){
//---------------------------------------------------------------------------------
	
	//現在のスタックが空の時にtrueを返し、そうでないときはfalseを返します。
	
	if(stack == NULL) return true;
	
	return (stack->sp == 0) ? true:false;
	
}

//---------------------------------------------------------------------------------
void Stack_Pop(Stack stack){
//---------------------------------------------------------------------------------
	
	//現在のスタックの先頭の要素を削除します。
	
	if(stack == NULL) return;
	
	if(stack->sp > 0) stack->sp--;
	
}

//---------------------------------------------------------------------------------
void Stack_Push(Stack stack){
//---------------------------------------------------------------------------------
	
	//値を現在のスタックの先頭に追加します。
	
	if(stack == NULL) return;
	
	if(stack->sp < stack->size_max) stack->sp++;
	
}

//---------------------------------------------------------------------------------
int Stack_Size(Stack stack){
//---------------------------------------------------------------------------------
	
	//現在のスタックの要素数を返します。
	
	if(stack == NULL) return -1;
	
	return stack->sp;
	
}

//---------------------------------------------------------------------------------
int Stack_Top(Stack stack){
//---------------------------------------------------------------------------------
	
	//現在のスタックの先頭の要素へのインデックスを返します。
	
	if(stack == NULL) return -1;
	
	return stack->sp - 1;
	
}

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