Hi Martin, On Wed, Aug 14, 2024 at 03:50:00PM GMT, Martin Uecker wrote: > An operator that returns an array with all dimensions of a multi-dimensional > array would make a a lot of sense to me. > > > double array[4][3][2]; > > // array_dims(array) = (constexpr size_t[3]){ 4, 3, 2 }
And what if array[4][n][2]? No constexpr anymore, which is bad. > > int dim1 = (array_dims(array))[0] > int dim2 = (array_dims(array))[1] > int dim3 = (array_dims(array))[2] > > You can then implement lengthof in terms of this operator: > > #define lengthof(x) (array_dims(array)[0]) Not really. This implementation would result in less constant expressions that my proposal. That's detrimental for diagnostics and usability. And the fundamental operator would be very complex, to allow users implementing simpler wrappers. I think the fundamental operators should be as simple as possible, in the spirit of C, and let users build on top of those basic tools. This reminds me of the 'static' specifier for array parameters, which is conflated with two meanings: nonnull and length. I'd rather have a way to specify nullness, and another one to specify length, and let users compose them. At first glance I oppose this array_dims operator. > and you can obtain the rank by applying lengthof to the array: > > #define rank(x) lengthof(array_dims(x)) I'm curious to see what kind of code would be enabled by a rank() operator in C that we can't write at the moment. > If the array is constexpr for regular arrays and array > indexing returns a constant again for constexpr arrays, this > would all work out. > > Martin Have a lovely day! Alex -- <https://www.alejandro-colomar.es/>
signature.asc
Description: PGP signature