Merge pull request #820 from brendanzagaeski/master
[mono.git] / mcs / class / Microsoft.Build.Framework / Microsoft.Build.Framework / BuildEventContext.cs
1 using System;
2
3
4 namespace Microsoft.Build.Framework
5 {
6         [Serializable]
7         public class BuildEventContext
8         {
9                 static readonly Random rnd = new Random ();
10
11                 public static BuildEventContext Invalid = new BuildEventContext (
12                         InvalidSubmissionId,
13                         InvalidNodeId,
14                         InvalidProjectInstanceId,
15                         InvalidTargetId,
16                         InvalidProjectContextId,
17                         InvalidTaskId);
18
19                 internal static BuildEventContext NewInstance ()
20                 {
21                         return new BuildEventContext (rnd.Next (), rnd.Next (), rnd.Next (), rnd.Next ());
22                 }
23
24                 public BuildEventContext (int nodeId, int targetId, int projectContextId, int taskId)
25                         : this (nodeId, rnd.Next (), targetId, projectContextId, taskId)
26                 {
27                 }
28
29                 public BuildEventContext (int nodeId, int projectInstanceId, int targetId, int projectContextId, int taskId)
30                         : this (rnd.Next (), nodeId, projectInstanceId, targetId, projectContextId, taskId)
31                 {
32                 }
33
34                 public BuildEventContext (int submissionId, int nodeId, int projectInstanceId, int targetId, int projectContextId, int taskId)
35                 {
36                         SubmissionId = submissionId;
37                         NodeId = nodeId;
38                         ProjectInstanceId = projectInstanceId;
39                         TargetId = targetId;
40                         ProjectContextId = projectContextId;
41                         TaskId = taskId;
42                 }
43
44                 public const int InvalidSubmissionId = -1;
45                 public const int InvalidNodeId = -2;
46                 public const int InvalidProjectInstanceId = -1;
47                 public const int InvalidTargetId = -1;
48                 public const int InvalidProjectContextId = -2;
49                 public const int InvalidTaskId = -1;
50
51                 public int SubmissionId { get; private set; }
52                 public int NodeId { get; private set; }
53                 public int ProjectInstanceId { get; private set; }
54                 public int TargetId { get; private set; }
55                 public int ProjectContextId { get; private set; }
56                 public int TaskId { get; private set; }
57
58                 // MSDN document says "true if the references are equal, false otherwise." but that doesn't make sense.
59                 public override bool Equals (object other)
60                 {
61                         var o = other as BuildEventContext;
62                         return (object) o != null &&
63                                 o.NodeId == NodeId &&
64                                 o.ProjectContextId == ProjectContextId &&
65                                 o.ProjectInstanceId == ProjectInstanceId &&
66                                 o.SubmissionId == SubmissionId &&
67                                 o.TargetId == TargetId &&
68                                 o.TaskId == TaskId;
69                 }
70
71                 public override int GetHashCode ()
72                 {
73                         return
74                                 (NodeId << 5) +
75                                 (ProjectContextId << 4) +
76                                 (ProjectInstanceId << 3) +
77                                 (SubmissionId << 2) +
78                                 (TargetId << 1) +
79                                 TaskId;
80                 }
81
82                 public static bool operator == (BuildEventContext left, BuildEventContext right)
83                 {
84                         return (object) left == null ? (object)right == null : left.Equals (right);
85                 }
86
87                 public static bool operator != (BuildEventContext left, BuildEventContext right)
88                 {
89                         return (object) left == null ? (object)right != null : !left.Equals (right);
90                 }
91         }
92 }
93
94