Unordered Array

loop.collection.UnorderedArray


Class of objects that store a sequence of values as a Lua array but removes the elements from any position without shifting the following elements. However it does not guarantee the order the values are stored in the array. This class is useful for storing efficiently a sequence of values that may be iterated in any order and the number of elements varies constantly during interation.

Behaves like an ordinary Lua array but provides an operation that removes an element at given position by replacing it with the last element of the array and then frees the last position.

Behavior

Methods

add(value)
Adds value value to the end of the array. Equivalent to self[#self + 1] = element.
remove(index)
Replaces the element at position index with the last element of the array and frees the last position. If index is out of the array bounds then the call has no effect.

Examples

Scheduler of independent threads (i.e., does not interact with each other).

local oo             = require "loop.simple"
local UnorderedArray = require "loop.collection.UnorderedArray"

Scheduler = oo.class({}, UnorderedArray)

function Scheduler:run()
  while #self > 0 do
    local i = 1
    repeat
      local thread = self[i]
      coroutine.resume(thread)
      if coroutine.status(thread) == "dead" then
        self:remove(i)
      else
        i = i + 1
      end
    until i > #self
  end
end



function thread(name)
  return coroutine.create(function()
    for i=1, 3 do
      print(string.format("%s: add '%s'", name, name..i))
      scheduler:add(coroutine.create(function()
        for step=1, 3 do
          print(string.format("%s: step %d of 3", name..i, step))
          coroutine.yield()
        end
      end))
    end
  end)
end

scheduler = Scheduler{ thread("A"), thread("B"), thread("C") }
scheduler:run()

Copyright (C) 2004-2008 Tecgraf, PUC-Rio

This project is currently being maintained by Tecgraf at PUC-Rio.