X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-perl/blobdiff_plain/f9952aec1cf6c64a5681308eea817b6113a37433..fcd15e0b7a3d0f0ca2f30953573f8d1f6b8e8bd2:/Catacomb/Cache.pm diff --git a/Catacomb/Cache.pm b/Catacomb/Cache.pm new file mode 100644 index 0000000..6b42c4e --- /dev/null +++ b/Catacomb/Cache.pm @@ -0,0 +1,72 @@ +# -*-perl-*- +# +# $Id$ +# +# Caching for fields, curves, groups, ... +# +# (c) 2004 Straylight/Edgeware +# + +#----- Licensing notice ----------------------------------------------------- +# +# This file is part of the Perl interface to Catacomb. +# +# Catacomb/Perl 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 +# (at your option) any later version. +# +# Catacomb/Perl 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 Catacomb/Perl; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +package Catacomb::Cache::Ref; + +sub new { + my ($me, $c) = @_; + $c->[0]++; + return bless [$c], $me; +} + +sub DESTROY { + my ($me) = @_; + my $c = $me->[0]; + if ($c->[0] > 1) { $c->[0]--; return; } + delete $c->[1]{$c->[2]}; +} + +package Catacomb::Cache; + +$debug = 1; + +sub stringify { + my ($x) = @_; + if (ref($x) eq ARRAY) { + return "[" . join("/", map(stringify($_), @$x)) . "]"; + } else { + return $x; + } +} + +sub new { my ($me) = @_; return bless { }, $me; } + +sub intern { + my ($c, $x) = @_; + my $k = stringify($x->get()); + my $e; + if (exists($c->{$k})) { + $e = $c->{$k}; + } else { + $e = $c->{$k} = [0, $c, $k, $x]; + } + return $e->[3], Catacomb::Cache::Ref->new($e); +} + +#----- That's all, folks ---------------------------------------------------- + +1;