[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Dotgnu-pnet-commits] CVS: pnetlib/System/Collections/Specialized ListDi
From: |
Rhys Weatherley <address@hidden> |
Subject: |
[Dotgnu-pnet-commits] CVS: pnetlib/System/Collections/Specialized ListDictionary.cs,NONE,1.1 |
Date: |
Thu, 14 Nov 2002 23:33:07 -0500 |
Update of /cvsroot/dotgnu-pnet/pnetlib/System/Collections/Specialized
In directory subversions:/tmp/cvs-serv11335/System/Collections/Specialized
Added Files:
ListDictionary.cs
Log Message:
Implement the "System.CodeDom" namespace.
--- NEW FILE ---
/*
* ListDictionary.cs - Implementation of
* "System.Collections.Specialized.ListDictionary".
*
* Copyright (C) 2002 Southern Storm Software, Pty Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
namespace System.Collections.Specialized
{
#if !ECMA_COMPAT
using System;
using System.Collections;
public class ListDictionary : IDictionary, ICollection, IEnumerable
{
// Internal state.
private IComparer comparer;
private ListStorage list;
private int count;
private int generation;
// Constructors.
public ListDictionary() : this(null) {}
public ListDictionary(IComparer comparer)
{
if(comparer != null)
{
this.comparer = comparer;
}
else
{
this.comparer = Comparer.Default;
}
this.list = null;
this.count = 0;
this.generation = 0;
}
// Implement the IDictionary interface.
public void Add(Object key, Object value)
{
if(key == null)
{
throw new ArgumentNullException("key");
}
ListStorage current = list;
ListStorage prev = null;
while(current != null)
{
if(comparer.Compare(current.key, key)
== 0)
{
throw new
ArgumentException(S._("Arg_ExistingEntry"));
}
prev = current;
current = current.next;
}
if(prev != null)
{
prev.next = new ListStorage(key, value);
}
else
{
list = new ListStorage(key, value);
}
++count;
++generation;
}
public void Clear()
{
list = null;
count = 0;
++generation;
}
public bool Contains(Object key)
{
ListStorage current = list;
while(current != null)
{
if(comparer.Compare(current.key, key)
== 0)
{
return true;
}
current = current.next;
}
return false;
}
public IDictionaryEnumerator GetEnumerator()
{
return new ListEnumerator(this);
}
public void Remove(Object key)
{
ListStorage current = list;
ListStorage prev = null;
while(current != null)
{
if(comparer.Compare(current.key, key)
== 0)
{
if(prev != null)
{
prev.next =
current.next;
}
else
{
list = current.next;
}
--count;
++generation;
return;
}
prev = current;
current = current.next;
}
}
public bool IsFixedSize
{
get
{
return false;
}
}
public bool IsReadOnly
{
get
{
return false;
}
}
public Object this[Object key]
{
get
{
ListStorage current = list;
while(current != null)
{
if(comparer.Compare(current.key, key) == 0)
{
return current.value;
}
current = current.next;
}
return null;
}
set
{
Add(key, value);
}
}
public ICollection Keys
{
get
{
return new ListMemberCollection(this,
true);
}
}
public ICollection Values
{
get
{
return new ListMemberCollection(this,
false);
}
}
// Implement the ICollection interface.
public void CopyTo(Array array, int index)
{
if(array == null)
{
throw new
ArgumentNullException("array");
}
else if(array.Rank != 1)
{
throw new
ArgumentException(S._("Arg_RankMustBe1"));
}
else if(index < array.GetLowerBound(0))
{
throw new ArgumentOutOfRangeException
("index",
S._("Arg_InvalidArrayIndex"));
}
else if(index > (array.GetLength(0) - count))
{
throw new
ArgumentException(S._("Arg_InvalidArrayRange"));
}
else
{
ListStorage current = list;
while(current != null)
{
array.SetValue
(new
DictionaryEntry(current.key,
current.value),
index++);
current = current.next;
}
}
}
public int Count
{
get
{
return count;
}
}
public bool IsSynchronized
{
get
{
return false;
}
}
public Object SyncRoot
{
get
{
return this;
}
}
// Implement the IEnumerable interface.
IEnumerator IEnumerable.GetEnumerator()
{
return new ListEnumerator(this);
}
// Storage node for the dictionary.
private sealed class ListStorage
{
// Accessible state.
public ListStorage next;
public Object key;
public Object value;
// Constructor.
public ListStorage(Object key, Object value)
{
this.next = null;
this.key = key;
this.value = value;
}
}; // class ListStorage
// Enumerator for this list.
private class ListEnumerator : IDictionaryEnumerator
{
// Internal state.
private ListDictionary list;
private int generation;
private ListStorage current;
private bool atEnd;
// Constructor.
public ListEnumerator(ListDictionary list)
{
this.list = list;
this.generation = list.generation;
this.current = null;
this.atEnd = false;
}
// Implement the IEnumerator interface.
public bool MoveNext()
{
if(generation != this.generation)
{
throw new
InvalidOperationException
(S._("Invalid_CollectionModified"));
}
if(atEnd)
{
return false;
}
else if(current == null)
{
current = list.list;
}
else
{
current = current.next;
}
atEnd = (current == null);
return !atEnd;
}
public void Reset()
{
if(generation != this.generation)
{
throw new
InvalidOperationException
(S._("Invalid_CollectionModified"));
}
current = null;
atEnd = false;
}
public virtual Object Current
{
get
{
return (Object)Entry;
}
}
// Implement the IDictionaryEnumerator interface.
public DictionaryEntry Entry
{
get
{
if(generation !=
this.generation)
{
throw new
InvalidOperationException
(S._("Invalid_CollectionModified"));
}
if(current == null)
{
throw new
InvalidOperationException
(S._("Invalid_BadEnumeratorPosition"));
}
return new
DictionaryEntry(current.key, current.value);
}
}
public Object Key
{
get
{
if(generation !=
this.generation)
{
throw new
InvalidOperationException
(S._("Invalid_CollectionModified"));
}
if(current == null)
{
throw new
InvalidOperationException
(S._("Invalid_BadEnumeratorPosition"));
}
return current.key;
}
}
public Object Value
{
get
{
if(generation !=
this.generation)
{
throw new
InvalidOperationException
(S._("Invalid_CollectionModified"));
}
if(current == null)
{
throw new
InvalidOperationException
(S._("Invalid_BadEnumeratorPosition"));
}
return current.value;
}
}
}; // ListEnumerator
// Private collection class for accessing keys and values.
private sealed class ListMemberCollection : ICollection, IEnumerable
{
// Internal state.
private ListDictionary list;
private bool wantKeys;
// Constructor.
public ListMemberCollection(ListDictionary list, bool wantKeys)
{
this.list = list;
this.wantKeys = wantKeys;
}
// Implement the ICollection interface.
public void CopyTo(Array array, int index)
{
if(array == null)
{
throw new
ArgumentNullException("array");
}
else if(array.Rank != 1)
{
throw new
ArgumentException(S._("Arg_RankMustBe1"));
}
else if(index < array.GetLowerBound(0))
{
throw new
ArgumentOutOfRangeException
("index",
S._("Arg_InvalidArrayIndex"));
}
else if(index > (array.GetLength(0) -
list.Count))
{
throw new ArgumentException
(S._("Arg_InvalidArrayRange"));
}
else
{
ListStorage current = list.list;
while(current != null)
{
if(wantKeys)
{
array.SetValue(current.key, index++);
}
else
{
array.SetValue(current.value, index++);
}
current = current.next;
}
}
}
public int Count
{
get
{
return list.Count;
}
}
public bool IsSynchronized
{
get
{
return list.IsSynchronized;
}
}
public Object SyncRoot
{
get
{
return list.SyncRoot;
}
}
// Implement the IEnumerable interface.
public IEnumerator GetEnumerator()
{
return new ListMemberEnumerator(list,
wantKeys);
}
}; // ListMemberCollection
// Enumerate over a ListMemberCollection.
private sealed class ListMemberEnumerator : ListEnumerator
{
// Internal state.
private bool wantKeys;
// Constructor.
public ListMemberEnumerator(ListDictionary list, bool wantKeys)
: base(list)
{
this.wantKeys = wantKeys;
}
// Override enumerator methods from the base class.
public override Object Current
{
get
{
if(wantKeys)
{
return Entry.Key;
}
else
{
return Entry.Value;
}
}
}
}; // ListMemberEnumerator
}; // class ListDictionary
#endif // !ECMA_COMPAT
}; // namespace System.Collections.Specialized
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Dotgnu-pnet-commits] CVS: pnetlib/System/Collections/Specialized ListDictionary.cs,NONE,1.1,
Rhys Weatherley <address@hidden> <=
- Prev by Date:
[Dotgnu-pnet-commits] CVS: pnetlib ChangeLog,1.443,1.444
- Next by Date:
[Dotgnu-pnet-commits] CVS: pnetlib/System/CodeDom CodeArrayCreateExpression.cs,NONE,1.1 CodeAttachEventStatement.cs,NONE,1.1 CodeBinaryOperatorType.cs,NONE,1.1 CodeCastExpression.cs,NONE,1.1 CodeCatchClause.cs,NONE,1.1 CodeCommentStatement.cs,NONE,1.1 CodeConditionStatement.cs,NONE,1.1 CodeMemberEvent.cs,NONE,1.1 CodeMemberField.cs,NONE,1.1 CodeMemberMethod.cs,NONE,1.1 CodeMethodInvokeExpression.cs,NONE,1.1 CodeNamespace.cs,NONE,1.1 CodeNamespaceImport.cs,NONE,1.1 CodeNamespaceImportCollection.cs,NONE,1.1 CodeObject.cs,NONE,1.1 CodeObjectCreateExpression.cs,NONE,1.1 CodeParameterDeclarationExpression.cs,NONE,1.1 CodeRemoveEventStatement.cs,NONE,1.1 CodeSnippetCompileUnit.cs,NONE,1.1 CodeTypeDeclaration.cs,NONE,1.1 CodeTypeDelegate.cs,NONE,1.1 CodeTypeMember.cs,NONE,1.1 CodeTypeOfExpression.cs,NONE,1.1 CodeTypeReference.cs,NONE,1.1 CodeTypeReferenceExpression.cs,NONE,1.1 CodeVariableDeclarationStatement.cs,NONE,1.1 FieldDirection.cs,NONE,1.1 Makefile,NONE,1.1 MemberAttributes.cs,NONE,1.1 README,NONE,1.1 RuleOutput.cs,NONE,1.1 gencdom.c,1.1,1.2 rules.txt,1.2,1.3
- Previous by thread:
[Dotgnu-pnet-commits] CVS: pnetlib ChangeLog,1.443,1.444
- Next by thread:
[Dotgnu-pnet-commits] CVS: pnetlib/System/CodeDom CodeArrayCreateExpression.cs,NONE,1.1 CodeAttachEventStatement.cs,NONE,1.1 CodeBinaryOperatorType.cs,NONE,1.1 CodeCastExpression.cs,NONE,1.1 CodeCatchClause.cs,NONE,1.1 CodeCommentStatement.cs,NONE,1.1 CodeConditionStatement.cs,NONE,1.1 CodeMemberEvent.cs,NONE,1.1 CodeMemberField.cs,NONE,1.1 CodeMemberMethod.cs,NONE,1.1 CodeMethodInvokeExpression.cs,NONE,1.1 CodeNamespace.cs,NONE,1.1 CodeNamespaceImport.cs,NONE,1.1 CodeNamespaceImportCollection.cs,NONE,1.1 CodeObject.cs,NONE,1.1 CodeObjectCreateExpression.cs,NONE,1.1 CodeParameterDeclarationExpression.cs,NONE,1.1 CodeRemoveEventStatement.cs,NONE,1.1 CodeSnippetCompileUnit.cs,NONE,1.1 CodeTypeDeclaration.cs,NONE,1.1 CodeTypeDelegate.cs,NONE,1.1 CodeTypeMember.cs,NONE,1.1 CodeTypeOfExpression.cs,NONE,1.1 CodeTypeReference.cs,NONE,1.1 CodeTypeReferenceExpression.cs,NONE,1.1 CodeVariableDeclarationStatement.cs,NONE,1.1 FieldDirection.cs,NONE,1.1 Makefile,NONE,1.1 MemberAttributes.cs,NONE,1.1 README,NONE,1.1 RuleOutput.cs,NONE,1.1 gencdom.c,1.1,1.2 rules.txt,1.2,1.3
- Index(es):