Changeset a5e2682
- Timestamp:
- Oct 21, 2022, 12:13:25 PM (2 years ago)
- Branches:
- ADT, ast-experimental, master
- Children:
- 9e042d8
- Parents:
- 8bd886e
- Files:
-
- 2 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/theses/mike_brooks_MMath/programs/hello-md.cfa
r8bd886e ra5e2682 1 1 #include "array.hfa" 2 3 4 trait ix( C &, E &, ztype(N) ) {5 E & ?[?]( C &, ptrdiff_t );6 void __taglen( tag(C), tag(N) );7 };8 9 forall( ztype(Zn), ztype(S), Timmed &, Tbase & )10 void __taglen( tag(arpk(Zn, S, Timmed, Tbase)), tag(Zn) ) {}11 2 12 3 … … 38 29 39 30 40 forall( ztype( N ) ) 31 32 33 34 35 36 37 38 39 40 forall( [N] ) 41 41 void print1d_cstyle( array(float, N) & c ); 42 42 43 forall( C &, ztype( N ) | ix( C, float, N ) )43 forall( [N], C & | ar( C, float, N ) ) 44 44 void print1d( C & c ); 45 45 … … 58 58 59 59 60 forall( ztype( N ))60 forall( [N] ) 61 61 void print1d_cstyle( array(float, N) & c ) { 62 for( i; z(N)) {62 for( i; N ) { 63 63 printf("%.1f ", c[i]); 64 64 } … … 78 78 79 79 80 forall( C &, ztype( N ) | ix( C, float, N ) )80 forall( [N], C & | ar( C, float, N ) ) 81 81 void print1d( C & c ) { 82 for( i; z(N)) {82 for( i; N ) { 83 83 printf("%.1f ", c[i]); 84 84 } … … 99 99 100 100 101 void fill( array(float, Z(5), Z(7)) & a ) {101 void fill( array(float, 5, 7) & a ) { 102 102 for ( i; (ptrdiff_t) 5 ) { 103 103 for ( j; 7 ) { 104 a[ [i,j]] = 1.0 * i + 0.1 * j;105 printf("%.1f ", a[ [i,j]]);104 a[i,j] = 1.0 * i + 0.1 * j; 105 printf("%.1f ", a[i,j]); 106 106 } 107 107 printf("\n"); … … 118 118 119 119 120 array( float, Z(5), Z(7)) a;120 array( float, 5, 7 ) a; 121 121 fill(a); 122 122 /* … … 148 148 149 149 150 print1d( a[ [ 2, all ]] ); // 2.0 2.1 2.2 2.3 2.4 2.5 2.6151 print1d( a[ [ all, 3 ]] ); // 0.3 1.3 2.3 3.3 4.3150 print1d( a[ 2, all ] ); // 2.0 2.1 2.2 2.3 2.4 2.5 2.6 151 print1d( a[ all, 3 ] ); // 0.3 1.3 2.3 3.3 4.3 152 152 153 153 154 154 155 print1d_cstyle( a[ [ 2, all ]] );155 print1d_cstyle( a[ 2, all ] ); 156 156 157 157 … … 161 161 162 162 163 #ifdef SHOW ERR1163 #ifdef SHOW_ERROR_1 164 164 165 print1d_cstyle( a[ [ all, 2 ]] ); // bad165 print1d_cstyle( a[ all, 2 ] ); // bad 166 166 167 167 #endif -
libcfa/src/containers/array.hfa
r8bd886e ra5e2682 1 #pragma once 2 1 3 #include <assert.h> 2 4 … … 18 20 // About the choice of integral types offered as subscript overloads: 19 21 // Intent is to cover these use cases: 22 // a[0] // i : zero_t 23 // a[1] // i : one_t 24 // a[2] // i : int 20 25 // float foo( ptrdiff_t i ) { return a[i]; } // i : ptrdiff_t 26 // float foo( size_t i ) { return a[i]; } // i : size_t 21 27 // forall( [N] ) ... for( i; N ) { total += a[i]; } // i : typeof( sizeof(42) ) 22 28 // for( i; 5 ) { total += a[i]; } // i : int 29 // 23 30 // It gets complicated by: 24 31 // - CFA does overloading on concrete types, like int and unsigned int, not on typedefed … … 28 35 // should give them type size_t. 29 36 // 30 // gcc -m32 cfa -m32 given bug gcc -m64 37 // gcc -m32 cfa -m32 given bug gcc -m64 (and cfa) 31 38 // ptrdiff_t int int long int 32 39 // size_t unsigned int unsigned int unsigned long int 33 40 // typeof( sizeof(42) ) unsigned int unsigned long int unsigned long int 34 41 // int int int int 42 // 43 // So the solution must support types {zero_t, one_t, int, unsigned int, long int, unsigned long int} 44 // 45 // The solution cannot rely on implicit conversions (e.g. just have one overload for ptrdiff_t) 46 // because assertion satisfaction requires types to match exacly. Both higher-dimensional 47 // subscripting and operations on slices use asserted subscript operators. The test case 48 // array-container/array-sbscr-cases covers the combinations. Mike beleives that commenting out 49 // any of the current overloads leads to one of those cases failing, either on 64- or 32-bit. 50 // Mike is open to being shown a smaller set of overloads that still passes the test. 51 52 static inline Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, zero_t ) { 53 assert( 0 < N ); 54 return (Timmed &) a.strides[0]; 55 } 56 57 static inline Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, one_t ) { 58 assert( 1 < N ); 59 return (Timmed &) a.strides[1]; 60 } 35 61 36 62 static inline Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, int i ) { … … 77 103 return N; 78 104 } 105 106 static inline void __taglen( tag(arpk(N, S, Timmed, Tbase)), tag(N) ) {} 79 107 80 108 // workaround #226 (and array relevance thereof demonstrated in mike102/otype-slow-ndims.cfa) … … 156 184 #endif 157 185 186 // Available for users to work around Trac #265 187 // If `a[...0...]` isn't working, try `a[...ix0...]` instead. 188 189 #define ix0 ((ptrdiff_t)0) 190 191 192 158 193 // 159 194 // Rotation … … 185 220 // 186 221 187 trait ar(A &, Tv &) { 188 Tv& ?[?]( A&, ptrdiff_t ); 189 size_t ?`len( A& ); 190 }; 222 // desired: 223 // trait ar(A &, Tv &, [N]) { 224 // Tv& ?[?]( A&, zero_t ); 225 // Tv& ?[?]( A&, one_t ); 226 // Tv& ?[?]( A&, int ); 227 // ... 228 // size_t ?`len( A& ); 229 // void __taglen( tag(C), tag(N) ); 230 // }; 231 232 // working around N's not being accepted as arguments to traits 233 234 #define ar(A, Tv, N) { \ 235 Tv& ?[?]( A&, zero_t ); \ 236 Tv& ?[?]( A&, one_t ); \ 237 Tv& ?[?]( A&, int ); \ 238 Tv& ?[?]( A&, unsigned int ); \ 239 Tv& ?[?]( A&, long int ); \ 240 Tv& ?[?]( A&, unsigned long int ); \ 241 size_t ?`len( A& ); \ 242 void __taglen( tag(A), tag(N) ); \ 243 } -
tests/array-container/array-basic.cfa
r8bd886e ra5e2682 78 78 } 79 79 80 forall( A & | ar(A, float) )80 forall( [N], A & | ar(A, float, N) ) 81 81 float total1d_hi( A & a ) { 82 82 float total = 0.0f; 83 for (i; a`len)83 for (i; N) 84 84 total += a[i]; 85 85 return total;
Note: See TracChangeset
for help on using the changeset viewer.