// eqpalg/utility/bound_checker.h #pragma once #include /** * @brief 检测模式:双侧、仅左侧、仅右侧 */ enum class DetectMode { Default = 0, // 双侧检测 (value < down || value > up) OnlyLeft = 1, // 仅检测左边界 (value < down) OnlyRight = 2, // 仅检测右边界 (value > up) ErrorMode = 3 // 错误模式 }; /** * @brief 上下限检测器 * * 从 ExpBase 提取,封装哨兵值 -32768/32767 的处理逻辑。 */ class BoundChecker { public: BoundChecker() = default; /** * @brief 设置上下限,自动推导检测模式 * @param down 下限(-32768 表示无下限) * @param up 上限(32767/32768 表示无上限) */ void setLimits(double down, double up); /** * @brief 手动设置检测模式(覆盖自动推导) */ void setDetectMode(DetectMode mode) { detect_mode_ = mode; } /** * @brief 判断 value 是否超出限值 */ bool isOutOfBounds(double value) const; // 访问器 double limitDown() const { return limit_down_; } double limitUp() const { return limit_up_; } DetectMode detectMode() const { return detect_mode_; } /** * @brief 是否已配置有效限值 */ bool isValid() const { return detect_mode_ != DetectMode::ErrorMode; } private: double limit_down_ = -32768; double limit_up_ = -32768; DetectMode detect_mode_ = DetectMode::Default; };