core_message_stream.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #ifndef AFUN_CORE_MESSAGE_STREAM_H
  2. #define AFUN_CORE_MESSAGE_STREAM_H
  3. #include <list>
  4. #include <mutex>
  5. #include <map>
  6. #include "aFuntool.h"
  7. #include "aFunCoreExport.h"
  8. #include "core_message.h"
  9. namespace aFuncore {
  10. class AFUN_CORE_EXPORT MessageStream {
  11. public:
  12. MessageStream() = default;
  13. virtual ~MessageStream();
  14. MessageStream(const MessageStream &)=delete;
  15. MessageStream &operator=(const MessageStream &)=delete;
  16. template<class T>
  17. [[nodiscard]] T *getMessage(const std::string &type) const;
  18. Message *popMessage(const std::string &type);
  19. void pushMessage(const std::string &type, Message *msg);
  20. template <typename Callable, typename...T>
  21. void forEach(Callable func, T...arg);
  22. protected:
  23. std::map<std::string, Message *> stream;
  24. [[nodiscard]] virtual Message *_getMessage(const std::string &type) const;
  25. };
  26. class AFUN_CORE_EXPORT UpMessageStream : public MessageStream {
  27. public:
  28. explicit UpMessageStream(const UpMessageStream *old=nullptr);
  29. ~UpMessageStream() override = default;
  30. template <typename Callable, typename...T>
  31. void forEachAll(Callable func, T...arg);
  32. protected:
  33. const UpMessageStream *old;
  34. [[nodiscard]] Message *_getMessage(const std::string &type) const override;
  35. };
  36. class AFUN_CORE_EXPORT DownMessageStream : public MessageStream {
  37. public:
  38. void joinMsg(DownMessageStream &msg);
  39. };
  40. class AFUN_CORE_EXPORT InterMessageStream : public MessageStream {
  41. public:
  42. Message *popFrontMessage(std::string &type);
  43. Message *popMessage(const std::string &type);
  44. void pushMessage(const std::string &type, Message *msg);
  45. template <typename Callable, typename...T>
  46. void forEach(Callable func, T...arg);
  47. template <typename Callable, typename...T>
  48. void forEachLock(Callable func, T...arg);
  49. private:
  50. std::mutex lock;
  51. };
  52. class InterOutMessageStream : public InterMessageStream {
  53. public:
  54. template<class T>
  55. [[nodiscard]] T *getMessage(const std::string &type) const = delete; // 对外不设置 getMessage 以避免线程问题
  56. };
  57. class InterInMessageStream : public InterMessageStream {
  58. };
  59. }
  60. #include "core_message_stream.template.h"
  61. #endif //AFUN_CORE_MESSAGE_STREAM_H