#!/usr/bin/perl

@Domesticated{ qw(dog cat horse) } = ( );

sub count_members {
    return scalar keys %{ $_[ 0 ] };
}

print count_members( \%Domesticated ), "\n";

@Domesticated{ qw(dog cat horse) } = ( );
( $size, $numbers, $names ) =
    members_to_numbers( \%Domesticated );

$Domesticated = hash_set_to_bit_vector( \%Domesticated, $numbers );

sub count_bit_vector_members {
    return unpack "%32b*", $_[0];
}

print count_bit_vector_members($Domesticated), "\n";

sub members_to_numbers {
    my ( @names,   $name );
    my ( %numbers, $number );

    $number = 0;
    while ( my $set = shift @_ ) {
        while ( defined ( $name = each %$set ) ) {
            unless ( exists $numbers{ $name } ) {
        $numbers{ $name   } = $number;
        $names  [ $number ] = $name;
        $number++;
            }
        }
    }

    return ( $number, \%numbers, \@names );
}

sub hash_set_to_bit_vector {
    my ( $hash, $numbers ) = @_;
    my ( $name, $vector );

    # Initialize $vector to zero bits.
    #
    $vector = '';

    while ( defined ($name = each %{ $hash })) {
        vec( $vector, $numbers->{ $name }, 1 ) = 1;
    }

    return $vector;
}

