From 3f8e571b7887758514645c46b2b26d7c3fc82e45 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Mon, 18 Jul 2011 02:01:12 +0100 Subject: Use a standard generic system stack for the undo/redo stacks instead of our own homebrew. system stack also uses an array, so no performance penalty. Also exposes undo count and adds a test assertion for correct undo count after resize --- OpenSim/Framework/UndoStack.cs | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'OpenSim/Framework/UndoStack.cs') diff --git a/OpenSim/Framework/UndoStack.cs b/OpenSim/Framework/UndoStack.cs index fde63b1..8f8849d 100644 --- a/OpenSim/Framework/UndoStack.cs +++ b/OpenSim/Framework/UndoStack.cs @@ -45,59 +45,96 @@ namespace OpenSim.Framework m_Undos = new T[capacity + 1]; } + /// + /// Is the stack full? + /// public bool IsFull { - get { return m_new == m_old; } + get + { + // If the old and new pointers are in the same place then all stack slots are occupied. + return m_new == m_old; + } } + /// + /// Capacity of the stack. + /// public int Capacity { get { return m_Undos.Length - 1; } } + /// + /// Return the number of undos on the stack. + /// public int Count { get { int count = m_new - m_old - 1; + if (count < 0) count += m_Undos.Length; + return count; } } + /// + /// Push a new undo onto the stack. + /// + /// public void Push(T item) { if (IsFull) { m_old++; + if (m_old >= m_Undos.Length) m_old -= m_Undos.Length; } + if (++m_new >= m_Undos.Length) m_new -= m_Undos.Length; + m_Undos[m_new] = item; } + /// + /// Pop and item from the top of the undo stack. + /// + /// public T Pop() { if (Count > 0) { T deleted = m_Undos[m_new]; m_Undos[m_new--] = default(T); + if (m_new < 0) m_new += m_Undos.Length; + return deleted; } else + { throw new InvalidOperationException("Cannot pop from empty stack"); + } } + /// + /// Peek at the undo on the top of the stack. + /// + /// public T Peek() { return m_Undos[m_new]; } + /// + /// Clear the stack. + /// public void Clear() { if (Count > 0) @@ -106,6 +143,7 @@ namespace OpenSim.Framework { m_Undos[i] = default(T); } + m_new = 1; m_old = 0; } -- cgit v1.1 From aec3b58a5775b70de278c950f300a0f7e6787ec2 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Mon, 18 Jul 2011 02:06:06 +0100 Subject: use standard sdk stack in terrain model rather than OpenSim.Framework.UndoStack. remove OpenSim.Framework.UndoStack --- OpenSim/Framework/UndoStack.cs | 152 ----------------------------------------- 1 file changed, 152 deletions(-) delete mode 100644 OpenSim/Framework/UndoStack.cs (limited to 'OpenSim/Framework/UndoStack.cs') diff --git a/OpenSim/Framework/UndoStack.cs b/OpenSim/Framework/UndoStack.cs deleted file mode 100644 index 8f8849d..0000000 --- a/OpenSim/Framework/UndoStack.cs +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; - -namespace OpenSim.Framework -{ - /// - /// Undo stack. Deletes entries beyond a certain capacity - /// - /// - [Serializable] - public class UndoStack - { - private int m_new = 1; - private int m_old = 0; - private T[] m_Undos; - - public UndoStack(int capacity) - { - m_Undos = new T[capacity + 1]; - } - - /// - /// Is the stack full? - /// - public bool IsFull - { - get - { - // If the old and new pointers are in the same place then all stack slots are occupied. - return m_new == m_old; - } - } - - /// - /// Capacity of the stack. - /// - public int Capacity - { - get { return m_Undos.Length - 1; } - } - - /// - /// Return the number of undos on the stack. - /// - public int Count - { - get - { - int count = m_new - m_old - 1; - - if (count < 0) - count += m_Undos.Length; - - return count; - } - } - - /// - /// Push a new undo onto the stack. - /// - /// - public void Push(T item) - { - if (IsFull) - { - m_old++; - - if (m_old >= m_Undos.Length) - m_old -= m_Undos.Length; - } - - if (++m_new >= m_Undos.Length) - m_new -= m_Undos.Length; - - m_Undos[m_new] = item; - } - - /// - /// Pop and item from the top of the undo stack. - /// - /// - public T Pop() - { - if (Count > 0) - { - T deleted = m_Undos[m_new]; - m_Undos[m_new--] = default(T); - - if (m_new < 0) - m_new += m_Undos.Length; - - return deleted; - } - else - { - throw new InvalidOperationException("Cannot pop from empty stack"); - } - } - - /// - /// Peek at the undo on the top of the stack. - /// - /// - public T Peek() - { - return m_Undos[m_new]; - } - - /// - /// Clear the stack. - /// - public void Clear() - { - if (Count > 0) - { - for (int i = 0; i < m_Undos.Length; i++) - { - m_Undos[i] = default(T); - } - - m_new = 1; - m_old = 0; - } - } - } -} -- cgit v1.1