/*
** Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
**
** File: goallist.cpp
**
** Author:
**
** Description:
** Implementation of the training library "goallist" interface.
**
** History:
*/
#include "pch.h"
#include "GoalList.h"
namespace Training
{
//------------------------------------------------------------------------------
// class methods
//------------------------------------------------------------------------------
/* void */ GoalList::GoalList (void)
{
// This is done to be sure the goal list iterator is always valid.
m_iterator = m_goalList.end ();
}
//------------------------------------------------------------------------------
/* void */ GoalList::~GoalList (void)
{
// assume that no one else is managing the memory for these goals, and delete
// them myself.
for (m_iterator = m_goalList.begin (); m_iterator != m_goalList.end (); m_iterator++)
delete *m_iterator;
}
//------------------------------------------------------------------------------
bool GoalList::Start (void)
{
// Check to see if we are at the end of the list
while (m_iterator != m_goalList.end ())
{
// start the goal, and check whether or not it is complete
if ((*m_iterator)->Start () == Goal::c_GoalComplete)
{
// the goal is complete, so move to the next goal
m_iterator++;
}
else
{
// the goal is not complete, so return false
return Goal::c_GoalIncomplete;
}
}
// If we got here, then the goal list is complete.
return Goal::c_GoalComplete;
}
//------------------------------------------------------------------------------
void GoalList::Stop (void)
{
if (m_iterator != m_goalList.end ())
// stop the current goal in the list
(*m_iterator)->Stop ();
}
//------------------------------------------------------------------------------
bool GoalList::Evaluate (void)
{
// Check to see if we are at the end of the list
if (m_iterator != m_goalList.end ())
{
// evaluate the goal condition
if ((*m_iterator)->Evaluate () == true)
{
// the goal condition is true, meaning the current goal is complete.
// move to the next goal and return the result of starting it.
Stop ();
m_iterator++;
return Start ();
}
else
{
// the goal condition is false, meaning the current goal is not complete.
// return false to indicate this.
return Goal::c_GoalIncomplete;
}
}
// If we got here, then the goal list is complete.
return Goal::c_GoalComplete;
}
//------------------------------------------------------------------------------
void GoalList::AddGoal (Goal* pGoal)
{
// Store the goals in the order they are added. This gives the
// author some modicum of control over playback order.
m_goalList.push_back (pGoal);
// I'm being lazy and getting the list iterator at each addition.
// This saves having to have a separate method for saying we are
// done installing new goals and are ready to start traversal.
m_iterator = m_goalList.begin ();
}
//------------------------------------------------------------------------------
}