#pragma once #include #include #include // Базовый шаблонный класс IPC-сообщения с API add() / get(). // Сериализация вынесена в отдельные сериализаторы (см. IpcSerializer.h). // Конкретный тип сообщения определяется через type alias в IpcConfig.h. template class BaseIpcMessage { public: // Тип сырых данных определяется сериализатором using RawData = typename Serializer::RawData; BaseIpcMessage() = default; // Конструирование из сырых данных (тип определяется сериализатором) explicit BaseIpcMessage(const RawData& raw) { data_ = Serializer::deserialize(raw); } BaseIpcMessage(const BaseIpcMessage& other) : data_(other.data_) , pos_(0) {} BaseIpcMessage& operator=(const BaseIpcMessage& other) { if (this != &other) { data_ = other.data_; pos_ = 0; } return *this; } // Конструирование исходящего сообщения. template void add(const T& v) { data_.emplace_back(v); } // Чтение входящего сообщения по частям. template T get() { if (pos_ >= data_.size()) { return T{}; // или throw } auto& v = data_[pos_++]; if constexpr (std::is_same_v) { if (auto* p = std::get_if(&v)) { return *p; } } else if constexpr (std::is_same_v) { if (auto* p = std::get_if(&v)) { return *p; } } return T{}; } bool empty() const { return pos_ >= data_.size(); } // Сериализация в сырые данные (тип определяется сериализатором) RawData serialize() const { return Serializer::serialize(data_); } // Получить сырые данные (для обратной совместимости или отладки) RawData raw() const { return serialize(); } private: std::vector> data_; mutable std::size_t pos_{0}; };