| Genezzo documentation | Contained in the Genezzo distribution. |
Genezzo::PushHash::PHArray - Push Hash Array implementation
various
Jeffrey I. Cohen, jcohen@genezzo.com
perl(1).
Copyright (c) 2003, 2004 Jeffrey I Cohen. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Address bug reports and comments to: jcohen@genezzo.com
For more information, please visit the Genezzo homepage at http://www.genezzo.com
| Genezzo documentation | Contained in the Genezzo distribution. |
#!/usr/bin/perl # # $Header: /Users/claude/fuzz/lib/Genezzo/PushHash/RCS/PHArray.pm,v 7.1 2005/07/19 07:49:03 claude Exp claude $ # # copyright (c) 2003, 2004 Jeffrey I Cohen, all rights reserved, worldwide # # use strict; use warnings; package Genezzo::PushHash::PHArray; use Genezzo::Util; #use Genezzo::PushHash::PushHash; use Carp; use warnings::register; our @ISA = "Genezzo::PushHash::PushHash" ; sub _init { #whoami; #greet @_; my $self = shift; my @needarr = (); # supply an array reference if needed... # NOTE: should always generate a new array if PHArray is loaded as # factory method my %args = (arrayref => \@needarr, @_); $self->{ref} = $args{arrayref}; my $refthing = ref($self->{ref}); croak "supplied $refthing , requires ARRAY" unless ($refthing eq "ARRAY"); return 1; } sub TIEHASH { #sub new # greet @_; my $invocant = shift; my $class = ref($invocant) || $invocant ; my $self = { }; my %args = (@_); return undef unless (_init($self,%args)); return bless $self, $class; } # end new # private # sub _thehash # NOTE: now an array, but implementation is the same # private my $_Next_ID = sub { my $ref = $_[0]->_thehash (); return scalar(@{$ref}); }; # HPush public method (not part of standard hash) sub HPush { my $place = &$_Next_ID($_[0]); return undef unless (defined($place)); return undef unless ($_[0]->_realSTORE( $place, $_[1])); return ($place); } # private sub _realSTORE{ $_[0]->_thehash()->[$_[1]] = $_[2] } # use parent HPush, STORE sub HCount { # FETCHSIZE equivalent, i.e. scalar(@array) my $ref = $_[0]->_thehash (); return (scalar (@{$ref})); } sub FETCH { my $ref = $_[0]->_thehash (); $ref->[$_[1]] } sub NEXTKEY { # $_[0]->{ __PACKAGE__ . "CURR_ID"} += 1; my $kk = $_[1] + 1; return undef unless ($_[0]->EXISTS($kk)); return ($kk); } sub FIRSTKEY { # $_[0]->{ __PACKAGE__ . "CURR_ID"} = -1; return $_[0]->NEXTKEY(-1); } sub EXISTS { # must be numeric for exists in array return 0 if ($_[1] !~ /\d+/); my $ref = $_[0]->_thehash (); exists ($ref->[$_[1]]); } sub DELETE { # XXX: only allow deletion from end -- otherwise, beginning or # intermediate array locations are set to undef, which breaks # firstkey/nextkey my $place = &$_Next_ID($_[0]); return undef unless (defined($place)); if ($_[1] != ($place - 1)) { carp "Cannot delete key: $_[1] - not last key" if warnings::enabled(); return undef; } delete $_[0]->_thehash()->[$_[1]] ; } sub CLEAR { @{$_[0]->_thehash()} = () } END { } 1; __END__ # Below is stub documentation for your module. You better edit it!