Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c++ > #82802

Re: Can anyone improve this ?

From Tim Rentsch <tr.17687@z991.linuxsc.com>
Newsgroups comp.lang.c++
Subject Re: Can anyone improve this ?
Date 2022-01-17 10:28 -0800
Organization A noiseless patient Spider
Message-ID <86ee56rzbz.fsf@linuxsc.com> (permalink)
References <srjdtm$d9c$1@dont-email.me>

Show all headers | View raw


Bonita Montero <Bonita.Montero@gmail.com> writes:

> I had an idea how to write a fast UTF-8 strlen, here it is:
>
> size_t utf8Strlen( char const *str )
> {
>     struct encode_t { size_t lenIncr, strIncr; };
>     static encode_t const encodes[] =
>     {
>         { 1, 1 },
>         { 0, 0 },
>         { 1, 2 },
>         { 1, 3 },
>         { 1, 4 },
>         { 0, 0 },
>         { 0, 0 },
>         { 0, 0 },
>         { 0, 0 }
>     };
>     size_t len = 0;
>     for( unsigned char c; (c = *str); )
>     {
>         encode_t const &enc =
>            encodes[(size_t)countl_zero<unsigned char>( ~c )];
>         if( !enc.lenIncr ) [[unlikely]]
>             return -1;
>         len += enc.lenIncr;
>         for( char const *cpEnd = str + enc.strIncr; ++str != cpEnd; )
>             if( ((unsigned char)*str & 0x0C0) != 0x080 ) [[unlikely]]
>                 return -1;
>     }
>     return len;
> }
>
> Has anyone further ideas to improve this ?

Just for fun -

size_t
utf8_units_two( const char *s ){
    size_t r = -1;
    unsigned char c;

  next:
    switch(  r++,  c = *s++,  c >> 3  ){
	cases(16,17,18,19,20,21,22,23,31):			return  -1;

	cases(30):		if(  c = *s++,  c >> 6 != 2  )	return  -1;
	cases(28,29):		if(  c = *s++,  c >> 6 != 2  )	return  -1;
	cases(24,25,26,27):	if(  c = *s++,  c >> 6 != 2  )	return  -1;
	cases(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15):		goto  next;

	cases(0):		if(  c != 0  )			goto  next;
    }

    return  r;
}


(Note:  the cases() macro produces one 'case X:' for each
argument X except the last one where the ':' is omitted,
written using the standard C preprocessor, and left as an
exercise for any ambitious readers.)

Incidentally, this code provides the only example I remember
where using 'goto' is pretty much unavoidable, in that any
re-writing without 'goto' seems awkward or inferior in some
other way.  I guess I should say, at least not that I could
find, maybe someone else can do better.

This code also has the interesting property that along the main
code path there are no conditional branches (as compiled by gcc
under -O2).

Back to comp.lang.c++ | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

Can anyone improve this ? Bonita Montero <Bonita.Montero@gmail.com> - 2022-01-11 09:08 +0100
  Re: Can anyone improve this ? Juha Nieminen <nospam@thanks.invalid> - 2022-01-11 09:50 +0000
    Re: Can anyone improve this ? Juha Nieminen <nospam@thanks.invalid> - 2022-01-11 11:07 +0000
    Re: Can anyone improve this ? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2022-01-11 11:08 +0000
    Re: Can anyone improve this ? Bonita Montero <Bonita.Montero@gmail.com> - 2022-01-11 18:28 +0100
      Re: Can anyone improve this ? Christian Gollwitzer <auriocus@gmx.de> - 2022-01-11 18:41 +0100
        Re: Can anyone improve this ? Bonita Montero <Bonita.Montero@gmail.com> - 2022-01-11 19:36 +0100
      Re: Can anyone improve this ? Öö Tiib <ootiib@hot.ee> - 2022-01-11 21:54 -0800
  Re: Can anyone improve this ? Bonita Montero <Bonita.Montero@gmail.com> - 2022-01-11 21:51 +0100
    Re: Can anyone improve this ? Bonita Montero <Bonita.Montero@gmail.com> - 2022-01-12 14:19 +0100
    Re: Can anyone improve this ? Bonita Montero <Bonita.Montero@gmail.com> - 2022-01-12 14:20 +0100
      Re: Can anyone improve this ? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2022-01-12 14:14 +0000
        Re: Can anyone improve this ? Bonita Montero <Bonita.Montero@gmail.com> - 2022-01-12 17:20 +0100
          Re: Can anyone improve this ? "james...@alumni.caltech.edu" <jameskuyper@alumni.caltech.edu> - 2022-01-12 08:38 -0800
          Re: Can anyone improve this ? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2022-01-12 16:55 +0000
        Re: Can anyone improve this ? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-01-16 12:09 -0800
        Re: Can anyone improve this ? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-01-16 12:12 -0800
          Re: Can anyone improve this ? Öö Tiib <ootiib@hot.ee> - 2022-01-16 13:00 -0800
            Re: Can anyone improve this ? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-01-17 10:13 -0800
  Re: Can anyone improve this ? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-01-17 10:28 -0800
    Re: Can anyone improve this ? "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2022-01-17 21:51 +0100
      Re: Can anyone improve this ? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-01-17 16:16 -0800
      Re: Can anyone improve this ? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-01-17 22:43 -0800
        Re: Can anyone improve this ? "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2022-01-18 12:09 +0100
    Re: Can anyone improve this ? Bonita Montero <Bonita.Montero@gmail.com> - 2022-01-18 09:18 +0100

csiph-web