aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Highlighting/Xshd/XshdReference.cs
blob: 363cd881cb19f5293b7c5b781ffd10b38c95ee71 (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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)

using System;

namespace Tango.Scripting.Editors.Highlighting.Xshd
{
	/// <summary>
	/// A reference to an xshd color, or an inline xshd color.
	/// </summary>
	[Serializable]
	public struct XshdReference<T> : IEquatable<XshdReference<T>> where T : XshdElement
	{
		string referencedDefinition;
		string referencedElement;
		T inlineElement;
		
		/// <summary>
		/// Gets the reference.
		/// </summary>
		public string ReferencedDefinition {
			get { return referencedDefinition; }
		}
		
		/// <summary>
		/// Gets the reference.
		/// </summary>
		public string ReferencedElement {
			get { return referencedElement; }
		}
		
		/// <summary>
		/// Gets the inline element.
		/// </summary>
		public T InlineElement {
			get { return inlineElement; }
		}
		
		/// <summary>
		/// Creates a new XshdReference instance.
		/// </summary>
		public XshdReference(string referencedDefinition, string referencedElement)
		{
			if (referencedElement == null)
				throw new ArgumentNullException("referencedElement");
			this.referencedDefinition = referencedDefinition;
			this.referencedElement = referencedElement;
			this.inlineElement = null;
		}
		
		/// <summary>
		/// Creates a new XshdReference instance.
		/// </summary>
		public XshdReference(T inlineElement)
		{
			if (inlineElement == null)
				throw new ArgumentNullException("inlineElement");
			this.referencedDefinition = null;
			this.referencedElement = null;
			this.inlineElement = inlineElement;
		}
		
		/// <summary>
		/// Applies the visitor to the inline element, if there is any.
		/// </summary>
		public object AcceptVisitor(IXshdVisitor visitor)
		{
			if (inlineElement != null)
				return inlineElement.AcceptVisitor(visitor);
			else
				return null;
		}
		
		#region Equals and GetHashCode implementation
		// The code in this region is useful if you want to use this structure in collections.
		// If you don't need it, you can just remove the region and the ": IEquatable<XshdColorReference>" declaration.
		
		/// <inheritdoc/>
		public override bool Equals(object obj)
		{
			if (obj is XshdReference<T>)
				return Equals((XshdReference<T>)obj); // use Equals method below
			else
				return false;
		}
		
		/// <summary>
		/// Equality operator.
		/// </summary>
		public bool Equals(XshdReference<T> other)
		{
			// add comparisions for all members here
			return this.referencedDefinition == other.referencedDefinition
				&& this.referencedElement == other.referencedElement
				&& this.inlineElement == other.inlineElement;
		}
		
		/// <inheritdoc/>
		public override int GetHashCode()
		{
			// combine the hash codes of all members here (e.g. with XOR operator ^)
			return GetHashCode(referencedDefinition) ^ GetHashCode(referencedElement) ^ GetHashCode(inlineElement);
		}
		
		static int GetHashCode(object o)
		{
			return o != null ? o.GetHashCode() : 0;
		}
		
		/// <summary>
		/// Equality operator.
		/// </summary>
		public static bool operator ==(XshdReference<T> left, XshdReference<T> right)
		{
			return left.Equals(right);
		}
		
		/// <summary>
		/// Inequality operator.
		/// </summary>
		public static bool operator !=(XshdReference<T> left, XshdReference<T> right)
		{
			return !left.Equals(right);
		}
		#endregion
	}
}