1program tarrconstr5; 2 3{$mode objfpc}{$H+} 4 5type 6 TSet = set of (One, Two, Three); 7 8 TLongIntArray = array of LongInt; 9 TLongIntArrayArray = array of TLongIntArray; 10 TSetArray =array of TSet; 11 TSetArrayArray = array of TSetArray; 12 TStringArray = array of String; 13 TStringArrayArray = array of TStringArray; 14 TStringArrayArray2 = specialize TArray<specialize TArray<String>>; 15 16var 17 code: LongInt = 1; 18 19procedure CheckLongInt(aActual, aExpected: array of LongInt); 20var 21 i: LongInt; 22begin 23 if Length(aActual) <> Length(aExpected) then 24 Halt(code); 25 Inc(code); 26 for i := Low(aActual) to High(aActual) do 27 if aActual[i] <> aExpected[i] then 28 Halt(code); 29 Inc(code); 30end; 31 32procedure CheckLongInt(aActual, aExpected: array of TLongIntArray); 33var 34 i: LongInt; 35begin 36 if Length(aActual) <> Length(aExpected) then 37 Halt(code); 38 Inc(code); 39 for i := Low(aActual) to High(aActual) do 40 CheckLongInt(aActual[i], aExpected[i]); 41end; 42 43procedure CheckSet(aActual, aExpected: array of TSet); 44var 45 i: LongInt; 46begin 47 if Length(aActual) <> Length(aExpected) then 48 Halt(code); 49 Inc(code); 50 for i := Low(aActual) to High(aActual) do 51 if aActual[i] <> aExpected[i] then 52 Halt(code); 53 Inc(code); 54end; 55 56procedure CheckSet(aActual, aExpected: array of TSetArray); 57var 58 i: LongInt; 59begin 60 if Length(aActual) <> Length(aExpected) then 61 Halt(code); 62 Inc(code); 63 for i := Low(aActual) to High(aActual) do 64 CheckSet(aActual[i], aExpected[i]); 65end; 66 67procedure CheckString(aActual, aExpected: array of String); 68var 69 i: LongInt; 70begin 71 if Length(aActual) <> Length(aExpected) then 72 Halt(code); 73 Inc(code); 74 for i := Low(aActual) to High(aActual) do 75 if aActual[i] <> aExpected[i] then 76 Halt(code); 77 Inc(code); 78end; 79 80procedure CheckString(aActual, aExpected: array of TStringArray); 81var 82 i: LongInt; 83begin 84 if Length(aActual) <> Length(aExpected) then 85 Halt(code); 86 Inc(code); 87 for i := Low(aActual) to High(aActual) do 88 CheckString(aActual[i], aExpected[i]); 89end; 90 91var 92 la1: TLongIntArray; 93 la2: array of LongInt; 94 la3: specialize TArray<LongInt>; 95 laa1: TLongIntArrayArray; 96 laa2: array of TLongIntArray; 97 laa3: array of array of LongInt; 98 sa1: TSetArray; 99 sa2: array of TSet; 100 sa3: specialize TArray<TSet>; 101 saa1: array of TSetArray; 102 saa2: TSetArrayArray; 103 stra1: TStringArray; 104 stra2: array of String; 105 stra3: specialize TArray<String>; 106 straa1: array of TStringArray; 107 straa2: TStringArrayArray; 108 straa3: specialize TArray<TStringArray>; 109 straa4: specialize TArray<specialize TArray<String>>; 110begin 111 la1 := []; 112 CheckLongInt(la1, []); 113 114 laa1 := [[]]; 115 CheckLongInt(laa1, [[]]); 116 CheckLongInt(laa1, [nil]); 117 118 laa1 := [nil]; 119 CheckLongInt(laa1, [[]]); 120 CheckLongInt(laa1, [nil]); 121 122 laa1 := [[], nil]; 123 CheckLongInt(laa1, [[], nil]); 124 CheckLongInt(laa1, [[], []]); 125 CheckLongInt(laa1, [nil, nil]); 126 CheckLongInt(laa1, [nil, []]); 127 128 laa1 := [nil, nil]; 129 CheckLongInt(laa1, [nil, nil]); 130 CheckLongInt(laa1, [[], []]); 131 CheckLongInt(laa1, [nil, []]); 132 CheckLongInt(laa1, [[], nil]); 133 134 laa1 := [[], []]; 135 CheckLongInt(laa1, [[], []]); 136 CheckLongInt(laa1, [nil, nil]); 137 CheckLongInt(laa1, [nil, []]); 138 CheckLongInt(laa1, [[], nil]); 139 140 laa1 := [nil, [], nil]; 141 CheckLongInt(laa1, [nil, [], nil]); 142 CheckLongInt(laa1, [nil, nil, nil]); 143 CheckLongInt(laa1, [[], [], []]); 144 CheckLongInt(laa1, [[], nil, []]); 145 146 la1 := [1, 3, 5]; 147 CheckLongInt(la1, [1, 3, 5]); 148 149 la2 := [2, 4, 6]; 150 CheckLongInt(la2, [2, 4, 6]); 151 152 la3 := [5, 6, 7, 8]; 153 CheckLongInt(la3, [5, 6, 7, 8]); 154 155 laa1 := [la1, la2]; 156 CheckLongInt(laa1, [la1, la2]); 157 158 laa2 := [la2, la1]; 159 CheckLongInt(laa2, [la2, la1]); 160 161 laa3 := [la1, la3]; 162 CheckLongInt(laa3, [la1, la3]); 163 164 laa1 := [[1, 3, 5], [2, 4, 6], [1, 3, 5]]; 165 CheckLongInt(laa1, [la1, la2, la1]); 166 167 laa2 := [[2, 4, 6], [1, 3, 5], [5, 6, 7, 8]]; 168 CheckLongInt(laa2, [la2, la1, la3]); 169 170 laa3 := [[5, 6, 7, 8]]; 171 CheckLongInt(laa3, [la3]); 172 173 laa3 := [[], [], []]; 174 CheckLongInt(laa3, [nil, nil, nil]); 175 176 sa1 := [[]]; 177 CheckSet(sa1, [[]]); 178 179 sa1 := [[], []]; 180 CheckSet(sa1, [[], []]); 181 182 saa1 := [[[]]]; 183 CheckSet(saa1, [[[]]]); 184 185 saa1 := [nil]; 186 CheckSet(saa1, [nil]); 187 188 saa1 := [[]]; 189 CheckSet(saa1, [[]]); 190 191 sa1 := [[One], [Two, Three]]; 192 sa2 := [[]]; 193 sa3 := [[Three], []]; 194 195 saa1 := [[[One], [Two, Three]], [[]], [[Three], []]]; 196 CheckSet(saa1, [sa1, sa2, sa3]); 197 198 sa1 := [[Two], [Three]]; 199 sa2 := [[One]]; 200 201 saa2 := [[[Two], [Three]], [[One]]]; 202 CheckSet(saa2, [sa1, sa2]); 203 204 stra1 := ['Hello', 'World']; 205 CheckString(stra1, ['Hello', 'World']); 206 207 stra2 := ['Hello']; 208 CheckString(stra2, ['Hello']); 209 210 stra3 := []; 211 CheckString(stra3, []); 212 213 stra1 := ['Hello']; 214 stra2 := ['World']; 215 216 straa1 := [['Hello'], ['World']]; 217 CheckString(straa1, [stra1, stra2]); 218 219 stra1 := ['Hello', 'FPC']; 220 stra2 := []; 221 stra3 := ['World']; 222 223 straa2 := [['Hello', 'FPC'], [], ['World']]; 224 CheckString(straa2, [stra1, stra2, stra3]); 225 226 straa3 := [[], ['World'], ['Hello', 'FPC']]; 227 CheckString(straa3, [stra2, stra3, stra1]); 228 229 straa4 := [['World'], ['World']]; 230 CheckString(straa4, [stra3, stra3]); 231 232 Writeln('ok'); 233end. 234