#include "register_monitor_model.h" #include // 根据监控点列表生成按添加顺序排列的地址列表 const std::vector &RegisterMonitorModel::addresses() const { // 地址列表是兼容视图,每次访问时从完整监控点列表重新生成 addresses_.clear(); addresses_.reserve(points_.size()); for (const MonitorPoint &point : points_) { addresses_.push_back(point.address); } return addresses_; } // 返回当前保存的完整监控点列表 const std::vector &RegisterMonitorModel::points() const { return points_; } // 判断相同地址和数据类型的监控点是否已经存在 bool RegisterMonitorModel::contains(const MonitorPoint &point) const { // 地址相同但数据类型不同,可以作为不同监控点同时存在 return std::find_if( points_.cbegin(), points_.cend(), [&point](const MonitorPoint &candidate) { return candidate.address == point.address && candidate.dataType == point.dataType; }) != points_.cend(); } // 校验并添加一个监控点 bool RegisterMonitorModel::add(const MonitorPoint &point) { // 添加前一次性检查地址、类型、范围、重复项和数量上限 if (!point.address.isValid() || (point.address.area() == RegisterArea::M && point.dataType != RegisterDataType::Int16) || (point.address.area() == RegisterArea::D && !registerDataTypeAddressIsValid(point.dataType, point.address)) || contains(point) || points_.size() >= kMaximumItemCount) { return false; } points_.push_back(point); return true; } // 删除指定地址的第一个监控点 bool RegisterMonitorModel::remove(const RegisterAddress &address) { const auto position = std::find_if( points_.begin(), points_.end(), [&address](const MonitorPoint &point) { return point.address == address; }); if (position == points_.end()) { return false; } points_.erase(position); return true; } // 删除地址和数据类型都匹配的监控点 bool RegisterMonitorModel::remove(const MonitorPoint &point) { const auto position = std::find_if( points_.begin(), points_.end(), [&point](const MonitorPoint &candidate) { return candidate.address == point.address && candidate.dataType == point.dataType; }); if (position == points_.end()) { return false; } points_.erase(position); return true; } // 清空当前会话中的全部监控点和地址视图 void RegisterMonitorModel::clear() { addresses_.clear(); points_.clear(); }