boost::optional<IddObject> IddFileAndFactoryWrapper::getObject(IddObjectType objectType) const {

  OptionalIddObject result;

  if (objectType == IddObjectType::UserCustom) {
    LOG(Info,"Asked to return IddObject of type IddObjectType::UserCustom. Since "
        << "UserCustom object types are generally not unique, returning false rather than "
        << "an IddObject. Please specify a different IddObjectType, or use "
        << "getObject(const std::string&).");
    return result;
  }

  if (m_iddFile) {
    result = m_iddFile->getObject(objectType);
  }
  else if (m_iddFileType) {
    if (isInFile(objectType)) {
      result = IddFactory::instance().getObject(objectType);
    }
  }
  else {
    LOG_AND_THROW("Invalid IddFactoryWrapper has no IddFile set.");
  }

  return result;
}
boost::optional<IddObject> IddFileAndFactoryWrapper::getObject(const std::string& objectName) const {
  OptionalIddObject result;

  if (m_iddFile) {
    result = m_iddFile->getObject(objectName);
  }
  else if (m_iddFileType) {
    OptionalIddObject candidate = IddFactory::instance().getObject(objectName);
    if (candidate) {
      if (isInFile(candidate->type())) {
        result = candidate;
      }
    }
  }
  else {
    LOG_AND_THROW("Invalid IddFactoryWrapper has no IddFile set.");
  }

  return result;
}
// File, Rank のどちらかがおかしいかも知れない時は、
// こちらを使う。
// こちらの方が遅いが、どんな File, Rank にも対応している。
inline bool isInSquare(const File f, const Rank r) {
	return isInFile(f) && isInRank(r);
}