summaryrefslogtreecommitdiff
path: root/src/cli/runtime/APersistentMap.cs
blob: 8c082d236d0b99885547e6d61ad45196a3b87e93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/**
 *   Copyright (c) Rich Hickey. All rights reserved.
 *   The use and distribution terms for this software are covered by the
 *   Common Public License 1.0 (http://opensource.org/licenses/cpl.php)
 *   which can be found in the file CPL.TXT at the root of this distribution.
 *   By using this software in any fashion, you are agreeing to be bound by
 * 	 the terms of this license.
 *   You must not remove this notice, or any other, from this software.
 **/

using System;
using System.Threading;
using System.Collections;

namespace clojure.lang
{
public abstract class APersistentMap : Obj, IPersistentMap{
	int _hash = -1;

	public override Obj withMeta(IPersistentMap meta)
		{
		if(_meta == meta)
			return this;
		Obj ret = (Obj)MemberwiseClone();
		ret._meta = meta;
		return ret;
		}

override public bool Equals(Object obj) {
    IPersistentMap m = obj as IPersistentMap;
    if(obj == null)
        return false;
        
    if(m.count() != count())
        return false;

    for(ISeq s = seq();s!=null;s = s.rest())
        {
        IMapEntry e = (IMapEntry) s.first();
        IMapEntry me = m.find(e.key());

        if(me == null || !RT.equal(e.val(),me.val()))
            return false;
        }

    return true;
}

override public int GetHashCode() {
    if(_hash == -1)
        {
        int hash = count();
        for(ISeq s = seq();s!=null;s = s.rest())
            {
            IMapEntry e = (IMapEntry) s.first();
            hash ^= RT.hashCombine(RT.hash(e.key()), RT.hash(e.val()));
            }
        this._hash = hash;
        }
    return _hash;
}
	#region IPersistentMap Members

	abstract public IPersistentMap assocEx(object key, object val);


	abstract public IPersistentMap without(object key);



	#endregion

	#region Associative Members

	abstract public bool contains(object key);

	abstract public IMapEntry find(object key);

	abstract public object get(object key);

	abstract public Associative assoc(object key, object val);

	#endregion

	#region IEnumerable Members

	abstract public IEnumerator GetEnumerator();

	#endregion

	#region IPersistentCollection Members

	abstract public int count();

	abstract public ISeq seq();

	public IPersistentCollection cons(Object o)
		{
		IMapEntry e = (IMapEntry)o;
		return (IPersistentCollection)assoc(e.key(), e.val());
		}
		
	#endregion
	}

}