2016-04-20 09:56:34 -07:00
< ? php
/**
* Random_ * Compatibility Library
* for using the new PHP 7 random_ * API in PHP 5 projects
*
* The MIT License ( MIT )
*
2018-11-23 12:29:20 +00:00
* Copyright ( c ) 2015 - 2018 Paragon Initiative Enterprises
2016-04-20 09:56:34 -07:00
*
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the " Software " ), to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE .
*/
2017-04-13 15:53:35 +01:00
if ( ! is_callable ( 'RandomCompat_intval' )) {
2019-01-24 08:00:03 +00:00
2016-04-20 09:56:34 -07:00
/**
* Cast to an integer if we can , safely .
2019-01-24 08:00:03 +00:00
*
2016-04-20 09:56:34 -07:00
* If you pass it a float in the range ( ~ PHP_INT_MAX , PHP_INT_MAX )
* ( non - inclusive ), it will sanely cast it to an int . If you it ' s equal to
* ~ PHP_INT_MAX or PHP_INT_MAX , we let it fail as not an integer . Floats
* lose precision , so the <= and => operators might accidentally let a float
* through .
2019-01-24 08:00:03 +00:00
*
2017-04-13 15:53:35 +01:00
* @ param int | float $number The number we want to convert to an int
2018-11-23 12:29:20 +00:00
* @ param bool $fail_open Set to true to not throw an exception
2019-01-24 08:00:03 +00:00
*
2017-04-13 15:53:35 +01:00
* @ return float | int
2018-11-23 12:29:20 +00:00
* @ psalm - suppress InvalidReturnType
2017-04-13 15:53:35 +01:00
*
* @ throws TypeError
2016-04-20 09:56:34 -07:00
*/
function RandomCompat_intval ( $number , $fail_open = false )
{
2017-04-13 15:53:35 +01:00
if ( is_int ( $number ) || is_float ( $number )) {
$number += 0 ;
} elseif ( is_numeric ( $number )) {
2018-11-23 12:29:20 +00:00
/** @psalm-suppress InvalidOperand */
2016-04-20 09:56:34 -07:00
$number += 0 ;
}
2018-11-23 12:29:20 +00:00
/** @var int|float $number */
2017-04-13 15:53:35 +01:00
2016-04-20 09:56:34 -07:00
if (
2017-04-13 15:53:35 +01:00
is_float ( $number )
2018-11-23 12:29:20 +00:00
&&
2017-04-13 15:53:35 +01:00
$number > ~ PHP_INT_MAX
2018-11-23 12:29:20 +00:00
&&
2016-04-20 09:56:34 -07:00
$number < PHP_INT_MAX
) {
$number = ( int ) $number ;
}
2017-04-13 15:53:35 +01:00
if ( is_int ( $number )) {
return ( int ) $number ;
} elseif ( ! $fail_open ) {
throw new TypeError (
'Expected an integer.'
);
2016-04-20 09:56:34 -07:00
}
2017-04-13 15:53:35 +01:00
return $number ;
2016-04-20 09:56:34 -07:00
}
}