DateTimeX-Lite
view release on metacpan or search on metacpan
lib/DateTimeX/Lite/Arithmetic.pm view on Meta::CPAN
if (! blessed $dur || !$dur->isa('DateTimeX::Lite::Duration')) {
Carp::croak("Duration is not a DateTimeX::Lite::Duration object");
}
# simple optimization
return $self if $dur->is_zero;
my %deltas = $dur->deltas;
# This bit isn't quite right since DateTimeX::Lite::Infinite::Future -
# infinite duration should NaN
foreach my $val ( values %deltas )
{
my $inf;
if ( $val == &DateTimeX::Lite::INFINITY )
{
$inf = DateTimeX::Lite::Infinite::Future->new;
}
elsif ( $val == &DateTimeX::Lite::NEG_INFINITY )
{
$inf = DateTimeX::Lite::Infinite::Past->new;
lib/DateTimeX/Lite/Duration.pm view on Meta::CPAN
'-' => '_subtract_overload',
'*' => '_multiply_overload',
'<=>' => '_compare_overload',
'cmp' => '_compare_overload',
);
use constant MAX_NANOSECONDS => 1_000_000_000; # 1E9 = almost 32 bits
my @all_units = qw( months days minutes seconds nanoseconds );
# XXX - need to reject non-integers but accept infinity, NaN, &
# 1.56e+18
sub new
{
my ($class, %p) = @_;
foreach my $field (qw(years months weeks days hours minutes seconds nanoseconds)) {
$p{$field} = 0 unless defined $p{$field};
}
=head1
my %p = validate( @_,
t/20infinite.t view on Meta::CPAN
my $neg2 = $long_ago + $neg_dur;
ok( $neg2 == $neg,
'normal + neg infinite duration = neg infinity' );
my $dur = $pos - $pos;
my %deltas = $dur->deltas;
my @compare = qw( days seconds nanoseconds );
foreach (@compare)
{
# NaN != NaN (but should stringify the same)
is( $deltas{$_} . '', $nan_string,
"infinity - infinity = nan ($_)" );
}
my $new_pos = $pos->clone->add( days => 10 );
ok( $new_pos == $pos,
"infinity + normal duration = infinity" );
my $new_pos2 = $pos->clone->subtract( days => 10 );
ok( $new_pos2 == $pos,
( run in 0.244 second using v1.01-cache-2.11-cpan-fd5d4e115d8 )