master
  1const math = @import("math.zig");
  2const imax = math.imax;
  3const imin = math.imin;
  4
  5fn accessSlice(comptime array: anytype) !void {
  6    var slice: []const @typeInfo(@TypeOf(array)).array.child = undefined;
  7    slice = &array;
  8    inline for (0.., &array) |ct_index, *elem| {
  9        var rt_index: usize = undefined;
 10        rt_index = ct_index;
 11        if (&(slice.ptr + ct_index)[0] != elem) return error.Unexpected;
 12        if (&(slice.ptr + rt_index)[0] != elem) return error.Unexpected;
 13        if (&slice.ptr[ct_index..][0] != elem) return error.Unexpected;
 14        if (&slice.ptr[rt_index..][0] != elem) return error.Unexpected;
 15        if (&slice.ptr[ct_index] != elem) return error.Unexpected;
 16        if (&slice.ptr[rt_index] != elem) return error.Unexpected;
 17        if (&slice[ct_index..].ptr[0] != elem) return error.Unexpected;
 18        if (&slice[rt_index..].ptr[0] != elem) return error.Unexpected;
 19        if (&slice[ct_index] != elem) return error.Unexpected;
 20        if (&slice[rt_index] != elem) return error.Unexpected;
 21        if (slice.ptr[ct_index] != elem.*) return error.Unexpected;
 22        if (slice.ptr[rt_index] != elem.*) return error.Unexpected;
 23        if (slice[ct_index] != elem.*) return error.Unexpected;
 24        if (slice[rt_index] != elem.*) return error.Unexpected;
 25    }
 26}
 27test accessSlice {
 28    try accessSlice([3]u8{ 0xdb, 0xef, 0xbd });
 29    try accessSlice([3]u16{ 0x340e, 0x3654, 0x88d7 });
 30    try accessSlice([3]u32{ 0xd424c2c0, 0x2d6ac466, 0x5a0cfaba });
 31    try accessSlice([3]u64{
 32        0x9327a4f5221666a6,
 33        0x5c34d3ddd84a8b12,
 34        0xbae087f39f649260,
 35    });
 36    try accessSlice([3]u128{
 37        0x601cf010065444d4d42d5536dd9b95db,
 38        0xa03f592fcaa22d40af23a0c735531e3c,
 39        0x5da44907b31602b95c2d93f0b582ceab,
 40    });
 41}
 42
 43fn accessVector(comptime init: anytype) !void {
 44    const Vector = @TypeOf(init);
 45    const Elem = @typeInfo(Vector).vector.child;
 46    const ct_vals: [2]Elem = switch (Elem) {
 47        bool => .{ false, true },
 48        else => .{ imin(Elem), imax(Elem) },
 49    };
 50    var rt_vals: [2]Elem = undefined;
 51    rt_vals = ct_vals;
 52    var vector: Vector = undefined;
 53    vector = init;
 54    inline for (0..@typeInfo(Vector).vector.len) |ct_index| {
 55        if (&vector[ct_index] != &vector[ct_index]) return error.Unexpected;
 56        if (vector[ct_index] != init[ct_index]) return error.Unexpected;
 57        vector[ct_index] = rt_vals[0];
 58        if (vector[ct_index] != ct_vals[0]) return error.Unexpected;
 59        vector[ct_index] = ct_vals[1];
 60        if (vector[ct_index] != ct_vals[1]) return error.Unexpected;
 61        vector[ct_index] = ct_vals[0];
 62        if (vector[ct_index] != ct_vals[0]) return error.Unexpected;
 63        vector[ct_index] = rt_vals[1];
 64        if (vector[ct_index] != ct_vals[1]) return error.Unexpected;
 65    }
 66}
 67test accessVector {
 68    try accessVector(@Vector(1, bool){
 69        false,
 70    });
 71    try accessVector(@Vector(2, bool){
 72        false, true,
 73    });
 74    try accessVector(@Vector(3, bool){
 75        true, true, false,
 76    });
 77    try accessVector(@Vector(5, bool){
 78        true, false, true, false, true,
 79    });
 80    try accessVector(@Vector(7, bool){
 81        true, false, true, true, true, false, true,
 82    });
 83    try accessVector(@Vector(8, bool){
 84        false, true, false, true, false, false, false, true,
 85    });
 86    try accessVector(@Vector(9, bool){
 87        true, true, false, true, false, false, false, false,
 88        true,
 89    });
 90    try accessVector(@Vector(15, bool){
 91        false, true, true,  true,  false, true,  false, false,
 92        true,  true, false, false, true,  false, false,
 93    });
 94    try accessVector(@Vector(16, bool){
 95        true,  true, false, true,  false, false, false, false,
 96        false, true, true,  false, false, false, true,  true,
 97    });
 98    try accessVector(@Vector(17, bool){
 99        true,  false, true, true,  false, true,  false, true,
100        true,  true,  true, false, false, false, true,  true,
101        false,
102    });
103    try accessVector(@Vector(31, bool){
104        true,  false, true,  true,  false, true,  true,  true,
105        false, true,  false, true,  false, true,  true,  true,
106        false, false, true,  false, false, false, false, true,
107        true,  true,  true,  false, false, false, false,
108    });
109    try accessVector(@Vector(32, bool){
110        true,  true,  false, false, false, true, true,  true,
111        false, true,  true,  true,  false, true, false, true,
112        false, true,  false, true,  false, true, true,  false,
113        false, false, false, false, false, true, true,  true,
114    });
115    try accessVector(@Vector(33, bool){
116        true,  false, false, false, false, true,  true,  true,
117        false, false, true,  false, true,  true,  false, true,
118        true,  true,  false, true,  true,  false, false, false,
119        false, true,  false, false, false, true,  true,  false,
120        false,
121    });
122    try accessVector(@Vector(63, bool){
123        false, false, true,  true,  true,  false, true,  true,
124        true,  false, true,  true,  true,  false, true,  false,
125        true,  true,  false, true,  false, true,  true,  true,
126        false, false, true,  false, false, false, false, true,
127        true,  true,  true,  true,  false, true,  false, true,
128        true,  true,  false, false, true,  false, false, true,
129        false, true,  false, false, false, false, true,  true,
130        false, true,  false, false, true,  true,  true,
131    });
132    try accessVector(@Vector(64, bool){
133        false, false, true,  true,  true,  false, true,  true,
134        true,  false, true,  true,  false, true,  true,  false,
135        false, false, false, false, true,  true,  false, true,
136        true,  true,  true,  true,  false, false, false, true,
137        true,  false, true,  true,  false, false, true,  false,
138        false, true,  true,  false, true,  true,  false, false,
139        true,  true,  false, true,  false, true,  true,  true,
140        false, true,  true,  false, false, false, false, false,
141    });
142    try accessVector(@Vector(65, bool){
143        false, false, true,  true,  true,  true,  true,  true,
144        true,  false, false, false, false, true,  true,  false,
145        true,  false, true,  true,  true,  false, false, false,
146        true,  false, true,  true,  false, true,  true,  true,
147        true,  true,  false, true,  true,  false, true,  false,
148        false, true,  false, true,  false, false, true,  false,
149        true,  false, true,  true,  true,  false, true,  true,
150        false, false, true,  true,  true,  true,  false, false,
151        true,
152    });
153    try accessVector(@Vector(8, u8){
154        0x60, 0xf7, 0xf4, 0xb0, 0x05, 0xd3, 0x06, 0x78,
155    });
156    try accessVector(@Vector(8, u16){
157        0x9c91, 0xfb8b, 0x7f80, 0x8304, 0x6e52, 0xd8ef, 0x37fc, 0x7851,
158    });
159    try accessVector(@Vector(8, u32){
160        0x688b88e2, 0x68e2b7a2, 0x87574680, 0xab4f0769,
161        0x75472bb5, 0xa791f2ae, 0xeb2ed416, 0x5f05ce82,
162    });
163    try accessVector(@Vector(8, u64){
164        0xdefd1ddffaedf818, 0x91c78a29d3d59890,
165        0x842aaf8fd3c7b785, 0x970a07b8f9f4a6b3,
166        0x21b2425d1a428246, 0xea50e41174a7977b,
167        0x08d0f1c4f5978b74, 0x8dc88a7fd85e0e67,
168    });
169    try accessVector(@Vector(8, u128){
170        0x6f2cbde1fb219b1e73d7f774d10f0d94,
171        0x7c1412616cda20436d7106691d8ba4cc,
172        0x4ee940b50e97675b3b35d7872a35b5ad,
173        0x6d994fb8caa1b2fac48acbb68fa2d2f1,
174        0xdee698c7ec8de9b5940903e3fc665b63,
175        0x0751491a509e4a1ce8cfa6d62fe9e74c,
176        0x3d880f0a927ce3bfc2682b72070fcd50,
177        0x82f0eec62881598699eeb93fbb456e95,
178    });
179    try accessVector(@Vector(8, u256){
180        0x6ee4f35fe624d365952f73960791238ac781bfba782abc7866a691063e43ce48,
181        0xb006491f54a9c9292458a5835b7d5f4cfa18136f175eef0a13bb8adf5c3dc061,
182        0xd6e25ca1bc5685fc52609e261b9065bc05a8662e9291660033dd7f6d98e562b3,
183        0x992c5e54e0e6331dac258996be7dae9b2a2eff323a39043ba8d2721420dc5f5c,
184        0x257313f45fb3556d0fc323d5f38c953e9a093fe2278655312b6a5b64aab9d901,
185        0x6c8ad2182b9a3b2b19c2c9b152956b383d0fee2e3fbd5b02ed72227446a7b221,
186        0xd80cafc2252b289793799675e43f97ba4a5448c7b57e1544a464687b435efc7b,
187        0xfcb480f2d70afd53c4689dd3f5db7638c24302f2a6a15f738167db090d91fb28,
188    });
189}