package Net::Paraget::ServerQueue;
#
# $Id: ServerQueue.pm,v 1.1.1.1 2001/01/31 19:40:39 ftobin Exp $
#

use strict;

use Net::Paraget::Server;

use Class::MethodMaker
  hash          => [ qw( _servers ) ],
  new_hash_init => 'new';


sub servers
{
    my ( $self ) = @_;
    return $self->_servers_values();
}

sub count
{
    my ( $self ) = @_;
    return scalar $self->servers();
}

sub ranked_average_speed
{
    my ( $self ) = @_;
    return $self->get_average( 'speed' );
}


sub ranked_average_overhead
{
    my ( $self ) = @_;
    return $self->get_average( 'overhead' );
}


sub get_average
{
    my ( $self, $value ) = @_;
    
    my $n = $self->count() or return undef;
    my $sum = 0;
    
    foreach my $s ( $self->get_ranked() )
    {
	my $x = $s->$value();
	$sum += $x if defined $x;
    }
    
    my $average = int ( $sum / $n );
    return $average;
}

# Add a list of new servers to the queue
sub add
{
    my ( $self, @new_servers, ) = @_;
    
    my @new_ranked_servers;
    
    for my $s ( @new_servers )
    {
	$self->_servers($s->id(), $s);
    }
}


sub remove
{
    my ($self, $server) = @_;

    $self->_servers_delete(   $server->id() );
}


sub get_unranked
{
    my ( $self ) = @_;
    my @unranked_servers;
    foreach my $server ( $self->servers() )
    {
	if ($server->disable() or
	    not defined $server->speed() )
	{
	    push @unranked_servers, $server;
	}
    }
    return @unranked_servers;
}

sub get_ranked
{
    my ( $self ) = @_;
    my @ranked_servers;
    foreach my $server ( $self->servers() )
    {
	if (not ($server->disabled() or
		 not defined $server->speed() ))
	{
	    push @ranked_servers, $server;
	}
    }
    return @ranked_servers;
}


sub count_ranked
{
    my ( $self ) = @_;
    return scalar $self->get_ranked();
}


sub count_unranked
{
    my ( $self ) = @_;
    return scalar $self->get_unranked();
}


1;


syntax highlighted by Code2HTML, v. 0.9.1