Much wider support for Catacomb in all its glory.
[catacomb-perl] / Catacomb / Cache.pm
CommitLineData
fcd15e0b 1# -*-perl-*-
2#
3# $Id$
4#
5# Caching for fields, curves, groups, ...
6#
7# (c) 2004 Straylight/Edgeware
8#
9
10#----- Licensing notice -----------------------------------------------------
11#
12# This file is part of the Perl interface to Catacomb.
13#
14# Catacomb/Perl is free software; you can redistribute it and/or modify
15# it under the terms of the GNU General Public License as published by
16# the Free Software Foundation; either version 2 of the License, or
17# (at your option) any later version.
18#
19# Catacomb/Perl is distributed in the hope that it will be useful,
20# but WITHOUT ANY WARRANTY; without even the implied warranty of
21# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22# GNU General Public License for more details.
23#
24# You should have received a copy of the GNU General Public License
25# along with Catacomb/Perl; if not, write to the Free Software Foundation,
26# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27
28package Catacomb::Cache::Ref;
29
30sub new {
31 my ($me, $c) = @_;
32 $c->[0]++;
33 return bless [$c], $me;
34}
35
36sub DESTROY {
37 my ($me) = @_;
38 my $c = $me->[0];
39 if ($c->[0] > 1) { $c->[0]--; return; }
40 delete $c->[1]{$c->[2]};
41}
42
43package Catacomb::Cache;
44
45$debug = 1;
46
47sub stringify {
48 my ($x) = @_;
49 if (ref($x) eq ARRAY) {
50 return "[" . join("/", map(stringify($_), @$x)) . "]";
51 } else {
52 return $x;
53 }
54}
55
56sub new { my ($me) = @_; return bless { }, $me; }
57
58sub intern {
59 my ($c, $x) = @_;
60 my $k = stringify($x->get());
61 my $e;
62 if (exists($c->{$k})) {
63 $e = $c->{$k};
64 } else {
65 $e = $c->{$k} = [0, $c, $k, $x];
66 }
67 return $e->[3], Catacomb::Cache::Ref->new($e);
68}
69
70#----- That's all, folks ----------------------------------------------------
71
721;