csharpfftfsharpintegrationinterpolationlinear-algebramathdifferentiationmatrixnumericsrandomregressionstatisticsmathnet
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
3.5 KiB
89 lines
3.5 KiB
//==========================================================================
|
|
// (c) Microsoft Corporation 2005-2008.
|
|
//
|
|
//===========================================================================
|
|
|
|
#if INTERNALIZED_POWER_PACK
|
|
module (* internal *) Internal.Utilities.Hashtbl
|
|
open Internal.Utilities.Collections
|
|
#else
|
|
module Microsoft.FSharp.Compatibility.OCaml.Hashtbl
|
|
open Microsoft.FSharp.Collections
|
|
#endif
|
|
|
|
open Microsoft.FSharp.Core
|
|
open System.Collections.Generic
|
|
open System.IO
|
|
|
|
type HashTable<'Key,'Val> = HashMultiMap<'Key,'Val>
|
|
type ('Key,'Val) t = HashMultiMap<'Key,'Val>
|
|
|
|
let inline create (n:int) = HashMultiMap.Create n
|
|
|
|
let add (t:HashMultiMap<'Key,'Val>) x y = t.Add(x,y)
|
|
let of_list (l : _ list) =
|
|
let t = create (List.length l) in
|
|
List.iter (fun (x,y) -> add t x y) l;
|
|
t
|
|
|
|
let of_seq (l:seq<_>) =
|
|
let arr = Array.of_seq l in
|
|
let t = create (Array.length arr) in Array.iter (fun (x,y) -> add t x y) arr;
|
|
t
|
|
|
|
let copy (t:HashMultiMap<'Key,'Val>) = t.Copy()
|
|
let find (t:HashMultiMap<'Key,'Val>) x = t.[x]
|
|
let tryfind (t:HashMultiMap<'Key,'Val>) x = t.TryFind x
|
|
let find_all (t:HashMultiMap<'Key,'Val>) x = t.FindAll x
|
|
let mem (t:HashMultiMap<'Key,'Val>) x = t.ContainsKey x
|
|
let remove (t:HashMultiMap<'Key,'Val>) x = t.Remove x
|
|
let replace (t:HashMultiMap<'Key,'Val>) x y = t.Replace(x,y)
|
|
let fold f (t:HashMultiMap<'Key,'Val>) c = t.Fold f c
|
|
let clear (t:HashMultiMap<'Key,'Val>) = t.Clear ()
|
|
let iter f (t:HashMultiMap<'Key,'Val>) = t.Iterate f
|
|
|
|
let hash x = LanguagePrimitives.GenericHash x
|
|
let hashq x = LanguagePrimitives.PhysicalHash x
|
|
|
|
#if INTERNALIZED_POWER_PACK
|
|
#else
|
|
|
|
// Componentized Hash Tables
|
|
type Provider<'Key,'Val,'Tag>
|
|
when 'Tag :> IEqualityComparer<'Key> =
|
|
interface
|
|
abstract create : int -> Tagged.HashMultiMap<'Key,'Val,'Tag>;
|
|
abstract clear : Tagged.HashMultiMap<'Key,'Val,'Tag> -> unit;
|
|
abstract add : Tagged.HashMultiMap<'Key,'Val,'Tag> -> 'Key -> 'Val -> unit;
|
|
abstract copy : Tagged.HashMultiMap<'Key,'Val,'Tag> -> Tagged.HashMultiMap<'Key,'Val,'Tag>;
|
|
abstract find : Tagged.HashMultiMap<'Key,'Val,'Tag> -> 'Key -> 'Val;
|
|
abstract find_all: Tagged.HashMultiMap<'Key,'Val,'Tag> -> 'Key -> 'Val list;
|
|
abstract tryfind : Tagged.HashMultiMap<'Key,'Val,'Tag> -> 'Key -> 'Val option;
|
|
abstract mem : Tagged.HashMultiMap<'Key,'Val,'Tag> -> 'Key -> bool;
|
|
abstract remove : Tagged.HashMultiMap<'Key,'Val,'Tag> -> 'Key -> unit;
|
|
abstract replace : Tagged.HashMultiMap<'Key,'Val,'Tag> -> 'Key -> 'Val -> unit;
|
|
abstract iter : ('Key -> 'Val -> unit) -> Tagged.HashMultiMap<'Key,'Val,'Tag> -> unit;
|
|
abstract fold : ('Key -> 'Val -> 'State -> 'State) -> Tagged.HashMultiMap<'Key,'Val,'Tag> -> 'State -> 'State;
|
|
|
|
end
|
|
|
|
type Provider<'Key,'Val> = Provider<'Key,'Val,IEqualityComparer<'Key>>
|
|
|
|
let MakeTagged (ops : 'Tag) : Provider<'Key,'Val,'Tag> when 'Tag :> IEqualityComparer<'Key> =
|
|
{ new Provider<_,_,_> with
|
|
member p.create n = Tagged.HashMultiMap<'Key,'Val,'Tag>.Create(ops,n);
|
|
member p.clear c = c.Clear();
|
|
member p.add c x y = c.Add(x,y);
|
|
member p.copy c = c.Copy();
|
|
member p.find c x = c.[x];
|
|
member p.find_all c x = c.FindAll(x);
|
|
member p.tryfind c x = c.TryFind(x);
|
|
member p.mem c x = c.ContainsKey(x);
|
|
member p.remove c x = c.Remove(x);
|
|
member p.replace c x y = c.Replace(x,y);
|
|
member p.iter f c = c.Iterate(f);
|
|
member p.fold f c acc = c.Fold f acc; }
|
|
|
|
let Make (hash,eq) = MakeTagged (HashIdentity.FromFunctions hash eq)
|
|
#endif
|
|
|
|
|