/***
 * @Description: 生产者管理类 内含3个不同主题发布者
 * @Author: jizhou
 * @Date: 2023-07-13 19:13:44
 * @LastEditors: jizhou
 * @LastEditTime: 2023-07-16 23:57:01
 * @FilePath: /EnvironmentAccess/src/manager/IPCSubscriberManager.h
 */
#ifndef FAST_DDS_GENERATED__IPCSubscriberManager
#define FAST_DDS_GENERATED__IPCSubscriberManager

#include <string>

#include "BaseManager.h"
#include "fastdds/IPCSubscriber.h"

using namespace std;

class IPCSubscriberManager : public BaseManager<IPCSubscriberManager> {
private:
    /***
     * @brief: 构造函数
     * @return {*}
     */
    IPCSubscriberManager() = default;


    std::map<std::string, std::shared_ptr<IPCSubscriberBase>> subscribers_;
    
public:
    /***
     * @brief: 析构函数
     * @return {*}
     */
    ~IPCSubscriberManager() = default;

    friend class BaseManager;

     template<typename MessageT>
    std::shared_ptr<IPCSubscriber<MessageT>> createSubscriber(const std::string& topic, size_t qos_profile_depth) {
        auto subscriber = std::make_shared<IPCSubscriber<MessageT>>(0, topic);
        subscribers_[topic] = subscriber;
        return subscriber;
    }

    template<typename MessageT>
    std::shared_ptr<IPCSubscriber<MessageT>> get_subscriber_by_topic(const std::string& topic) {
        auto it = subscribers_.find(topic);
        if (it != subscribers_.end()) {
            return std::dynamic_pointer_cast<IPCSubscriber<MessageT>>(it->second);
        }
        return nullptr;
    }
    
    void stopAll() {
        auto iter = subscribers_.begin();
        for(; iter!= subscribers_.end(); iter++) {
            iter->second->stop();
        }
    }

};

#endif