Re: Efficient output for integer types

Поиск
Список
Период
Сортировка
От David Fetter
Тема Re: Efficient output for integer types
Дата
Msg-id 20190922215804.GL31596@fetter.org
обсуждение исходный текст
Ответ на Re: Efficient output for integer types  (Andrew Gierth <andrew@tao11.riddles.org.uk>)
Ответы Re: Efficient output for integer types  (Tels <nospam-pg-abuse@bloodgate.com>)
Re: Efficient output for integer types  (Andrew Gierth <andrew@tao11.riddles.org.uk>)
Список pgsql-hackers
On Sat, Sep 21, 2019 at 07:29:25AM +0100, Andrew Gierth wrote:
> >>>>> "David" == David Fetter <david@fetter.org> writes:
> 
>  David> +static inline uint32
>  David> +decimalLength64(const uint64_t v)
> 
> Should be uint64, not uint64_t.

Fixed.

> Also return an int, not a uint32.

Fixed.

> For int vs. int32, my own inclination is to use "int" where the value is
> just a (smallish) number, especially one that will be used as an index
> or loop count, and use "int32" when it actually matters that it's 32
> bits rather than some other size. Other opinions may differ.

Done with int.

>  David> +{
>  David> +    uint32            t;
>  David> +    static uint64_t    PowersOfTen[] = {
> 
> uint64 not uint64_t here too.

Fixed.

>  David> +int32
>  David> +pg_ltoa_n(uint32 value, char *a)
> 
> If this is going to handle only unsigned values, it should probably be
> named pg_ultoa_n.

It does signed values now.

>  David> +    uint32    i = 0, adjust = 0;
> 
> "adjust" is not assigned anywhere else. Presumably that's from previous
> handling of negative numbers?

It was, and now it's gone.

>  David> +        memcpy(a, "0", 1);
> 
>  *a = '0';  would suffice.

Fixed.

>  David> +    i += adjust;
> 
> Superfluous?

Yep. Gone.

>  David> +    uint32_t    uvalue = (uint32_t)value;
> 
> uint32 not uint32_t.

Fixed.

>  David> +    int32        len;
> 
> See above re. int vs. int32.

Done that way.

>  David> +        uvalue = (uint32_t)0 - (uint32_t)value;
> 
> Should be uint32 not uint32_t again.

Done.

> For anyone wondering, I suggested this to David in place of the ugly
> special casing of INT32_MIN. This method avoids the UB of doing (-value)
> where value==INT32_MIN, and is nevertheless required to produce the
> correct result:
> 
> 1. If value < 0, then ((uint32)value) is (value + UINT32_MAX + 1)
> 2. (uint32)0 - (uint32)value
>       becomes  (UINT32_MAX+1)-(value+UINT32_MAX+1)
>       which is (-value) as required
> 
>  David> +int32
>  David> +pg_lltoa_n(uint64_t value, char *a)
> 
> Again, if this is doing unsigned, then it should be named pg_ulltoa_n

Renamed to allow the uint64s that de-special-casing INT32_MIN/INT64_MIN requires.

>  David> +        if (value == PG_INT32_MIN)
> 
> This being inconsistent with the others is not nice.

Fixed.

Best,
David.
-- 
David Fetter <david(at)fetter(dot)org> http://fetter.org/
Phone: +1 415 235 3778

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate

Вложения

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Alexander Korotkov
Дата:
Сообщение: Re: JSONPATH documentation
Следующее
От: Tom Lane
Дата:
Сообщение: Re: JSONPATH documentation