Click here to Skip to main content
15,886,519 members
Articles / Programming Languages / C#

A .NET State Machine Toolkit - Part II

Rate me:
Please Sign up or sign in to vote.
4.80/5 (33 votes)
25 Oct 2006CPOL7 min read 207.5K   1.7K   132  
A detailed look at using the more advanced features of the .NET state machine toolkit.
/*
 * Created by: Leslie Sanford
 * 
 * Contact: jabberdabber@hotmail.com
 * 
 * Last modified: 08/25/2005
 */

using System;
using System.Collections;

namespace StateMachineToolkit
{
	/// <summary>
	/// Represents a collection of Transitions.
	/// </summary>
	public class TransitionCollection : ICollection
	{
        #region TransitionCollection Members

        #region Fields

        // The table of transitions.
        private ArrayList[] transitions;

        #endregion

        #region Construction

        /// <summary>
        /// Initializes a new instance of the TransitionCollection class with 
        /// the specified number of events.
        /// </summary>
        /// <param name="eventCount">
        /// The number of events for which the collection can hold events.
        /// </param>
		public TransitionCollection(int eventCount)
		{
            transitions = new ArrayList[eventCount];
        }

        #endregion

        #region Methods

        /// <summary>
        /// Adds a Transition to the collection for the specified event ID.
        /// </summary>
        /// <param name="eventID">
        /// The event ID associated with the Transition.
        /// </param>
        /// <param name="trans">
        /// The Transition to add.
        /// </param>
        /// <remarks>
        /// When a Transition is added to the collection, it is associated with
        /// the specified event ID. When a State receives an event, it looks up
        /// the event ID in its TransitionCollection to see if there are any 
        /// Transitions for the specified event. 
        /// </remarks>
        public void Add(int eventID, Transition trans)
        {
            #region Preconditions

            if(eventID < 0  || eventID >= transitions.Length)
            {
                throw new ArgumentOutOfRangeException(
                    "Event ID out of range.");
            }

            #endregion

            // If there are no Transitions for the specified event ID.
            if(transitions[eventID] == null)
            {
                // Create new list of Transitions for the specified event ID.
                transitions[eventID] = new ArrayList();
            }            

            // Add Transition.
            transitions[eventID].Add(trans);
        }

        /// <summary>
        /// Removes the specified Transition at the specified event ID.
        /// </summary>
        /// <param name="eventID">
        /// The event ID associated with the Transition.
        /// </param>
        /// <param name="trans">
        /// The Transition to remove.
        /// </param>
        public void Remove(int eventID, Transition trans)
        {
            #region Preconditions

            if(eventID < 0  || eventID >= transitions.Length)
            {
                throw new ArgumentOutOfRangeException(
                    "Event ID out of range.");
            }

            #endregion

            // If there are Transitions at the specified event ID.
            if(transitions[eventID] != null)
            {
                transitions[eventID].Remove(trans);

                // If there are no more Transitions at the specified event ID.
                if(transitions[eventID].Count == 0)
                {
                    // Indicate that there are no Transitions at this event ID.
                    transitions[eventID] = null;
                }
            }
        }

        #endregion

        #region Properties

        /// <summary>
        /// Gets a collection of Transitions at the specified event ID.
        /// </summary>
        /// <remarks>
        /// If there are no Transitions at the specified event ID, the value
        /// of the collection will be null.
        /// </remarks>
        public ICollection this[int eventID]
        {
            get
            {
                #region Preconditions

                if(eventID < 0  || eventID >= transitions.Length)
                {
                    throw new ArgumentOutOfRangeException(
                        "Event ID out of range.");
                }

                #endregion

                return transitions[eventID];
            }
        }

        #endregion

        #endregion

        #region ICollection Members

        /// <summary>
        /// Gets a value indicating whether or not the collection is 
        /// synchronized.
        /// </summary>
        public bool IsSynchronized
        {
            get
            {
                return false;
            }
        }

        /// <summary>
        /// Gets the number of transition tables in the collection.
        /// </summary>
        public int Count
        {
            get
            {
                return transitions.Length;
            }
        }

        /// <summary>
        /// Copies the elements of the collection to an Array, starting at a 
        /// particular Array index.
        /// </summary>
        /// <param name="array">
        /// The one-dimensional Array that is the destination of the elements 
        /// copied from ICollection. The Array must have zero-based indexing. 
        /// </param>
        /// <param name="index">
        /// The zero-based index in array at which copying begins. 
        /// </param>
        public void CopyTo(Array array, int index)
        {
            transitions.CopyTo(array, index);
        }

        /// <summary>
        /// Gets an object that can be used to synchronize access to the 
        /// collection.
        /// </summary>
        public object SyncRoot
        {
            get
            {
                return this;
            }
        }

        #endregion

        #region IEnumerable Members

        /// <summary>
        /// Returns an enumerator that can iterate through a collection.
        /// </summary>
        /// <returns>
        /// An enumerator that can iterate through a collection.
        /// </returns>
        public IEnumerator GetEnumerator()
        {
            return transitions.GetEnumerator();
        }

        #endregion
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
United States United States
Aside from dabbling in BASIC on his old Atari 1040ST years ago, Leslie's programming experience didn't really begin until he discovered the Internet in the late 90s. There he found a treasure trove of information about two of his favorite interests: MIDI and sound synthesis.

After spending a good deal of time calculating formulas he found on the Internet for creating new sounds by hand, he decided that an easier way would be to program the computer to do the work for him. This led him to learn C. He discovered that beyond using programming as a tool for synthesizing sound, he loved programming in and of itself.

Eventually he taught himself C++ and C#, and along the way he immersed himself in the ideas of object oriented programming. Like many of us, he gotten bitten by the design patterns bug and a copy of GOF is never far from his hands.

Now his primary interest is in creating a complete MIDI toolkit using the C# language. He hopes to create something that will become an indispensable tool for those wanting to write MIDI applications for the .NET framework.

Besides programming, his other interests are photography and playing his Les Paul guitars.

Comments and Discussions