source: tests/array-container/array-sbscr-types.cfa@ a8e8c67

ADT ast-experimental
Last change on this file since a8e8c67 was a5e26821, checked in by Michael Brooks <mlbrooks@…>, 3 years ago

Improve new-array subscripting to cover missing cases.

Missing cases include acknowledging a[0] and a[1] as required uses; therefore, give them
special overloads. Add comments to explain why.

Missing cases include test coverage of these overloads (where tests actually fail when an overload
is missing). Perhaps surprisingly, you need to use a lot of features at the same time for the need
for several overloads to obtain; make test coverage go there.

Also, switch thesis's demo of mutidimensional transposing/slicing to use (improved) libcfa ar
(pseudo-)trait, in place of former ix trait. Therefore, also port this demo to new array
syntax. (No changes to thesis discussion around this demo yet; these are still pending.) All
in, cause this thesis demo to be runnable again.

  • Property mode set to 100644
File size: 5.7 KB
Line 
1#include <containers/array.hfa>
2
3// Shows support for many required ways a user can index into a new array.
4//
5// A successful run of this test on 32 bit is necessary, before concluding
6// that a relevant change has good quality. Even though the test has no
7// differentiated 64/32-bit versions.
8//
9// Repetition, within this test, beween indexing directly into an `array(...)`
10// and indexing into a `A`, as in `forall(A...|ar(A...))`, represents indexing
11// into a (statically programmer-known) contiguous view, and a (potentially)
12// noncontiguous view, respectively. Users obtain noncontiguous views by
13// slicing or transposing higher-dimensional arrays. The limited uses of
14// `a[..., all, ...]` within this test create such situations. Working via
15// the `ar` trait is the first of two ways that users depend on the array
16// implementation tunneling subscript operators through the CFA assertion
17// system.
18//
19// This test uses the `a[i,j]` form for subscriping higher-dimensional arrays,
20// which is the "new" form, compared with the C-style `a[i][j]` form. The
21// "new" subscripting form is the second of two ways that users depend on the
22// array implementation tunneling subscript operators through the CFA
23// assertion system.
24//
25// This test covers types and syntactic forms that can convey a numeric value
26// to `a[-]` or `a[-,-,-]`. The array-md-sbscr-cases test covers combinations
27// of `a[i][j,k]` vs `a[i,j,k]` and `a[all,3][42]` vs `a[42,3]`, though
28// generally using ptrdiff_t-typed variables to convey numeric values.
29
30
31#define show( expr ) printf( "%.1f\n", expr )
32
33#define singleDimTestBody(testName) { \
34 \
35 printf(testName "\n\n"); \
36 \
37 assert( 3 < N ); \
38 \
39 show( a[i1] ); \
40 show( a[i2] ); \
41 printf("\n"); \
42 \
43 for( i_dynbounded; N ) show( a[i_dynbounded] ); \
44 printf("\n"); \
45 \
46 for( i_stabounded; 4 ) show( a[i_stabounded] ); \
47 printf("\n"); \
48}
49
50forall( [N] )
51void test_common_arg_types(array(float, N) & a, ptrdiff_t i1, size_t i2)
52 singleDimTestBody("Simple array")
53
54forall( [N], A& | ar(A, float, N) )
55void test_common_arg_types__via_trait(A & a, ptrdiff_t i1, size_t i2)
56 singleDimTestBody("Via trait")
57
58void do1dimTest() {
59 array(float, 5) a;
60 a[0] = 100.0;
61 a[1] = 100.1;
62 a[2] = 100.2;
63 a[3] = 100.3;
64 a[4] = 100.4;
65
66 test_common_arg_types(a, 3, 3);
67 test_common_arg_types__via_trait(a, 3, 3);
68}
69
70#define multiDimTestBody(testName) { \
71 \
72 printf(testName "\n\n"); \
73 \
74 assert( 3 < M ); \
75 assert( 3 < N ); \
76 \
77 show(( a[x1,x1] )); \
78 show(( a[x1,x2] )); \
79 show(( a[x2,x1] )); \
80 show(( a[x2,x2] )); \
81 printf("\n"); \
82 \
83 for( i_dynbounded; M ) show(( a[i_dynbounded, 3] )); \
84 printf("\n"); \
85 \
86 for( i_stabounded; 4 ) show(( a[i_stabounded, 3] )); \
87 printf("\n"); \
88 \
89 for( j_dynbounded; N ) show(( a[3, j_dynbounded] )); \
90 printf("\n"); \
91 \
92 for( j_stabounded; 4 ) show(( a[3, j_stabounded] )); \
93 printf("\n"); \
94}
95
96forall( [M], [N] )
97void test_common_arg_types__md(array(float, M, N) & a, ptrdiff_t x1, size_t x2)
98 multiDimTestBody("Simple array, multidim")
99
100
101forall( [M], [N], A_outer &, A_inner & | ar(A_outer, A_inner, M) | ar(A_inner, float, N) )
102void test_common_arg_types__md__via_trait(A_outer & a, ptrdiff_t x1, size_t x2)
103 multiDimTestBody("Via trait, multidim")
104
105
106void doMdimTest() {
107
108 array(float, 5, 4) b;
109 b[ix0,ix0] = 0.0; b[ix0,1] = 0.1; b[ix0,2] = 0.2; b[ix0,3] = 0.3;
110 b[ 1,ix0] = 1.0; b[ 1,1] = 1.1; b[ 1,2] = 1.2; b[ 1,3] = 1.3;
111 b[ 2,ix0] = 2.0; b[ 2,1] = 2.1; b[ 2,2] = 2.2; b[ 2,3] = 2.3;
112 b[ 3,ix0] = 3.0; b[ 3,1] = 3.1; b[ 3,2] = 3.2; b[ 3,3] = 3.3;
113 b[ 4,ix0] = 4.0; b[ 4,1] = 4.1; b[ 4,2] = 4.2; b[ 4,3] = 4.3;
114
115 test_common_arg_types__md(b, 3, 3);
116 test_common_arg_types__md__via_trait(b, 3, 3);
117 printf("Transposed, ");
118 test_common_arg_types__md__via_trait(b[all], 3, 3);
119
120 printf("Slice giving ");
121 test_common_arg_types(b[2], 3, 3);
122
123 printf("Same slice ");
124 test_common_arg_types__via_trait(b[2], 3, 3);
125
126 printf("Strided slice ");
127 test_common_arg_types__via_trait(b[all,2], 3, 3);
128}
129
130int main() {
131
132 // can't be inlined in same func due to Trac #175.
133 do1dimTest();
134 doMdimTest();
135}
Note: See TracBrowser for help on using the repository browser.