/*
 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:   ClassObject.cpp
 * Author: alain
 *
 * Created on March 24, 2019, 7:38 PM
 */
#include "SourceCompile/SymbolTable.h"
#include "Design/FileContent.h"
#include "ClassObject.h"

using namespace SURELOG;

ClassObject::~ClassObject() {}

bool ClassObject::setValue(std::string& property, Value* value) {
  PropertyValueMap::iterator itr = m_properties.find(property);
  if (itr == m_properties.end()) {
    Property* prop = m_class->getProperty(property);
    if (prop == NULL) {
      return false;
    }
    m_properties.insert(std::make_pair(property, std::make_pair(prop, value)));
  } else {
    (*itr).second.second = value;
  }
  return true;
}

Value* ClassObject::getValue(std::string& property) {
  PropertyValueMap::iterator itr = m_properties.find(property);
  if (itr == m_properties.end())
    return NULL;
  else
    return (*itr).second.second;
}
