use strict;

package optimize::int;

use constant HINT_INTEGER => 0x00000001;

my @int_translate = qw(add subtract lt gt le ge eq ne ncmp negate preinc predec postinc postdec multiply divide modulo);
my @int_flags = qw(complement left_shift right_shift bit_and bit_xor bit_or);
my %int;
for(@int_translate) {
    $int{$_} = "i_$_";
}
for(@int_flags) {
    $int{$_} = 0;
}
*old_op = *optimize::old_op;
*state  = *optimize::state;

sub check {
    my $class = shift;
    my $op = shift;
    my $mutate = 0;
    if(exists($int{$op->name})) {
	my $cv = $op->find_cv();
	if(exists($optimize::pads{$cv->ROOT->seq}) &&
	   $optimize::pads{$cv->ROOT->seq}->[$op->targ]->[1]->{int}) {
	    $mutate++;
	} elsif($op->can('first') && $op->first->name eq 'padsv' &&
		exists($optimize::pads{$cv->ROOT->seq}) &&
		$optimize::pads{$cv->ROOT->seq}->[$op->first->targ]->[1]->{int}) {
	    $mutate++;
	} elsif($op->can('last') && $op->last->name eq 'padsv' &&
		exists($optimize::pads{$cv->ROOT->seq}) &&
		$optimize::pads{$cv->ROOT->seq}->[$op->last->targ]->[1]->{int}) {
	    $mutate++;
	}
    }
    if($mutate && $int{$op->name}) {
	$op->mutate($int{$op->name});
	$op->private($op->private | HINT_INTEGER);
    } elsif($mutate) {
	$op->private($op->private | HINT_INTEGER);
    }

}

=head1 NAME

optimize::int - Turn on integer ops for specified variables

=head1 SYNOPSIS

    use optimize;
    my $int : optimize(int);
    $int = 1.5;
    $int += 1;
    if($int == 2) { print "$int is integerized" }

=head1 DESCRIPTION

Most perl operators can be turned into integer versions which do 
all work in integers and truncates (floors) all fractional 
portions. This is traditionally done by C<use integer;> which turns
on integer operations in the scope. This is usually by far too wide
area to turn on those ops in.

For greater flexibility this allows you to turn on integer ops for a
specific variable using the optimize attribute with an int argument,
C<my $int : optimize(int);>. 

=head1 AUTHOR

Arthur Bergman E<lt>abergman@cpan.orgE<gt>

=head1 SEE ALSO

L<optimize> L<integer>

=cut


