c: chain Of Responsibility in windows 10

 

/**
 * @file chainOfResponsibility.h
 * @author your name (geovindu)
 * @brief  chain Of Responsibility 职责链模式
 * @version 0.1
 * @date 2023-10-28
 *  IDE: VSCODE C11 C17
 * @copyright Copyright (c) 2023
 * 
 */


#ifndef  _CHAINOFRESPONSIBILITY_H_
#define _CHAINOFRESPONSIBILITY_H_

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief 检验处理链
 * 
 */
typedef struct ChainDuValidator {
    bool (* const chainDuValidator)
    (struct ChainDuValidator *pThis, int val);
} ChainDuValidator;

/**
 * @brief 
 * 
 */
typedef struct {
    ChainDuValidator base;
    const int min;
    const int max;
} ChainDuRangeValidator;

/**
 * @brief 
 * 
 */
typedef struct {
    ChainDuValidator base;
    int previousValue;
} ChainDuPreviousValueValidator;

/**
 * @brief 
 * 
 */
typedef struct ChainedValidator {
    ChainDuValidator base;
    ChainDuValidator *pWrapped;
    ChainDuValidator *pNext;
} ChainedValidator;

/**
 * @brief 
 * 
 */
typedef struct {
    int top;
    const size_t size;
    int * const pBuf;
    ChainDuValidator * const pValidator;
} Stack;

/**
 * @brief 
 * 
 * @param p 
 * @param val 
 * @return true 
 * @return false 
 */
bool ChainDuvalidateRange(ChainDuValidator *p, int val);

/**
 * @brief 
 * 
 * @param p 
 * @param val 
 * @return true 
 * @return false 
 */
bool ChainDuvalidatePrevious(ChainDuValidator *p, int val);

/**
 * @brief 
 * 
 * @param p 
 * @param val 
 * @return true 
 * @return false 
 */
bool ChainDuvalidateChain(ChainDuValidator *p, int val);

/**
 * @brief 
 * 
 * @param p 
 * @param val 
 * @return true 
 * @return false 
 */
bool ChainDupush(Stack *p, int val);

/**
 * @brief 
 * 
 * @param p 
 * @param pRet 
 * @return true 
 * @return false 
 */
bool ChainDupop(Stack *p, int *pRet);


/**
 * @brief 
 * 
 */
#define DunewRangeValidator(min, max) \
    {{ChainDuvalidateRange}, (min), (max)}

/**
 * @brief 
 * 
 */
#define DunewPreviousValueValidator \
    {{ChainDuvalidatePrevious}, 0}


/**
 * @brief 
 * 
 */
#define DunewChainedValidator(wrapped, next)       \
    {{ChainDuvalidateChain}, (wrapped), (next)}



/**
 * @brief 
 * 
 */
#define newStack(buf) {                  \
    0, sizeof(buf) / sizeof(int), (buf), \
    NULL                                 \
} 

/**
 * @brief 
 * 
 */
#define DunewStackWithValidator(buf, pValidator) { \
    0, sizeof(buf) / sizeof(int), (buf),         \
    pValidator                                   \
}

#ifdef __cplusplus
}
#endif

#endif

  

/**
 * @file chainOfResponsibility.C
 * @author your name (geovindu)
 * @brief  chain Of Responsibility 职责链模式
 * @version 0.1
 * @date 2023-10-28
 * IDE: VSCODE C11 C17
 * @copyright Copyright (c) 2023
 * 
 */

#include "include/chainOfResponsibility.h"
#include <stdbool.h>

/**
 * @brief 
 * 
 * @param p 
 * @return true 
 * @return false 
 */
static bool isStackFull(const Stack *p) {
    return p->top == p->size;
}

/**
 * @brief 
 * 
 * @param p 
 * @return true 
 * @return false 
 */
static bool isStackEmpty(const Stack *p) {
    return p->top == 0;
}

/**
 * @brief 
 * 
 * @param p 
 * @param val 
 * @return true 
 * @return false 
 */
bool ChainDuvalidateRange(ChainDuValidator *p, int val) {
    ChainDuRangeValidator *pThis = (ChainDuRangeValidator *)p;
    return pThis->min <= val && val <= pThis->max;
}

/**
 * @brief 
 * 
 * @param p 
 * @param val 
 * @return true 
 * @return false 
 */
bool ChainDuvalidatePrevious(ChainDuValidator *p, int val) {
    ChainDuPreviousValueValidator *pThis = (ChainDuPreviousValueValidator *)p;
    if (val < pThis->previousValue) return false;
    pThis->previousValue = val;
    return true;
}

/**
 * @brief 
 * 
 * @param p 
 * @param val 
 * @return true 
 * @return false 
 */
bool ChainDuvalidate(ChainDuValidator *p, int val) {
    if (! p) return true;
    return p->chainDuValidator(p, val);
}

// true: 成功, false: 失敗
/**
 * @brief 
 * 
 * @param p 
 * @param val 
 * @return true 
 * @return false 
 */
bool ChainDupush(Stack *p, int val) {
    if (! ChainDuvalidate(p->pValidator, val) || isStackFull(p)) return false;
    p->pBuf[p->top++] = val;
    return true;
}

// true: 成功, false: 失敗

/**
 * @brief 
 * 
 * @param p 
 * @param pRet 
 * @return true 
 * @return false 
 */
bool ChainDupop(Stack *p, int *pRet) {
    if (isStackEmpty(p)) return false;
    *pRet = p->pBuf[--p->top];
    return true;
}

/**
 * @brief 
 * 
 * @param p 
 * @param val 
 * @return true 
 * @return false 
 */
bool ChainDuvalidateChain(ChainDuValidator *p, int val) {
    ChainedValidator *pThis = (ChainedValidator *)p;

    p = pThis->pWrapped;
    if (! p->chainDuValidator(p, val)) return false;

    p = pThis->pNext;
    return !p || p->chainDuValidator(p, val);
}

  

typedef struct TestValidator {
    Validator base;
    bool result;
} TestValidator;


static bool validateTest(Validator *p, int val) {
        TestValidator *pThis = (TestValidator *)p;
        return pThis->result;
}


static TestValidator trueValidator = {{validateTest}, true};
static TestValidator falseValidator = {{validateTest}, false};



int main(void)
{
    printf("hello c world, \n");
    printf("你好,中国\n");



    RangeValidator rangeValidator = DunewRangeValidator(0, 9);
    PreviousValueValidator prevValidator = DunewPreviousValueValidator;

    ChainedValidator prevChain = DunewChainedValidator(&prevValidator.base, NULL);
    ChainedValidator rangeChain = DunewChainedValidator(&rangeValidator.base, &prevChain.base);

    int buf[16]={1,2,4,3,5,7,8};
    Stack stack = DunewStackWithValidator(buf, &rangeChain.base);
    //false, ChainDupush(&stack, -1)
    printf("%d/n",ChainDupush(&stack, -1); 
   return 0:
}

https://github.com/cirocosta/observer-c
https://www.adamtornhill.com/articles/patternsinc/patternsincnew.htm
https://www.adamtornhill.com/code.htm
https://www.adamtornhill.com/articles.htm
https://www.adamtornhill.com/Patterns%20in%20C%201.pdf
https://www.adamtornhill.com/Patterns%20in%20C%202,%20STATE.pdf
https://www.adamtornhill.com/Patterns%20in%20C%203,%20STRATEGY.pdf
https://www.adamtornhill.com/Patterns%20in%20C%204,%20OBSERVER.pdf
https://www.adamtornhill.com/Patterns%20in%20C%205,%20REACTOR.pdf

https://github.com/adamtornhill/PatternsInC

https://c.helpful.codes/patterns/Observer/
https://github.com/huawenyu/Design-Patterns-in-C
https://swedishembedded.com/design-patterns/
https://blog.csdn.net/ZCShouCSDN/article/details/80217199
https://www.sciencedirect.com/book/9781856177078/design-patterns-for-embedded-systems-in-c
https://www.oreilly.com/library/view/design-patterns-for/9781856177078/
https://github.com/topics/design-patterns?l=c

  

 

posted @ 2023-10-28 05:55  ®Geovin Du Dream Park™  阅读(6)  评论(0编辑  收藏  举报