[phobos] std.array.ilength

Andrei Alexandrescu andrei at erdani.com
Thu Feb 17 14:28:04 PST 2011


I assume I'm in the minority here, but I don't see a need for such a 
function.

Andrei

On 2/17/11 1:40 PM, David Simcha wrote:
> Fair points.  You've convinced me (since I didn't have a very strong
> opinion before).  Let's go with int.  I've also come to believe that
> ilength is the best name because it's negligible extra typing compared
> to .length, so people will actually use it.  Proposed function for
> inclusion in object:
>
> /**
> Returns the length of an array as a 32-bit signed integer.  Verifies
> with an assert that arr.length <= int.max unless this can be proven
> at compile time.  This is a useful shortcut for getting the
> length of a arrays that cannot plausibly have length longer than
> int.max (about 2 billion) as a 32-bit integer even if building
> for a 64-bit target.  It's also useful for converting an array length
> to a signed integer while verifying the safety of this
> conversion if asserts are enabled.
> */
> @property int ilength(T)(const T[] arr) pure nothrow @safe {
>      static if(size_t.sizeof > uint.sizeof || T.sizeof == 1) {
>          assert(arr.length <= int.max,
> "Cannot get integer length of array with >int.max elements."
>          );
>      }
>
>      return cast(int) arr.length;
> }
>
>
> On Thu, Feb 17, 2011 at 2:24 PM, Don Clugston <dclugston at googlemail.com
> <mailto:dclugston at googlemail.com>> wrote:
>
>     On 17 February 2011 17:10, David Simcha <dsimcha at gmail.com
>     <mailto:dsimcha at gmail.com>> wrote:
>      > Can you elaborate on why?  Unsigned seems like the perfect type
>     for an array
>      > length.
>
>     An array length is a positive integer, you want to treat it as an
>     integer, not as a bag of bits.
>     Using an unsigned types is like using a cast, to be avoided whenever
>     possible. They're a breeding ground for bugs,
>     and a disturbingly large fraction of programmers don't understand them.
>
>
>
>     On 17 February 2011 18:02, David Simcha <dsimcha at gmail.com
>     <mailto:dsimcha at gmail.com>> wrote:
>      > My main gripe with going with int is that it eliminates the
>     possibility of
>      > making ilength() a noop that just returns .length on 32.  The
>     assert would
>      > still be necessary.
>
>     But the assert adds value.
>     Note that an assert is only required on arrays of size 1 --  ubyte,
>     byte, char.
>     On everything else, it's still a no-op.
>
>
>      > On Thu, Feb 17, 2011 at 9:48 AM, Don Clugston
>     <dclugston at googlemail.com <mailto:dclugston at googlemail.com>>
>      > wrote:
>      >>
>      >> On 17 February 2011 14:59, David Simcha <dsimcha at gmail.com
>     <mailto:dsimcha at gmail.com>> wrote:
>      >> > Hey guys,
>      >> >
>      >> > Kagamin just came up with a simple but great idea to mitigate the
>      >> > pedantic
>      >> > nature of 64-bit to 32-bit integer conversions in cases where
>     using
>      >> > size_t
>      >> > doesn't cut it.  Examples are storing arrays of indices into other
>      >> > arrays,
>      >> > where using size_t would be a colossal waste of space if it's
>     safe to
>      >> > assume
>      >> > none of the arrays will be billions of elements long.
>
>
>      >> >  int or uint?  I used int only b/c that was the example on the
>      >> > newsgroup,
>      >> > but I think uint makes more sense.
>      >>
>      >> I *strongly* oppose uint. We should take every possible
>     opportunity to
>      >> reduce usage of unsigned numbers.
>      >> 'i' implies immutable.
>      >> How about intlength  (or intLength ?)
>     _______________________________________________
>     phobos mailing list
>     phobos at puremagic.com <mailto:phobos at puremagic.com>
>     http://lists.puremagic.com/mailman/listinfo/phobos
>
>
>
>
> _______________________________________________
> phobos mailing list
> phobos at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/phobos


More information about the phobos mailing list