AI-Pathfinding-SMAstar

 view release on metacpan or  search on metacpan

lib/AI/Pathfinding/SMAstar/AVLQueue.pm  view on Meta::CPAN

	
	_obj_counts_tree => Tree::AVL->new(fcompare => \&AI::Pathfinding::SMAstar::PairObj::compare_keys_numeric,
					   fget_key => \&AI::Pathfinding::SMAstar::PairObj::key,
					   fget_data => \&AI::Pathfinding::SMAstar::PairObj::val),
		
        @_,    # Override previous attributes
    };
    return bless $self, $class;
}



##############################################
# accessor
##############################################

sub key
{
    my $self = shift;
    if (@_) { $self->{_key} = shift }
    return $self->{_key};	
}





#############################################################################
#
# other methods
#
#############################################################################


sub get_keys_iterator
{
    my ($self) = @_;
    return $self->{_obj_counts_tree}->get_keys_iterator();
}



sub compare_obj_counters{
    my ($obj, $arg_obj) = @_;

     if ($arg_obj){
	my $arg_key = $arg_obj->{_queue_counter};
	my $key = $obj->{_queue_counter};
	
	if($arg_key > $key){
	    return(-1);
	}
	elsif($arg_key == $key){
	    return(0);
	}
	elsif($arg_key < $key){
	    return(1);
	}	
    }
    else{
	croak "AVLQueue::compare_obj_counters: error: null argument object\n";
    }
}


sub obj_counter{
    my ($obj) = @_;
    return $obj->{_queue_counter};
}

sub obj_value{
    my ($obj) = @_;
    return $obj->{_value};
}



sub compare {
    my ($self, $arg_obj) = @_;

    if ($arg_obj){
	my $arg_key = $arg_obj->{_key};
	my $key = $self->{_key};
	
	if($arg_key > $key){
	    return(-1);
	}
	elsif($arg_key == $key){
	    return(0);
	}
	elsif($arg_key < $key){
	    return(1);
	}	
    }
    else{
	croak "AVLQueue::compare error: null argument object\n";
    }
}

sub lookup {    
    my ($self, $obj) = @_;        
    my $found_obj = $self->{_avltree}->lookup_obj($obj);

    if(!$found_obj){
	croak "AVLQueue::lookup:  did not find obj in queue\n";
	return;
    }    
    return $found_obj;
}

sub lookup_by_key {    
    my ($self, $key) = @_;    
    my $pair =  AI::Pathfinding::SMAstar::PairObj->new(
	_queue_counter => $key,
	);	       
    my $found_obj = $self->{_avltree}->lookup_obj($pair);

    if(!$found_obj){
	croak "AVLQueue::lookup:  did not find obj in queue\n";
	return;
    }    
    return $found_obj;
}


sub remove {
    my ($self, $obj, $compare_func) = @_;
    my $found_obj;
    
    $found_obj = $self->{_avltree}->remove($obj);

    if(!$found_obj){
	croak "AVLQueue::remove:  did not find obj in queue\n";
	return;
    }
    
    my $count = $found_obj->{_queue_counter};
   

    my $pairobj = AI::Pathfinding::SMAstar::PairObj->new(_key => $count,
			       _value => $count);
    $self->{_obj_counts_tree}->remove($pairobj);

    return $found_obj;
}



sub is_empty
{
    my ($self) = @_; 
    
    if($self->{_avltree}->is_empty()){
	return 1;
    }
    return 0;    



( run in 0.691 second using v1.01-cache-2.11-cpan-39bf76dae61 )