const RegionDefine* RegionMapperImpl::getRegionDefine(const Region* region) const
{
  if (region == nullptr) {
    return nullptr;
  }
  const RegionDefine* rd = nullptr;
  if (region->getID() < regionDefinesVector.size()) {
    rd = regionDefinesVector.at(region->getID());
  }
  if (rd != nullptr) {
    return rd;
  }

  if (regionDefinesVector.size() < region->getID() + 1) {
    regionDefinesVector.resize(region->getID() * 2);
  }

  auto rd_new = regionDefines.find(region->getName());
  if (rd_new != regionDefines.end()) {
    regionDefinesVector.at(region->getID()) = rd_new->second;
    return rd_new->second;
  }

  if (region->getParent()) {
    rd = getRegionDefine(region->getParent());
    regionDefinesVector.at(region->getID()) = rd;
  }
  return rd;
}
const RegionDefine *RegionMapperImpl::getRegionDefine(const Region *region) const{
  if (region == null) return null;
  const RegionDefine *rd = null;
  if (region->getID() < regionDefinesVector.size())
    rd = regionDefinesVector.elementAt(region->getID());
  if (rd != null) return rd;

  if (regionDefinesVector.size() < region->getID()+1)
    regionDefinesVector.setSize(region->getID()*2);

  RegionDefine *rd_new = regionDefines.get(region->getName());
  if (rd_new != null){
    regionDefinesVector.setElementAt(rd_new, region->getID());
    return rd_new;
  };

  if (region->getParent()){
    rd = getRegionDefine(region->getParent());
    regionDefinesVector.setElementAt(rd, region->getID());
  };
  return rd;
};