[system] / trunk / pg / lib / Value / Infinity.pm Repository:
ViewVC logotype

Annotation of /trunk/pg/lib/Value/Infinity.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3716 - (view) (download) (as text)

1 : dpvc 2603 ###########################################################################
2 :    
3 :     package Value::Infinity;
4 :     my $pkg = 'Value::Infinity';
5 :    
6 :     use strict;
7 :     use vars qw(@ISA);
8 :     @ISA = qw(Value);
9 :    
10 :     use overload
11 : dpvc 3716 '.' => sub {shift->_dot(@_)},
12 : dpvc 3192 '<=>' => sub {shift->compare(@_)},
13 :     'cmp' => sub {shift->compare_string(@_)},
14 :     'neg' => sub {shift->neg(@_)},
15 :     'nomethod' => sub {shift->nomethod(@_)},
16 :     '""' => sub {shift->stringify(@_)};
17 : dpvc 2603
18 :     #
19 :     # Create an infinity object
20 :     #
21 :     sub new {
22 :     my $self = shift; my $class = ref($self) || $self;
23 :     Value::Error("Infinity should have no parameters") if scalar(@_);
24 :     bless {
25 :     data => [$$Value::context->flag('infiniteWord')],
26 :     isInfinite => 1, isNegative => 0,
27 :     }, $class;
28 :     }
29 :    
30 :     #
31 :     # Return the appropriate data.
32 :     #
33 :     sub length {0}
34 : dpvc 2660 sub typeRef {$Value::Type{infinity}}
35 : dpvc 2603 sub value {shift->{data}[0]}
36 :    
37 : dpvc 2800 sub isZero {0}
38 :     sub isOne {0}
39 :    
40 : dpvc 2603 ##################################################
41 :    
42 :     #
43 : dpvc 2609 # Return an infinity or real
44 : dpvc 2603 #
45 :     sub promote {
46 : dpvc 2609 my $x = shift; $x = [$x,@_] if scalar(@_) > 0;
47 :     $x = Value::makeValue($x);
48 :     return $x if ref($x) eq $pkg || Value::isReal($x);
49 : dpvc 3370 Value::Error("Can't convert '%s' to Infinity",$x);
50 : dpvc 2603 }
51 :    
52 :     ############################################
53 :     #
54 :     # Operations on Infinities
55 :     #
56 :    
57 :     sub neg {
58 :     my $self = shift;
59 :     my $neg = Value::Infinity->new();
60 :     $neg->{isNegative} = !$self->{isNegative};
61 :     $neg->{data}[0] = '-'.$neg->{data}[0] if $neg->{isNegative};
62 :     return $neg;
63 :     }
64 :    
65 :     sub compare {
66 :     my ($l,$r,$flag) = @_;
67 :     if ($l->promotePrecedence($r)) {return $r->compare($l,!$flag)}
68 :     $r = promote($r); my $sgn = ($flag ? -1: 1);
69 :     return 0 if $r->class ne 'Real' && $l->{isNegative} == $r->{isNegative};
70 :     return ($l->{isNegative}? -$sgn: $sgn);
71 :     }
72 :    
73 :     ############################################
74 :     #
75 :     # Generate the various output formats
76 :     #
77 :    
78 :     sub TeX {(shift->{isNegative} ? '-\infty': '\infty ')}
79 :     sub perl {(shift->{isNegative} ? '-(Infinity)': '(Infinity)')}
80 :    
81 :     ###########################################################################
82 :    
83 :     1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9