On Mon, 20 Oct 2014 07:01:07 -0700, moritz wrote:
> On Mon Oct 20 06:54:16 2014, abraxxa wrote:
> > As discussed on IRC mainly with moritz I'd need a way to get the
> > number of bytes, not elements, of a Buf object so it can be looped
> > and
> > each byte accessed with $buf.[$idx].
> > I'm requiring this in DBDish::Oracle for passing UTF-16 encoded
> > values
> > and their byte-length to the OCI C library using NativeCall.
> 
> Another use case: cryptography, which typically works on the byte
> level, even for multi-byte encodings.


A lot of time has passed and we have has the first part for quite some time.

$ perl6 -e '.bytes.say for buf8.new(1,2,3), buf16.new(1,2,3), buf32.new(1,2,3), 
buf64.new(1,2,3)'
3
6
12
24

...which is both specced and already tested.  Also as a Container type
you get .of:

$ perl6 -e '.of.say for Buf[int8].new(1,2,3), Buf[uint16].new(1,2,3), 
Buf[int32], Buf[uint64]'
(int8)
(uint16)
(int32)
(uint64)

...and the native types can be nativesizeof'd

$ perl6 -e 'use NativeCall; nativesizeof(.of).say for Buf[int8].new(1,2,3), 
Buf[uint16].new(1,2,3), Buf[int32], Buf[uint64]'
1
2
4
8

Also there are ways to finagle the second need with NativeCall:

$ perl6 -e 'use NativeCall; my $b16 = buf16.new(1,2,3); my $b8 = 
nativecast(CArray[uint8], $b16); $b8[^6].say'
(1 0 2 0 3 0)

...though internally this relies on some GC manipulations and the
details on exactly if/when it becomes fragile aren't documented.

Granted a lot more could be done to make this, and endianness conversions 
easier,
e.g. safe and optimized indexing adverbs like buf32.new(1,2)[^8]:swab8 might be
nice, as well as having types that carry their endianness information around 
with them,
but I think that falls in the 6.d-and-later design discussion category rather 
than RT.

So I'd vote to 'resolve' this ticket, and maybe if the next person who picks
it up agrees, they should do so.

Reply via email to