Data-Smile
view release on metacpan or search on metacpan
lib/Data/Smile/PP.pm view on Meta::CPAN
use 5.008008;
use strict;
use warnings;
package Data::Smile::PP;
use Scalar::Util qw( blessed dualvar looks_like_number );
use constant HEADER => "\x3A\x29\x0A\x03";
use constant MAX_SAFE_INT_DOUBLE => 9_007_199_254_740_992;
use constant MIN_SIGNED_64BIT => -9_223_372_036_854_775_808;
use constant MAX_UNSIGNED_64BIT => 18_446_744_073_709_551_615;
our $AUTHORITY = 'cpan:TOBYINK';
our $VERSION = '0.001000';
use Exporter::Tiny;
our @ISA = qw( Exporter::Tiny );
our @EXPORT_OK = qw( encode_smile decode_smile dump_smile load_smile );
BEGIN {
my @HELPERS = (
_is_arrayref => [
[ 'Ref::Util::XS', 'is_plain_arrayref' ],
[ 'Type::Tiny::XS', 'ArrayRef' ],
q{
my ( $v ) = @_;
ref( $v ) eq 'ARRAY';
},
],
_is_hashref => [
[ 'Ref::Util::XS', 'is_plain_hashref' ],
[ 'Type::Tiny::XS', 'HashRef' ],
q{
my ( $v ) = @_;
ref( $v ) eq 'HASH';
},
],
_is_dual => [
[ 'Scalar::Util', 'isdual' ],
q{
use B ();
my $f = B::svref_2object(\$_[0])->FLAGS;
my $SVp_POK = eval { B::SVp_POK() } || 0;
my $SVp_IOK = eval { B::SVp_IOK() } || 0;
my $SVp_NOK = eval { B::SVp_NOK() } || 0;
my $pok = $f & ( B::SVf_POK | $SVp_POK );
my $niok = $f & ( B::SVf_IOK | B::SVf_NOK | $SVp_IOK | $SVp_NOK );
!!( $pok and $niok );
},
],
_is_bool => [
[ 'builtin', 'is_bool' ],
q{
my $value = shift;
return !!0 unless defined $value;
return !!0 if ref $value;
return !!0 unless _is_dual( $value );
return !!1 if $value and "$value" eq '1' and $value + 0 == 1;
return !!1 if not $value and "$value" eq q'' and $value + 0 == 0;
return !!0;
},
],
_created_as_number => [
[ 'builtin', 'created_as_number' ],
q{
use B ();
my $value = shift;
return !!0 unless defined $value;
return !!0 if ref $value;
return !!0 if utf8::is_utf8( $value );
my $b_obj = B::svref_2object(\$value);
my $flags = $b_obj->FLAGS;
return !!1 if $flags & ( B::SVp_IOK() | B::SVp_NOK() ) and not( $flags & B::SVp_POK() );
return !!0;
},
],
_created_as_string => [
[ 'builtin', 'created_as_string' ],
q{
my $value = shift;
defined $value
and not ref $value
and not _is_bool( $value )
and not _created_as_number( $value );
},
],
);
HELPER: while ( @HELPERS ) {
my ( $name, $implementation_list ) = splice @HELPERS, 0, 2;
IMPLEMENTATION: for my $i ( @$implementation_list ) {
( run in 1.839 second using v1.01-cache-2.11-cpan-39bf76dae61 )