This repository has been archived by the owner on Feb 8, 2018. It is now read-only.
/
TargetArrayType.cs
129 lines (107 loc) · 2.48 KB
/
TargetArrayType.cs
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
128
129
using System;
using System.Text;
namespace Mono.Debugger.Languages
{
public class TargetArrayBounds
{
public int Rank {
get;
private set;
}
public bool IsMultiDimensional {
get;
private set;
}
int? length;
public bool IsUnbound {
get { return !IsMultiDimensional && (length == null); }
}
public int Length {
get {
if (IsMultiDimensional || IsUnbound)
throw new InvalidOperationException ();
return (int) length;
}
}
public int[] LowerBounds {
get;
private set;
}
public int[] UpperBounds {
get;
private set;
}
private TargetArrayBounds ()
{ }
public static TargetArrayBounds MakeSimpleArray (int length)
{
TargetArrayBounds bounds = new TargetArrayBounds { Rank = 1 };
bounds.length = length;
return bounds;
}
public static TargetArrayBounds MakeUnboundArray ()
{
return new TargetArrayBounds { Rank = 1 };
}
public static TargetArrayBounds MakeMultiArray (int[] lower, int[] upper)
{
return new TargetArrayBounds {
Rank = lower.Length, IsMultiDimensional = true,
LowerBounds = lower, UpperBounds = upper
};
}
public override string ToString ()
{
if (IsUnbound)
return "TargetArrayBounds (<unbound>)";
else if (length != null)
return String.Format ("TargetArrayBounds ({0})", (int) length);
else {
StringBuilder sb = new StringBuilder ();
sb.Append ("TargetArrayBounds (");
for (int i = 0; i < Rank; i++) {
if (i > 0)
sb.Append (",");
sb.Append (String.Format ("[{0},{1}]", LowerBounds [i],
UpperBounds [i]));
}
sb.Append (")");
return sb.ToString ();
}
}
}
public abstract class TargetArrayType : TargetType
{
TargetType element_type;
string full_name;
int rank;
protected TargetArrayType (TargetType element_type, int rank)
: base (element_type.Language, TargetObjectKind.Array)
{
this.element_type = element_type;
this.rank = rank;
full_name = compute_fullname ();
}
public int Rank {
get { return rank; }
}
public TargetType ElementType {
get { return element_type; }
}
public override bool ContainsGenericParameters {
get { return ElementType.ContainsGenericParameters; }
}
public override string Name {
get { return full_name; }
}
string compute_fullname ()
{
string rank_specifier;
if (Rank == 1)
rank_specifier = "[]";
else
rank_specifier = "[" + new String (',', Rank-1) + "]";
return element_type.Name + rank_specifier;
}
}
}