ContentGenerator.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. //
  2. // Created by xcbosa on 2023/1/28.
  3. //
  4. #pragma once
  5. #include "processor-private.h"
  6. #include "../utils/utils.h"
  7. #define __merge_body(a, b) a ## b
  8. #define __merge(a, b) __merge_body(a, b)
  9. #define __uniqueVarName(name) __merge(name, __LINE__)
  10. #define __string_fic(a) #a
  11. #define __string_fic_r(a) __string_fic(a)
  12. #define ContentGeneratorDefineWithName(name, cond, eval) const static ContentGenerator __uniqueVarName(AutoContentGenerator_Line_)(name, ([] (auto request) { cond; }), ([] (auto request) { eval; }));
  13. #define ContentGeneratorDefineWithNameS(name, cond, eval) ContentGeneratorDefineWithName(name, return cond, return eval)
  14. #define ContentGeneratorDefine(cond, eval) ContentGeneratorDefineWithName(__string_fic_r(__uniqueVarName(AutoRegistered_Line_) __FILE_NAME__), cond, eval)
  15. #define ContentGeneratorDefineS(cond, eval) ContentGeneratorDefine(return cond, return eval)
  16. using namespace std;
  17. namespace xc {
  18. namespace processor {
  19. /*输入一个请求,判断此生成器是否响应此请求*/
  20. typedef function<bool (RequestData)> RequestCheckBlock;
  21. /*为此请求生成响应,响应需要使用new,在发送完成或HTTP服务器不再需要时自动调用delete销毁*/
  22. typedef function<ResponseData* (RequestData)> ContentGenerateBlock;
  23. /*请定义为static*/
  24. class ContentGenerator {
  25. public:
  26. ContentGenerator(string name, RequestCheckBlock checker, ContentGenerateBlock generator);
  27. bool matchRequest(RequestData request) const;
  28. ResponseData *generateResponse(RequestData request) const;
  29. string getName() const;
  30. private:
  31. string name;
  32. RequestCheckBlock checker;
  33. ContentGenerateBlock generator;
  34. };
  35. const ContentGenerator *findContentGenerator(string name);
  36. }
  37. }