Statistics
| Branch: | Revision:

root / trunk / Pithos.Client.WPF / Utils / Node.cs @ e0f69809

History | View | Annotate | Download (1.9 kB)

1
using System.Collections;
2
using System.Collections.Generic;
3
using Caliburn.Micro;
4

    
5
namespace Pithos.Client.WPF.Utils
6
{
7
    public class Node<T> : IEnumerable<Node<T>>
8
    {
9
        public string Path { get; set; }
10

    
11
        public T Data { get; set; }
12

    
13
        private List<Node<T>> _children = new List<Node<T>>();
14
        public List<Node<T>> Children
15
        {
16
            get { return _children; }
17
            set { _children = value; }
18
        }
19

    
20
        public IEnumerator<Node<T>> GetEnumerator()
21
        {
22
            yield return this;
23
            foreach (var children in _children)
24
                foreach (var info in children)
25
                {
26
                    yield return info;
27
                }
28
        }
29

    
30
        IEnumerator IEnumerable.GetEnumerator()
31
        {
32
            return GetEnumerator();
33
        }
34

    
35
        public override int GetHashCode()
36
        {
37
            return Path.GetHashCode();
38
        }
39

    
40
        public override bool Equals(object obj)
41
        {
42
            if (!(obj is Node<T>))
43
                return false;
44
            var other = (Node<T>) obj;
45
            if (Path != other.Path)
46
                return false;
47
            if (Data==null ^ other.Data==null)
48
                return false;
49
            
50
            if (Data!=null && !Data.Equals(other.Data))
51
                return false;
52
            var thisEnum=GetEnumerator();
53
            var otherEnum = other.GetEnumerator();
54
            //Skipt the first item, it is the current node itself
55
            thisEnum.MoveNext();
56
            otherEnum.MoveNext();
57
            while(true)
58
            {
59
                var thisMove=thisEnum.MoveNext();
60
                var otherMove=otherEnum.MoveNext();
61

    
62
                if (thisMove ^ otherMove)
63
                    return false;
64
                if (!thisMove)
65
                    return true;
66
                
67
                if (!thisEnum.Current.Equals(otherEnum.Current))
68
                    return false;
69
            }
70
        }
71
    }
72
}