NAME

Judy::L - Efficient integer to integer map

SYNOPSIS

Read a series of key/value pairs from the standard input, store in a JudyL array, and then print out in sorted order.

use Judy::L qw( Set First Next Last Prev Delete Free );

# Load judy.
my $judy;
Set( $judy, 123, 345 );
Set( $judy, 324, 456 );
Set( $judy, 234, 567 );

# Print in ascending order.
print "ascending\n";
my ( undef, $value , $key ) = First( $judy, 0 );
while ( defined $key ) {
    print "$key=$value\n";
    ( undef, $value, $key ) = Next( $judy, $key );
}

# Now in descending order, deleting on the way.
print "descending\n";
( undef, $value, $key ) = Last( $judy, -1 );
while ( defined $key ) {
    print "$key=$value\n";
    Delete( $judy, $key );
    ( undef, $value, $key ) = Prev( $judy, $key );
}

# Ought to be a no-op since Judy is already empty.
Free( $judy );

EXPORT

All functions are exportable by Sub::Exporter.

DESCRIPTION

Judy::L is the equivalent of a sparse array of integers. Memory to support the array is allocated as key/value pairs are inserted, and released as key/value pairs are deleted.

The value may be used as a scalar, or a pointer to a structure or block of data (or even another Judy array). JudySL and JudyHS are implemented on top of JudyL where the values are pointers. See http://perlmonks.org/?node_id=733140 for an example.

Nothing special is required to allocate a Judy::L array. Just start using it.

my $judy;
if ( Get( $judy, 10 ) ) {
    ....
}

As with an ordinary array, there are no duplicate keys in a Judy::L array.

DATA TYPES

$Judy - Judy::L array

$Key - integer

$Value - integer

$PValue - pointer to integer

$Nth - integer

BASIC FUNCTIONS

$PValue = Set( $Judy, $Key, $Value )

Insert/set an $Key and $Value into the Judy::L array $Judy.

Return $PValue pointing to $Value. Your program can use this pointer to read or modify $Value until the next Set(), Delete(), Free() is executed on $Judy. Examples:

use Judy::L   qw( Set         );
use Judy::Mem qw( Poke Peek );

$pvalue = Set( $judy, 2, 43 );

Poke( $pvalue, 44 );
44 == Peek( $pvalue );

Note: Set() and Delete() reorganize the Judy::L array. Therefore, $PValue returned from previous Judy::L calls become invalid and must be re-acquired.

Modifies $Judy to point to allocated Judy::L object.

bool = Delete( $Judy, $Key )

Delete the $Key/$Value pair from the Judy::L array. Return true if the key was removed.

($PValue, $Value) = Get( $Judy, $Key )

Get the pointer $PValue and value $Value associated with $Key in the $Judy Judy array.

Return $PValue pointing to $Value and $Value. Return nothing if the $Key was not present.

Search Functions

First(), Next(), Last(), Prev() allow you to search for keys in the array. You may search inclusively or exclusively, in either forward or reverse directions. If successful, $Key is returned set to the found key, $PValue is returned set to a pointer to $Key's $Value and $Value is returned. If unsuccessful, nothing is returned.

FirstEmpty(), NextEmpty(), LastEmpty(), PrevEmpty() allow you to search for keys that are not present ("empty") in the array. You may search inclusively or exclusively, in either forward or reverse directions. If successful, an $Key is returned set to a not present ("empty") key. If unsuccessful, nothing is returned.

( $PValue, $Value, $Key ) = First( $Judy, $Key )

Search (inclusive) for the first key present that is equal to or greater than the passed $Key. (Start with $Key = 0 to find the first key in the array.) First() is typically used to begin a sorted-order scan of the keys present in a JudyL array.

Returns nothing if the search finds nothing.

( $PValue, $Value, $Key ) = Next( $Judy, $Key )

Search (exclusive) for the next key present that is greater than the passed Key. Next() is typically used to continue a sorted-order scan of the keys present in a JudyL array, or to locate a "neighbor" of a given key.

# Prints the contents of $judy
my ( undef, $value, $key ) = First( $judy, 0 );
while ( defined $key ) {
    print "$key=$value\n";

    ( undef, $value, $key ) = Next( $judy, $key );
}

Returns nothing if the search finds nothing.

( $PValue, $Value, $Key ) = Last( $Judy, $Key)

Search (inclusive) for the last key present that is equal to or less than the passed $Key. (Start with $Key = -1, that is, all ones, to find the last key in the array.) Last() is typically used to begin a reverse-sorted-order scan of the keys present in a JudyL array.

Returns nothing if the search finds nothing.

( $PValue, $Value, $Key ) = Prev( $Judy, $Key )

Search (exclusive) for the previous key present that is less than the passed $Key. Prev() is typically used to continue a reverse-sorted-order scan of the keys present in a JudyL array, or to locate a "neighbor" of a given key.

Returns nothing if the search finds nothing.

$Key = FirstEmpty( $Judy, $Key )

Search (inclusive) for the first key absent that is equal to or greater than the passed $Key. (Start with $Key = 0 to find the first key absent in the array.)

Returns nothing if the search finds nothing.

$Key = NextEmpty( $Judy, $Key )

Search (exclusive) for the next key absent that is greater than the passed $Key.

Returns nothing if the search finds nothing.

$Key = LastEmpty( $Judy, $Key )

Search (inclusive) for the last key absent that is equal to or less than the passed $Key. (Start with $Key = -1, that is, all ones, to find the last key absent in the array.)

Returns nothing if the search finds nothing.

$Indx = PrevEmpty( $Judy, $Key )

Search (exclusive) for the previous key absent that is less than the passed $Key.

Returns nothing if the search finds nothing.

$Rc = Count( $Judy, $Key1, $Key2 )

Count the number of keys present in $Judy between $Key1 and $Key2 (inclusive).

Return the count. A return value of 0 can be valid as a count.

To count all keys present in a Judy::L array, use:

my $count = Count( $judy, 0, -1 );

( $PValue, $Value, $Key ) = Nth( $Judy, $Nth )

Locate the $Nth key that is present in $Judy ($Nth = 1 returns the first key present).

Return pointer to value, value, and key. Return nothing if there isn't an $Nth element.

UTILITY FUNCTIONS

bytes = Free( $Judy )

Frees an entire Judy::L array. This is much faster than a Next/Delete loop. Return number of bytes freed. $Judy is set to 0.

bytes = MemUsed( $Judy )

Return the number of bytes of memory malloc()'ed by $Judy. This is a very fast routine, and may be used before and after a Set() or Delete() call with little performance impact.

MULTIDIMENSIONAL Judy::L

See Judy.

ERRORS & WARNINGS

See Judy.

AUTHOR

See Judy.