chiark / gitweb /
infra: Add a copy of the GPL.
[catacomb-perl] / Catacomb / Cache.pm
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
28 package Catacomb::Cache::Ref;
29
30 sub new {
31   my ($me, $c) = @_;
32   $c->[0]++;
33   return bless [$c], $me;
34 }
35
36 sub 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
43 package Catacomb::Cache;
44
45 $debug = 1;
46
47 sub stringify {
48   my ($x) = @_;
49   if (ref($x) eq ARRAY) {
50     return "[" . join("/", map(stringify($_), @$x)) . "]";
51   } else {
52     return $x;
53   }
54 }
55
56 sub new { my ($me) = @_; return bless { }, $me; }
57
58 sub 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
72 1;