[Libreoffice] [PUSHED] [REVIEW 3-4] Fix for fdo#39589

Lionel Elie Mamane lionel at mamane.lu
Thu Nov 24 02:25:30 PST 2011


On Thu, Nov 24, 2011 at 10:56:57AM +0100, Lionel Elie Mamane wrote:

> I understand we don't want to touch that in stable branch, but anyone
> opposing me pushing something like that in master, and similar for
> llimit_cast and limit_cast?

> // assumptions:
> // \forall typename Type:
> //     ( (::std::numeric_limits< Type >::min() == 0) XOR ( ::std::numeric_limits< Type >::min() < 0  && ::std::numeric_limits< Type >::is_signed ))
> // &&  (::std::numeric_limits< Type >::max() > 0 )

> template< typename ReturnType, typename Type >
> inline ReturnType ulimit_cast( Type nValue, ReturnType nMax )
> {
>   if ( ! ::std::numeric_limits< ReturnType >::is_signed && ::std::numeric_limits< Type >::is_signed && nValue < 0 )
>     return nMax;
>      // Due to implicit type conversion, the comparison in the if occurs in the type
>      // that has the biggest ::max()
>      // -> safe; compiler gives a warning for mixed signed/unsigned, though
>      // Assuming unbounded signed types are unbounded towards both infinities.
>   else if ( ! ::std::numeric_limits< ReturnType >::is_bounded ||
>             ::std::numeric_limits< ReturnType >::max() > ::std::numeric_limits< Type >::max() )

That should be:

  else if ( ! ::std::numeric_limits< ReturnType >::is_bounded ||
            nMax > ::std::numeric_limits< Type >::max() )

Obviously.

>     // nValue fits, and it is unsafe to compare nMax to nValue within Type:
>     // nMax would be converted
>     return static_cast < ReturnType >(nValue);
>   else
>     // nMax fits in Type; safe to compare to nValue within Type
>     return static_cast< ReturnType >(::std::min<Type>(nValue, nMax));
> }

-- 
Lionel


More information about the LibreOffice mailing list