#! perl -slw
use strict;
local $, = ' ';
my( $A, $B, $C ) = ( '', '', 0 );
sub query{
my $i = shift;
my $a = vec $A, $i, 32;
my $b = vec $B, $a, 32;
return (0 <= $a and $a < $C and $b == $i ) ? 1 : 0;
}
sub insert{
my $i = shift;
if( !query( $i ) ) {
vec( $B, $C, 32 ) = $i;
vec( $A, $i, 32 ) = $C;
$C++
}
}
sub del{
my $i = shift;
if( query( $i ) ) {
my $a = vec( $A, $i, 32 );
my $b = vec( $B, --$C, 32 );
vec( $B, $a, 32 ) = $b;
vec( $A, $b, 32 ) = $a;
}
}
sub clear{
$C = 0;
}
my @numbers = map{ int rand( 2**16 ) } 1 .. 10;
print 'Query before insert';
printf "%5d : %s\n", $_, query( $_ ) for @numbers;
insert $_ for @numbers;
print "\nQuery after insert";
printf "%5d : %s\n", $_, query( $_ ) for @numbers;
del $_ for @numbers[ 0..4 ]; ## Delete half
print "\nQuery after deleting half";
printf "%5d : %s\n", $_, query( $_ ) for @numbers;
del $_ for @numbers; ## Delete them all regardless if they still exist
+s
print "\nQuery after deleting the rest";
printf "%5d : %s\n", $_, query( $_ ) for @numbers;
__END__
P:\test>337432
Query before insert
22456 : 0
11958 : 0
15260 : 0
34466 : 0
23110 : 0
9114 : 0
21434 : 0
37988 : 0
32562 : 0
55488 : 0
Query after insert
22456 : 1
11958 : 1
15260 : 1
34466 : 1
23110 : 1
9114 : 1
21434 : 1
37988 : 1
32562 : 1
55488 : 1
Query after deleting half
22456 : 0
11958 : 0
15260 : 0
34466 : 0
23110 : 0
9114 : 0
21434 : 1
37988 : 1
32562 : 1
55488 : 1
Query after deleting the rest
22456 : 0
11958 : 0
15260 : 0
34466 : 0
23110 : 0
9114 : 0
21434 : 0
37988 : 0
32562 : 0
55488 : 0