/*
 Copyright 2019 Alain Dargelas

 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.
 */

/*
 * File:   ValuedComponentI.cpp
 * Author: alain
 *
 * Created on May 20, 2019, 21:03 PM
 */

#include <string>
#include "Expression/ExprBuilder.h"
#include "ValuedComponentI.h"

using namespace SURELOG;

Value* ValuedComponentI::getValue(std::string name) {
  std::map<std::string, Value*>::iterator itr = m_paramMap.find(name);
  if (itr == m_paramMap.end()) {
    if (m_parentScope) {
      return m_parentScope->getValue(name);
    } else
      return NULL;
  } else {
    return (*itr).second;
  }
}

void ValuedComponentI::setValue(std::string name, Value* val,
                                ExprBuilder& exprBuilder) {
  m_paramValues.push_back(val);
  std::map<std::string, Value*>::iterator itr = m_paramMap.find(name);
  if (itr == m_paramMap.end()) {
    m_paramMap.insert(std::make_pair(name, val));
  } else {
    exprBuilder.deleteValue((*itr).second);
    (*itr).second = val;
  }
}
