From 2b4ae7fde370bc3316ab30cc38b74d23e785b360 Mon Sep 17 00:00:00 2001 From: Kenji Hosokawa Date: Mon, 24 Aug 2020 21:58:42 +0900 Subject: First commit Signed-off-by: Kenji Hosokawa Change-Id: I381abb0a6521f5349768a76ef7ceecbce4b2d701 --- src/core/expression/RBAContentValue.cpp | 116 ++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 src/core/expression/RBAContentValue.cpp (limited to 'src/core/expression/RBAContentValue.cpp') diff --git a/src/core/expression/RBAContentValue.cpp b/src/core/expression/RBAContentValue.cpp new file mode 100644 index 0000000..23b1b20 --- /dev/null +++ b/src/core/expression/RBAContentValue.cpp @@ -0,0 +1,116 @@ +/** + * Copyright (c) 2019 DENSO CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * ContentValue class definition + */ + +#include +#include "RBAContentValue.hpp" +#include "RBAAllocatable.hpp" +#include "RBAContentState.hpp" +#include "RBAArbitrator.hpp" +#include "RBAExpressionVisitor.hpp" +#include "RBALogManager.hpp" +#include "RBAModelElementType.hpp" +#include "RBAConstraintInfo.hpp" + +namespace rba +{ + +void RBAContentValue::accept(RBAExpressionVisitor& visitor) +{ + // RBA SceneAllocatableCollector which is only existing vistor at this time + // does not accept the value of the content state. + // So this code doesn't work. + // + // But, leave this because another visitor may accept it in the future. + visitor.visit(*this); +} + +RBAModelElementType +RBAContentValue::getModelElementType() const +{ + return RBAModelElementType::ContentValue; +} + +std::int32_t +RBAContentValue::getValueCore(RBAConstraintInfo* info, RBAArbitrator* arb) const +{ + std::int32_t result { -99 }; + const auto leftInfo = info->getChild(0U); + const auto r = getLhsOperand()->getReferenceObject(leftInfo, arb); + const RBAContentState* cs { nullptr }; + if (leftInfo->isExceptionBeforeArbitrate()) { + info->setExceptionBeforeArbitrate(true); + } else { + if (r != nullptr) { + const auto a = dynamic_cast(r->getRawObject()); + if (a != nullptr) { + if (r->isPrevious()) { + cs = arb->getResult()->getDirectPreContentState(a); + if (cs != nullptr) { + result = cs->getContentStatePriority(); + } + } else { + info->addOperandAllocatable(a); + if (a->isChecked()) { + cs = a->getState(); + if (cs != nullptr) { + result = cs->getContentStatePriority(); + } + } else { + // Throw an Exception if arbitration is not over + info->setExceptionBeforeArbitrate(true); + } + } + } + } + } +#ifdef RBA_USE_LOG + std::string pre; + std::string aName = "NULL"; + std::string resultText = "no Content skip"; + if (r != nullptr) { + aName = r->getElementName(); + pre = getPreMsg(r->isPrevious()); + } + if (info->isExceptionBeforeArbitrate()) { + resultText = "before arbitrate skip"; + } else { + if (cs != nullptr) { + resultText = cs->getOwner()->getElementName() + "::" + cs->getElementName() + " : " + cs->getPriorityString(); + } + } + LOG_arbitrateConstraintLogicLogLine( + " " + + pre + + "Allocatable[" + + aName + + "] has Content Priority [" + + resultText + + "]"); + #endif + return result; +} +#ifdef RBA_USE_LOG +const std::string +RBAContentValue::getSymbol() const +{ + return ".contentValue()"; +} +#endif +} -- cgit 1.2.3-korg