Listing 2: MultiFor.cpp Multiple for loop class


#include "stdafx.h"    // uses MFC
#include "MultiFor.h"

// Add a for loop
// the loop is used as if it is implemented
// for (i=start; i<end; i++)
void CMultiFor::Add(int start, int end)
{
    // this class assumes that counters increment
    ASSERT( end >= start );
    m_start.Add( start );
    m_end.Add( end );
}

// Initialise the constructs
void CMultiFor::Initialize()
{
    m_current.SetSize( Count() );
    for (int i=0; i<Count(); i++) {
        m_current[i] = m_start[i];
        }
}

int CMultiFor::Index( int i )
{
    // check for invalid conditions
    if (i > m_current.GetUpperBound()) {
        ASSERT(FALSE);
        return -1;
        }

    // have we called Initialize?
    ASSERT( m_current.GetSize() == Count() );

    return m_current[i];
}

BOOL CMultiFor::CarryOn()
{
    // just in case we are called with no entries
    if (Count()==0)
        return FALSE;
    // have we called Initialize?
    ASSERT( m_current.GetSize() == Count() );
    return ( m_current[0] < m_end[0] );
}

void CMultiFor::Increment()
{
    // have we called Initialize?
    ASSERT( m_current.GetSize() == Count() );
    // loop over the array of loop indices
    // starting from the last one added
    int position = m_current.GetUpperBound();
    for (;;) {
        m_current[position]++;
        if (m_current[position] < m_end[position])
            break; // no need to go to the next loop index
        if (position==0)
            break; // terminating condition reached
        // reset this index, and start on the previous one
        m_current[position] = m_start[position];
        position--; 
        }
}
//End of File