AbstractTaskFactory::LegalPointVector
AbstractTaskFactory::getValidFinishTypes() const
{
  LegalPointVector v;
  v.insert(v.end(), m_finish_types.begin(), m_finish_types.end());
  return v;
}
AbstractTaskFactory::LegalPointVector
AbstractTaskFactory::getValidIntermediateTypes() const
{
  LegalPointVector v;
  v.insert(v.end(), m_intermediate_types.begin(), m_intermediate_types.end());
  return v;
}
AbstractTaskFactory::LegalPointVector 
AbstractTaskFactory::getValidTypes(unsigned position) const
{
  LegalPointVector v;
  if (validAbstractType(POINT_START, position))
    v.insert(v.end(), m_start_types.begin(), m_start_types.end());

  LegalPointVector i = getValidIntermediateTypes(position);
  if (!i.empty())
    v.insert(v.end(), i.begin(), i.end());

  if (validAbstractType(POINT_FINISH, position))
    v.insert(v.end(), m_finish_types.begin(), m_finish_types.end());

  return v;
}
AbstractTaskFactory::LegalPointVector
AbstractTaskFactory::getValidStartTypes() const
{
  LegalPointVector v;
  v.insert(v.end(), m_start_types.begin(), m_start_types.end());
  return v;
}
AbstractTaskFactory::LegalPointVector 
AbstractTaskFactory::getValidIntermediateTypes(unsigned position) const
{
  LegalPointVector v;

  if (!is_position_intermediate(position))
    return v;

  if (get_ordered_task_behaviour().homogeneous_tps 
      && (position>1) && (m_task.task_size()>1)) {
    LegalPointType_t type = getType(*m_task.get_tp(1));
    if (validIntermediateType(type)) {
      v.push_back(type);
      return v;
    }
  }
  if (validAbstractType(POINT_AAT, position) ||
      validAbstractType(POINT_AST, position))
    v.insert(v.end(), m_intermediate_types.begin(), m_intermediate_types.end());
  return v;
}