C面向对象编程
本文地址:http://tongxinmao.com/Article/Detail/id/113
#ifndef _STACK_H_ #define _STACK_H_ #include <stddef.h> #ifdef __cplusplus extern "C" { #endif typedef struct _Validator { bool (* const validate)(struct _Validator *pThis, int val); } Validator; typedef struct { Validator base; const int min; const int max; } RangeValidator; typedef struct { Validator base; int previousValue; } PreviousValueValidator; typedef struct { int top; const size_t size; int * const pBuf; Validator * const pValidator; } Stack; bool validateRange(Validator *pThis, int val); bool validatePrevious(Validator *pThis, int val); #define newRangeValidator(min, max) \ {{validateRange}, (min), (max)} #define newPreviousValueValidator \ {{validatePrevious}, 0} bool push(Stack *p, int val); bool pop(Stack *p, int *pRet); #define newStack(buf) { \ 0, sizeof(buf) / sizeof(int), (buf), \ NULL \ } #define newStackWithValidator(buf, pValidator) { \ 0, sizeof(buf) / sizeof(int), (buf), \ pValidator \ } #ifdef __cplusplus } #endif #endif #include <stdbool.h> #include "stack.h" static bool isStackFull(const Stack *p) { return p->top == p->size; } static bool isStackEmpty(const Stack *p) { return p->top == 0; } bool validateRange(Validator *p, int val) { RangeValidator *pThis = (RangeValidator *)p; return pThis->min <= val && val <= pThis->max; } bool validatePrevious(Validator *p, int val) { PreviousValueValidator *pThis = (PreviousValueValidator *)p; if (val < pThis->previousValue) return false; pThis->previousValue = val; return true; } bool validate(Validator *p, int val) { if (! p) return true; return p->validate(p, val); } // true: 成功, false: 失敗 bool push(Stack *p, int val) { if (! validate(p->pValidator, val) || isStackFull(p)) return false; p->pBuf[p->top++] = val; return true; } // true: 成功, false: 失敗 bool pop(Stack *p, int *pRet) { if (isStackEmpty(p)) return false; *pRet = p->pBuf[--p->top]; return true; }
上一篇:C语言 FIFO(宏)
下一篇:USB复合设备(CDC+HID)描述符