From e575efdc8aa93c3b27374722483ae79a63fc6eb5 Mon Sep 17 00:00:00 2001 From: Huamonarch Date: Fri, 15 May 2026 12:30:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20ExpressionEngine=20FunVars=20=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=20+=20hold=20=E5=8F=98=E9=87=8F=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eqpalg/utility/expression_engine.cpp | 46 ++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/eqpalg/utility/expression_engine.cpp b/eqpalg/utility/expression_engine.cpp index f66c9b6..ec5825e 100644 --- a/eqpalg/utility/expression_engine.cpp +++ b/eqpalg/utility/expression_engine.cpp @@ -68,7 +68,40 @@ bool ExpressionEngine::evaluateBool(const std::string& name) { } int ExpressionEngine::initHoldExpStr(const std::string& exp_str) { - return 0; // stub — Task 5 will implement + auto hold_sub_strs = HoldTime::find_substr(exp_str, "_HE"); + for (const auto& sub_str : hold_sub_strs) { + bool flag; + double timeM; + std::string tagi; + std::string var_name; + std::tie(flag, timeM, tagi, var_name) = HoldTime::find_hold(sub_str); + if (flag) { + if (hold_times_.find(var_name) == hold_times_.end()) { + hold_times_.emplace(std::make_pair( + var_name, std::make_unique(timeM, tagi, var_name))); + } + } + } + refreshHoldVars(); + return 0; +} + +// ========== FunVars 控制 ========== + +void ExpressionEngine::autoResetFunVars() { + if (fun_vars_need_reset_) { + fun_vars_.refresh_fun_vars(true, &mm_vars_); + fun_vars_need_reset_ = false; + } +} + +void ExpressionEngine::markFunVarsNeedReset() { + fun_vars_need_reset_ = true; +} + +void ExpressionEngine::forceResetFunVars() { + fun_vars_.refresh_fun_vars(true, &mm_vars_); + fun_vars_need_reset_ = false; } void ExpressionEngine::refreshFromMemory( @@ -142,5 +175,14 @@ void ExpressionEngine::refreshFromIhdRow( } void ExpressionEngine::refreshHoldVars() { - // stub — Task 5 will implement + for (auto& kv : hold_times_) { + mm_vars_[kv.first] = + static_cast(kv.second->update_value(mm_vars_[kv.second->tagi])); + } +} + +// ========== 调试 ========== + +void ExpressionEngine::printVars(const std::string& exp_str) { + // Debug method — prints all variables to LOG }