//-----------------------------------------------------------------------------
//
// Copyright (C) Microsoft Corporation. All Rights Reserved.
//
//-----------------------------------------------------------------------------
namespace Microsoft.AbstractInterpretationFramework.Collections
{
using System.Collections;
using Microsoft.Contracts;
///
/// Extend sets for using as a IWorkList.
///
public class WorkSet : Microsoft.Boogie.Set, Microsoft.Boogie.IWorkList
{
// See Bug #148 for an explanation of why this is here.
// Without it, the contract inheritance rules will complain since it
// has nowhere to attach the out-of-band contract it gets from
// ICollection.Count that it gets from IWorkList.
public override int Count { get { return base.Count; } }
[Pure] public bool IsEmpty()
{
return Count == 0;
}
///
/// Pull an element out of the workset.
///
public object Pull()
{
IEnumerator iter = GetEnumerator();
iter.MoveNext();
object result = (!)iter.Current;
Remove(result);
return result;
}
bool Microsoft.Boogie.IWorkList.Add(object o){
if (o == null) throw new System.ArgumentNullException();
this.Add(o);
return true;
}
bool Microsoft.Boogie.IWorkList.AddAll(IEnumerable objs){
if (objs == null) throw new System.ArgumentNullException();
return this.AddAll(objs);
}
// ICollection members
public void CopyTo (System.Array! a, int i) {
if (this.Count > a.Length - i) throw new System.ArgumentException();
int j = i;
foreach(object o in this){
a.SetValue(o, j++);
}
return;
}
object! ICollection.SyncRoot { [Pure] get { return this; } }
public bool IsSynchronized { get { return false; } }
}
}
namespace Microsoft.AbstractInterpretationFramework.Collections.Generic
{
using System.Collections.Generic;
public class HashMultiset
{
private readonly IDictionary! dict;
//invariant forall{KeyValuePair entry in dict; entry.Value >= 1};
public HashMultiset()
{
this.dict = new Dictionary();
// base();
}
public HashMultiset(int size)
{
this.dict = new Dictionary(size);
// base();
}
public void Add(T t)
{ expose (this) {
if (dict.ContainsKey(t))
{
dict[t] = dict[t] + 1;
}
else
{
dict.Add(t,1);
}
}}
public void Remove(T t)
{
if (dict.ContainsKey(t))
{ expose (this) {
int count = dict[t];
if (count == 1) { dict.Remove(t); }
else { dict[t] = count - 1; }
}}
}
public bool Contains(T t)
{
return dict.ContainsKey(t);
}
}
}