/** Go to the next entry in the table. \return Returns true if the iteration is done. **/ bool LuaStackTableIterator::Next() { // This function is only active if Reset() has been called head. luaplus_assert( IsValid() ); // This is a local helper variable so we don't waste space in the class // definition. LuaState* state = m_tableObj.GetState(); // Do any stack management operations. if ( m_autoStackManagement ) { state->SetTop( m_startStackIndex + 1 ); } else { // If this luaplus_assert fires, then you left something on the stack. luaplus_assert( state->GetTop() == m_startStackIndex + 1 ); } // Do the Lua table iteration. if ( state->Next( m_tableObj ) == 0 ) { // Invalidate the iterator. m_startStackIndex = -1; return false; } // The iterator is still valid. return true; }
/** Invalidates the iterator. Call this function if you early abort from an iteration loop (such as before it hits the end). **/ void LuaStackTableIterator::Invalidate() { // See if the iterator is already invalid. if ( !IsValid() ) return; // This is a local helper variable so we don't waste space in the class // definition. LuaState* state = m_tableObj.GetState(); if ( !m_autoStackManagement ) { luaplus_assert( state->GetTop() <= m_startStackIndex + 1 ); } // Set the stack back. state->SetTop( m_startStackIndex ); // Invalidate the iterator. m_startStackIndex = -1; }