source: tests/array-container/array-basic.cfa @ 65ef0cd

Last change on this file since 65ef0cd was a5e2682, checked in by Michael Brooks <mlbrooks@…>, 2 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: 3.6 KB
Line 
1#include <containers/array.hfa>
2
3//
4// Type-theory demo (success is "it compiles")
5//
6
7forall( [Nx], [Ny], [Nz] )
8void typesTest( tag(Nx), tag(Ny), tag(Nz) ) {
9
10    array( float, Nx, Ny, Nz )  xyz;
11
12    // numeric subscripts
13    ptrdiff_t ix = 1, iy = 2, iz = 3;
14    array( float, Ny, Nz ) & yz = xyz[ix];
15    array( float, Nz ) & z = xyz[ix][iy];
16    float & val = xyz[ix][iy][iz];
17
18    // deferral subscript
19    typeof( xyz[all] ) yzx = xyz[all];
20
21    // longform check that -[all] gives intended type (user doesn't write this)
22    arpk( Ny
23        , array( float, Nz)
24        , arpk( Nz
25              , float
26              , arpk( Nx
27                    , array( float, Ny, Nz )
28                    , float
29                    , float
30                    )
31              , float
32              )
33        , float
34        )
35        & yzx_long = xyz[all];
36    & yzx_long = & yzx;
37    & yzx  = & yzx_long;
38}
39
40//
41// Runtime demo
42//
43
44#include <assert.h>
45
46float getMagicNumber( ptrdiff_t w, ptrdiff_t x, ptrdiff_t y, ptrdiff_t z ) {
47
48    assert( 0 <= w && w < 3 );
49    assert( 0 <= x && x < 4 );
50    assert( 0 <= y && y < 5 );
51    assert( 0 <= z && z < 6 );
52
53    float ww = (2.0f \ w) / 1.0f;
54    float xx = (2.0f \ x) / 100.0f;
55    float yy = (2.0f \ y) / 10000.0f;
56    float Nz = (2.0f \ z) / 1000000.0f;
57
58    return ww+xx+yy+Nz;
59}
60
61forall( [Nw], [Nx], [Ny], [Nz] )
62void fillHelloData( array( float, Nw, Nx, Ny, Nz ) & wxyz ) {
63    for (w; Nw)
64    for (x; Nx)
65    for (y; Ny)
66    for (z; Nz)
67        wxyz[w][x][y][z] = getMagicNumber(w, x, y, z);
68}
69
70forall( [N]
71      , S & | sized(S)
72      )
73float total1d_low( arpk(N, S, float, float ) & a ) {
74    float total = 0.0f;
75    for (i; N)
76        total += a[i];
77    return total;
78}
79
80forall( [N], A & | ar(A, float, N) )
81float total1d_hi( A & a ) {
82    float total = 0.0f;
83    for (i; N)
84        total += a[i];
85    return total;
86}
87
88forall( [Nw], [Nx], [Ny], [Nz] )
89void runtimeTest( tag(Nw), tag(Nx), tag(Ny), tag(Nz) ) {
90
91    array( float, Nw, Nx, Ny, Nz ) wxyz;
92    fillHelloData(wxyz);
93
94    float expect, result;
95    ptrdiff_t slice_ix = 1;
96
97    // summing across W, with x=y=z=1
98
99    expect = 0;
100    for (i; Nw)
101        expect += getMagicNumber( i, slice_ix, slice_ix, slice_ix );
102    printf("expect Ws             = %f\n", expect);
103
104    result = total1d_low( wxyz[all][slice_ix][slice_ix][slice_ix] );
105    printf("result Ws [][][][] lo = %f\n", result);
106
107    result = total1d_low( wxyz[all, slice_ix, slice_ix, slice_ix] );
108    printf("result Ws [,,,]    lo = %f\n", result);
109
110    result = total1d_hi( wxyz[all][slice_ix][slice_ix][slice_ix] );
111    printf("result Ws [][][][] hi = %f\n", result);
112
113    result = total1d_hi( wxyz[all, slice_ix, slice_ix, slice_ix] );
114    printf("result Ws [,,,]    hi = %f\n", result);
115
116    // summing across X, with w=y=z=1
117
118    expect = 0;
119    for (i; Nx)
120        expect += getMagicNumber( slice_ix, i, slice_ix, slice_ix );
121    printf("expect Xs             = %f\n", expect);
122
123    result = total1d_low( wxyz[slice_ix][all][slice_ix][slice_ix] );   
124    printf("result Xs [][][][] lo = %f\n", result);
125
126    result = total1d_low( wxyz[slice_ix, all, slice_ix, slice_ix] );
127    printf("result Xs [,,,]    lo = %f\n", result);
128
129    result = total1d_hi( wxyz[slice_ix][all][slice_ix][slice_ix] );   
130    printf("result Xs [][][][] hi = %f\n", result);
131
132    result = total1d_hi( wxyz[slice_ix, all, slice_ix, slice_ix] );
133    printf("result Xs [,,,]    hi = %f\n", result);
134
135}
136
137const size_t  KW = 3,  KX = 4,  KY = 5,  KZ = 6;
138
139int main() {
140
141    typesTest  (           ztag(KX), ztag(KY), ztag(KZ) );
142    runtimeTest( ztag(KW), ztag(KX), ztag(KY), ztag(KZ) );
143}
Note: See TracBrowser for help on using the repository browser.