57 lines
1.4 KiB
C
57 lines
1.4 KiB
C
|
|
// eqpalg/utility/bound_checker.h
|
|||
|
|
#pragma once
|
|||
|
|
|
|||
|
|
#include <string>
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @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;
|
|||
|
|
};
|