OrderedTaskPoint*
AbstractTaskFactory::createMutatedPoint(const OrderedTaskPoint &tp,
                                        const LegalPointType_t newtype) const
{
  fixed ozsize = GetOZSize(tp.get_oz());
  return createPoint(newtype, tp.GetWaypoint(), ozsize, ozsize, ozsize);
}
OrderedTaskPoint*
AbstractTaskFactory::CreateMutatedPoint(const OrderedTaskPoint &tp,
                                        const TaskPointFactoryType newtype) const
{
  auto ozsize = GetOZSize(tp.GetObservationZone());
  return CreatePoint(newtype, tp.GetWaypoint(), ozsize, ozsize, ozsize);
}
bool
AbstractTaskFactory::validateFAIOZs()
{
  clearValidationErrors();
  bool valid = true;

  for (unsigned i = 0; i < m_task.TaskSize() && valid; i++) {
    const OrderedTaskPoint *tp = m_task.get_tp(i);
    const fixed ozsize = GetOZSize(tp->get_oz());

    switch (getType(*tp)) {
    case  START_BGA:
    case  START_CYLINDER:
      valid = false;
      break;

    case  START_SECTOR:
      if (ozsize > fixed(1000.01))
        valid = false;

      break;
    case  START_LINE:
      if (ozsize > fixed(2000.01))
        valid = false;

      break;

    case  FAI_SECTOR:
      break;

    case  AST_CYLINDER:
      if (ozsize > fixed(500.01))
        valid = false;

      break;

    case  KEYHOLE_SECTOR:
    case  BGAFIXEDCOURSE_SECTOR:
    case  BGAENHANCEDOPTION_SECTOR:
    case  AAT_CYLINDER:
    case  AAT_SEGMENT:
    case  AAT_ANNULAR_SECTOR:
      valid = false;
      break;

    case  FINISH_SECTOR:
      break;
    case  FINISH_LINE:
      if (ozsize > fixed(2000.01))
        valid = false;

      break;

    case  FINISH_CYLINDER:
      valid = false;
      break;
    }
  }

  if (!valid)
    addValidationError(NON_FAI_OZS);

  return valid;
}
bool
AbstractTaskFactory::ValidateFAIOZs()
{
  ClearValidationErrors();
  bool valid = true;

  for (unsigned i = 0; i < task.TaskSize() && valid; i++) {
    const auto &tp = task.GetPoint(i);
    const auto ozsize = GetOZSize(tp.GetObservationZone());

    switch (GetType(tp)) {
    case TaskPointFactoryType::START_BGA:
    case TaskPointFactoryType::START_CYLINDER:
      valid = false;
      break;

    case TaskPointFactoryType::START_SECTOR:
      if (ozsize > fixed(1000.01))
        valid = false;

      break;
    case TaskPointFactoryType::START_LINE:
      if (ozsize > fixed(2000.01))
        valid = false;

      break;

    case TaskPointFactoryType::FAI_SECTOR:
      break;

    case TaskPointFactoryType::AST_CYLINDER:
      if (ozsize > fixed(500.01))
        valid = false;

      break;

    case TaskPointFactoryType::KEYHOLE_SECTOR:
    case TaskPointFactoryType::BGAFIXEDCOURSE_SECTOR:
    case TaskPointFactoryType::BGAENHANCEDOPTION_SECTOR:
    case TaskPointFactoryType::MAT_CYLINDER:
    case TaskPointFactoryType::AAT_CYLINDER:
    case TaskPointFactoryType::AAT_SEGMENT:
    case TaskPointFactoryType::AAT_ANNULAR_SECTOR:
    case TaskPointFactoryType::AAT_KEYHOLE:
    case TaskPointFactoryType::SYMMETRIC_QUADRANT:
      valid = false;
      break;

    case TaskPointFactoryType::FINISH_SECTOR:
      break;
    case TaskPointFactoryType::FINISH_LINE:
      if (ozsize > fixed(2000.01))
        valid = false;

      break;

    case TaskPointFactoryType::FINISH_CYLINDER:
      valid = false;
      break;

    case TaskPointFactoryType::COUNT:
      gcc_unreachable();
    }
  }

  if (!valid)
    AddValidationError(TaskValidationErrorType::NON_FAI_OZS);

  return valid;
}