| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Heap::Simple::Perl; |
|
2
|
5
|
|
|
5
|
|
225552
|
use strict; |
|
|
5
|
|
|
|
|
14
|
|
|
|
5
|
|
|
|
|
193
|
|
|
3
|
5
|
|
|
5
|
|
28
|
use Carp; |
|
|
5
|
|
|
|
|
11
|
|
|
|
5
|
|
|
|
|
339
|
|
|
4
|
|
|
|
|
|
|
|
|
5
|
5
|
|
|
5
|
|
37
|
use vars qw($VERSION $auto %used); |
|
|
5
|
|
|
|
|
10
|
|
|
|
5
|
|
|
|
|
430
|
|
|
6
|
|
|
|
|
|
|
$VERSION = "0.12"; |
|
7
|
|
|
|
|
|
|
$auto = "Auto"; |
|
8
|
|
|
|
|
|
|
%used = (); |
|
9
|
|
|
|
|
|
|
|
|
10
|
5
|
|
|
5
|
|
8214
|
use AutoLoader qw(AUTOLOAD); |
|
|
5
|
|
|
|
|
10265
|
|
|
|
5
|
|
|
|
|
32
|
|
|
11
|
|
|
|
|
|
|
|
|
12
|
5
|
|
|
5
|
|
193
|
use constant DEBUG => 0; |
|
|
5
|
|
|
|
|
11
|
|
|
|
5
|
|
|
|
|
3692
|
|
|
13
|
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
sub _use { |
|
15
|
22
|
|
|
22
|
|
41
|
my $name = shift(); |
|
16
|
22
|
|
|
|
|
86
|
$name =~ s|::|/|g; |
|
17
|
22
|
|
|
|
|
30
|
print STDERR "require Heap/Simple/$name.pm\n" if DEBUG; |
|
18
|
22
|
|
|
|
|
26860
|
return require "Heap/Simple/$name.pm"; |
|
19
|
|
|
|
|
|
|
} |
|
20
|
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
my %order = ("<" => "Number", |
|
22
|
|
|
|
|
|
|
">" => "NumberReverse", |
|
23
|
|
|
|
|
|
|
"lt" => "String", |
|
24
|
|
|
|
|
|
|
"gt" => "StringReverse", |
|
25
|
|
|
|
|
|
|
); |
|
26
|
|
|
|
|
|
|
sub _order { |
|
27
|
2387
|
|
|
2387
|
|
4384
|
my ($heap, $order) = @_; |
|
28
|
|
|
|
|
|
|
# Default order if nothing specified |
|
29
|
2387
|
100
|
66
|
|
|
16485
|
$order = "<" unless defined($order) && $order ne ""; |
|
30
|
2387
|
|
|
|
|
3091
|
my $name; |
|
31
|
2387
|
100
|
|
|
|
7182
|
if (ref($order) eq "CODE") { |
|
32
|
977
|
|
|
|
|
2354
|
$heap->[0]{order} = $order; |
|
33
|
977
|
|
|
|
|
1859
|
$name = "Less"; |
|
34
|
|
|
|
|
|
|
} else { |
|
35
|
1410
|
|
66
|
|
|
5740
|
$name = $order{lc $order} || croak "Unknown order '$order'"; |
|
36
|
|
|
|
|
|
|
} |
|
37
|
2385
|
|
66
|
|
|
7640
|
$used{$name} ||= _use($name); |
|
38
|
2385
|
|
|
|
|
6743
|
return $name; |
|
39
|
|
|
|
|
|
|
} |
|
40
|
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
sub _elements { |
|
42
|
2385
|
|
|
2385
|
|
4717
|
my ($heap, $elements) = @_; |
|
43
|
2385
|
100
|
|
|
|
7655
|
$elements = ["Scalar"] unless defined($elements); |
|
44
|
2385
|
100
|
|
|
|
7570
|
$elements = [$elements] if ref($elements) eq ""; |
|
45
|
2385
|
50
|
|
|
|
7134
|
croak "option elements is not an array reference" unless |
|
46
|
|
|
|
|
|
|
ref($elements) eq "ARRAY"; |
|
47
|
2385
|
50
|
|
|
|
6611
|
croak "option elements has no type defined at index 0" unless |
|
48
|
|
|
|
|
|
|
defined($elements->[0]); |
|
49
|
2385
|
|
|
|
|
7164
|
my $name = ucfirst(lc($elements->[0])); |
|
50
|
2385
|
100
|
|
|
|
5567
|
$name = "Scalar" if $name eq "Key"; |
|
51
|
2385
|
|
66
|
|
|
7015
|
$used{$name} ||= _use($name); |
|
52
|
|
|
|
|
|
|
# $name is passed for the case that Heap::Simple::$name uses inheritance |
|
53
|
2384
|
|
|
|
|
17039
|
return "Heap::Simple::$name"->_elements($heap, $name, $elements); |
|
54
|
|
|
|
|
|
|
} |
|
55
|
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
sub _max_count { |
|
57
|
2389
|
|
|
2389
|
|
4274
|
my ($heap, $max_count) = @_; |
|
58
|
2389
|
100
|
|
|
|
7632
|
return unless defined $max_count; |
|
59
|
1001
|
100
|
|
|
|
3924
|
$max_count == int($max_count) || |
|
60
|
|
|
|
|
|
|
croak "max_count should be an integer"; |
|
61
|
1000
|
100
|
|
|
|
3180
|
croak "max_count should not be negative" if $max_count < 0; |
|
62
|
999
|
50
|
|
|
|
3081
|
croak "max_count should not be zero" if $max_count == 0; |
|
63
|
999
|
100
|
|
|
|
6616
|
return $max_count == 9**9**9 ? () : (Limit => $heap->[0]{max_count} = $max_count); |
|
64
|
|
|
|
|
|
|
# my $name = "Limit"; |
|
65
|
|
|
|
|
|
|
# $used{$name} ||= _use($name); |
|
66
|
|
|
|
|
|
|
# return "Heap::Simple::$name"->_max_count($heap, $name, $max_count); |
|
67
|
|
|
|
|
|
|
} |
|
68
|
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
sub new { |
|
70
|
2390
|
100
|
|
2390
|
0
|
8025801
|
croak "Odd number of elements in options" if @_ % 2 == 0; |
|
71
|
2389
|
|
|
|
|
13415
|
my ($class, %options) = @_; |
|
72
|
|
|
|
|
|
|
# note: the array starts at elements 1 to make the subscripting |
|
73
|
|
|
|
|
|
|
# operations (much!) cleaner. |
|
74
|
|
|
|
|
|
|
# So elements 0 is used for associated data |
|
75
|
2389
|
|
|
|
|
14460
|
my $heap = bless [{}], $class; |
|
76
|
|
|
|
|
|
|
# We temporarily bless $heap into $class so you can play OO games with it |
|
77
|
2389
|
|
|
|
|
12074
|
my @max = $heap->_max_count(delete $options{max_count}); |
|
78
|
2387
|
100
|
|
|
|
9786
|
my @die = delete $options{can_die} ? "Die" : (); |
|
79
|
2387
|
100
|
|
|
|
11692
|
$heap->[0]{can_die} = 1 if @die; |
|
80
|
2387
|
|
|
|
|
9280
|
my @order = $heap->_order(delete $options{order}); |
|
81
|
2385
|
|
|
|
|
10007
|
my @elements = $heap->_elements(delete $options{elements}); |
|
82
|
2381
|
|
|
|
|
11104
|
my $gclass = join("::", $class, $auto, @max, @die, @order, @elements); |
|
83
|
|
|
|
|
|
|
# Pure perl version is never dirty |
|
84
|
2381
|
100
|
|
|
|
8616
|
$heap->[0]{dirty} = 1 if delete $options{dirty}; |
|
85
|
5
|
|
|
5
|
|
32
|
no strict "refs"; |
|
|
5
|
|
|
|
|
11
|
|
|
|
5
|
|
|
|
|
14325
|
|
|
86
|
361
|
|
|
|
|
12798
|
@{"${gclass}::ISA"} = ("Heap::Simple::$elements[0]", |
|
|
2381
|
|
|
|
|
24350
|
|
|
87
|
|
|
|
|
|
|
"Heap::Simple::$order[0]", |
|
88
|
2381
|
100
|
|
|
|
2999
|
$class) unless @{"${gclass}::ISA"}; |
|
89
|
2381
|
|
|
|
|
3995
|
print STDERR "Generated class $gclass\n" if DEBUG; |
|
90
|
|
|
|
|
|
|
# Now rebless the result into its final generated class |
|
91
|
2381
|
|
|
|
|
7740
|
bless $heap, $gclass; |
|
92
|
2381
|
100
|
|
|
|
15296
|
$heap->[0]{infinity} = exists($options{infinity}) ? |
|
93
|
|
|
|
|
|
|
delete $options{infinity} : $heap->_INF; |
|
94
|
2381
|
100
|
|
|
|
7102
|
$heap->[0]{user_data} = delete $options{user_data} if |
|
95
|
|
|
|
|
|
|
exists $options{user_data}; |
|
96
|
2381
|
100
|
|
|
|
5656
|
croak "Unknown option ", join(", ", map "'$_'", CORE::keys %options) if |
|
97
|
|
|
|
|
|
|
%options; |
|
98
|
2380
|
|
|
|
|
12351
|
return $heap; |
|
99
|
|
|
|
|
|
|
} |
|
100
|
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
sub _ELEMENTS_PREPARE { |
|
102
|
164
|
|
|
164
|
|
1380
|
return ""; |
|
103
|
|
|
|
|
|
|
} |
|
104
|
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
sub _ORDER_PREPARE { |
|
106
|
730
|
|
|
730
|
|
5515
|
return ""; |
|
107
|
|
|
|
|
|
|
} |
|
108
|
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
sub _PREPARE { |
|
110
|
672
|
|
|
672
|
|
2473
|
my $heap = shift; |
|
111
|
672
|
|
|
|
|
4696
|
return join("", $heap->_ORDER_PREPARE, $heap->_ELEMENTS_PREPARE); |
|
112
|
|
|
|
|
|
|
} |
|
113
|
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
sub _VALUE { |
|
115
|
811
|
|
|
811
|
|
32777
|
return $_[1]; |
|
116
|
|
|
|
|
|
|
} |
|
117
|
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
sub _WRAPPER { |
|
119
|
310
|
|
|
310
|
|
17821
|
return $_[2]; |
|
120
|
|
|
|
|
|
|
} |
|
121
|
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
sub _INF { |
|
123
|
1072
|
|
|
1072
|
|
4154
|
return; |
|
124
|
|
|
|
|
|
|
} |
|
125
|
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
sub _CAN_DIE { |
|
127
|
2218
|
50
|
|
2218
|
|
33084
|
return shift->[0]{can_die} ? shift : @_ > 1 ? $_[1] : ""; |
|
|
|
100
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
} |
|
129
|
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
sub _CANT_DIE { |
|
131
|
335
|
100
|
|
335
|
|
4627
|
return shift->[0]{can_die} ? "" : shift; |
|
132
|
|
|
|
|
|
|
} |
|
133
|
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
sub _MAX_COUNT { |
|
135
|
2028
|
50
|
|
2028
|
|
20871
|
return shift->[0]{max_count} ? shift : @_ > 1 ? $_[1] : ""; |
|
|
|
100
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
} |
|
137
|
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
sub _THE_MAX_COUNT { |
|
139
|
1277
|
|
33
|
1277
|
|
23304
|
return shift->[0]{max_count} || croak "undefined max_count"; |
|
140
|
|
|
|
|
|
|
} |
|
141
|
|
|
|
|
|
|
|
|
142
|
|
|
|
|
|
|
sub _REAL_KEY { |
|
143
|
367
|
|
|
367
|
|
1792
|
return shift->_KEY(@_); |
|
144
|
|
|
|
|
|
|
} |
|
145
|
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
sub _REAL_ELEMENTS_PREPARE { |
|
147
|
95
|
|
|
95
|
|
596
|
return shift->_ELEMENTS_PREPARE(@_); |
|
148
|
|
|
|
|
|
|
} |
|
149
|
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
sub _REAL_PREPARE { |
|
151
|
205
|
|
|
205
|
|
500
|
my $heap = shift; |
|
152
|
205
|
|
|
|
|
1959
|
return join("", $heap->_ORDER_PREPARE, $heap->_REAL_ELEMENTS_PREPARE); |
|
153
|
|
|
|
|
|
|
} |
|
154
|
|
|
|
|
|
|
|
|
155
|
|
|
|
|
|
|
# Returning "-" means it should not get used |
|
156
|
|
|
|
|
|
|
# (should cause a syntax error on accidental use) |
|
157
|
|
|
|
|
|
|
sub _QUICK_KEY { |
|
158
|
20
|
|
|
20
|
|
560
|
return "-"; |
|
159
|
|
|
|
|
|
|
} |
|
160
|
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
sub _COMMA { |
|
162
|
51
|
|
|
51
|
|
334
|
return ","; |
|
163
|
|
|
|
|
|
|
} |
|
164
|
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
my %stringify = |
|
166
|
|
|
|
|
|
|
("\"" => "\\\"", |
|
167
|
|
|
|
|
|
|
"\\" => "\\\\", |
|
168
|
|
|
|
|
|
|
"\$" => "\\\$", |
|
169
|
|
|
|
|
|
|
"\@" => "\\\@", |
|
170
|
|
|
|
|
|
|
"\n" => "\\n", |
|
171
|
|
|
|
|
|
|
"\r" => "\\r"); |
|
172
|
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
# currently loses utf8 when the resulting string gets used |
|
174
|
|
|
|
|
|
|
sub _stringify { |
|
175
|
676
|
50
|
|
676
|
|
1483
|
defined(my $str = shift) || croak "undefined access"; |
|
176
|
676
|
|
|
|
|
1050
|
$str =~ s/([\"\\\n\r\$\@])/$stringify{$1}/g; # " |
|
177
|
676
|
|
|
|
|
3641
|
return qq("$str"); |
|
178
|
|
|
|
|
|
|
} |
|
179
|
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
my ($balanced, $sequence); |
|
181
|
|
|
|
|
|
|
# String with balanced parenthesis (but not balanced {}. We use that) |
|
182
|
|
|
|
|
|
|
$balanced = qr{[^()\[\],]*(?:(?:\((??{$sequence})\)|\[(??{$sequence})\])[^()\[\],]*)*}; |
|
183
|
|
|
|
|
|
|
$sequence = qr{$balanced(?:,$balanced)*}; |
|
184
|
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
sub _make { |
|
186
|
|
|
|
|
|
|
# Use $_self so there is less chance of the eval using $heap and surviving |
|
187
|
1955
|
|
|
1955
|
|
3348
|
my $_self = shift; |
|
188
|
1955
|
50
|
|
|
|
7097
|
die "Cannot determine caller class from '$_self'" unless ref($_self); |
|
189
|
1955
|
|
|
|
|
15635
|
my $subroutine = (caller(1))[3]; |
|
190
|
1955
|
50
|
|
|
|
13086
|
$subroutine =~ s/.*:://s || die "Cannot parse caller '$subroutine'"; |
|
191
|
1955
|
|
|
|
|
3846
|
my $package = ref($_self); |
|
192
|
|
|
|
|
|
|
|
|
193
|
1955
|
|
|
|
|
10484
|
my $string = "package $package;\n" . shift; |
|
194
|
|
|
|
|
|
|
# Very simple macro expander, but ignore literal strings |
|
195
|
1955
|
|
|
|
|
4395
|
my $f = "a"; |
|
196
|
|
|
|
|
|
|
# 1 while $string =~ s{(\b_[A-Z_]+)\(($sequence)\)}{$f=$1; $_self->$f($2 =~ /($balanced),?/g)}eg; |
|
197
|
|
|
|
|
|
|
# Previous line ought to work but actually fails on perl 5.6.2 because |
|
198
|
|
|
|
|
|
|
# the return value from s///e cannot be trusted |
|
199
|
1955
|
|
|
|
|
181589
|
$f="",$string =~ s{(\b_[A-Z_]+)\(($sequence)\)}{$f=$1; $_self->$f($2 =~ /($balanced),?/g)}eg while $f; |
|
|
20853
|
|
|
|
|
37558
|
|
|
|
20853
|
|
|
|
|
1046286
|
|
|
200
|
1955
|
100
|
|
|
|
12544
|
if ($string =~ /\bmy\s+\$(\w+)\s*=\s*shift;/g) { |
|
201
|
1586
|
|
|
|
|
4167
|
my $var = $1; |
|
202
|
1586
|
50
|
|
|
|
10122
|
$string =~ /\$$var\b/g || croak "$_self uses \$$var only once ($string)"; |
|
203
|
1586
|
100
|
|
|
|
9648
|
unless ($string =~ /\$$var\b/g) { |
|
204
|
|
|
|
|
|
|
# Should also check for extra shifts really |
|
205
|
165
|
50
|
|
|
|
686
|
croak "Candidate uses $1:\n$string" if $string =~ /(\$_\[[^\]]\])/; |
|
206
|
|
|
|
|
|
|
# main::diag("Candidate: $string"); |
|
207
|
165
|
|
|
|
|
2293
|
$string =~ s/\bmy\s+\$$var\s*=\s*shift;(?:\s*\n)?(.*)\$$var\b/$1shift/s; |
|
208
|
|
|
|
|
|
|
# main::diag("Now: $string"); |
|
209
|
|
|
|
|
|
|
} |
|
210
|
|
|
|
|
|
|
} |
|
211
|
|
|
|
|
|
|
# $string =~ s/(sub\s+\w+)\s*{.*\bCarp::croak\b\s*(\"[^\"]+\");.*}/$1 { Carp::croak $2 }/s; # " |
|
212
|
|
|
|
|
|
|
# Important that these are last one since they can expand to something |
|
213
|
|
|
|
|
|
|
# that contain the others |
|
214
|
1955
|
|
|
|
|
9174
|
$string =~ s{\b_(LITERAL|STRING)\b}{ |
|
215
|
1426
|
50
|
|
|
|
8684
|
$1 eq "LITERAL" ? |
|
|
|
100
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
defined $_self->[0]{index} ? $_self->[0]{index} : croak("undefined access") : |
|
217
|
|
|
|
|
|
|
_stringify($_self->[0]{index})}eg; |
|
218
|
1955
|
|
|
|
|
30626
|
$string |
|
219
|
|
|
|
|
|
|
=~ s/^([^\S\n]*sub\s+(\w+)\s*\{)/#line 1 "${package}::$2"\n$1/mg; |
|
220
|
1955
|
|
|
|
|
2756
|
print STDERR "Code:\n$string\n" if DEBUG; |
|
221
|
1955
|
|
|
|
|
3885
|
my $err = $@; |
|
222
|
1955
|
|
|
419
|
|
494637
|
eval $string; |
|
|
349
|
|
|
670
|
|
94369
|
|
|
|
313
|
|
|
94
|
|
3644
|
|
|
|
419
|
|
|
4
|
|
99251
|
|
|
|
278
|
|
|
4
|
|
3973
|
|
|
|
228
|
|
|
4
|
|
2314
|
|
|
|
278
|
|
|
4
|
|
2305
|
|
|
|
228
|
|
|
4
|
|
2235
|
|
|
|
228
|
|
|
4
|
|
2269
|
|
|
|
278
|
|
|
4
|
|
2254
|
|
|
|
278
|
|
|
4
|
|
3116
|
|
|
|
670
|
|
|
4
|
|
298634
|
|
|
|
670
|
|
|
4
|
|
6219
|
|
|
|
670
|
|
|
4
|
|
2294
|
|
|
|
670
|
|
|
4
|
|
3836
|
|
|
|
670
|
|
|
4
|
|
2905
|
|
|
|
670
|
|
|
4
|
|
5196
|
|
|
|
94
|
|
|
4
|
|
42176
|
|
|
|
94
|
|
|
4
|
|
2046
|
|
|
|
94
|
|
|
4
|
|
72842
|
|
|
|
4
|
|
|
|
|
1660
|
|
|
223
|
1955
|
50
|
|
|
|
7000
|
die $@ if $@; |
|
224
|
1955
|
|
|
|
|
64471
|
$@ = $err; |
|
225
|
|
|
|
|
|
|
} |
|
226
|
|
|
|
|
|
|
|
|
227
|
|
|
|
|
|
|
sub count { |
|
228
|
3942
|
|
|
3942
|
0
|
3133287
|
return $#{+shift}; |
|
|
3942
|
|
|
|
|
20388
|
|
|
229
|
|
|
|
|
|
|
} |
|
230
|
|
|
|
|
|
|
|
|
231
|
|
|
|
|
|
|
sub extract_all { |
|
232
|
180
|
|
|
180
|
0
|
326565
|
my $heap = shift; |
|
233
|
180
|
|
|
|
|
1017
|
return map $heap->extract_top, 2..@$heap; |
|
234
|
|
|
|
|
|
|
} |
|
235
|
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
sub clear { |
|
237
|
440
|
|
|
440
|
0
|
358074
|
$#{+shift} = 0; |
|
|
440
|
|
|
|
|
2451
|
|
|
238
|
|
|
|
|
|
|
} |
|
239
|
|
|
|
|
|
|
|
|
240
|
|
|
|
|
|
|
sub absorb { |
|
241
|
271
|
|
|
271
|
0
|
104621
|
my $heap = shift; |
|
242
|
271
|
|
|
|
|
3437
|
$_->_absorb($heap) for @_; |
|
243
|
|
|
|
|
|
|
} |
|
244
|
|
|
|
|
|
|
|
|
245
|
|
|
|
|
|
|
sub key_absorb{ |
|
246
|
183
|
|
|
183
|
0
|
60513
|
my $heap = shift; |
|
247
|
183
|
|
|
|
|
2072
|
$_->_key_absorb($heap) for @_; |
|
248
|
|
|
|
|
|
|
} |
|
249
|
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
sub wrapped { |
|
251
|
186
|
|
|
186
|
0
|
129890
|
return; |
|
252
|
|
|
|
|
|
|
} |
|
253
|
|
|
|
|
|
|
|
|
254
|
|
|
|
|
|
|
sub max_count { |
|
255
|
312
|
|
100
|
312
|
0
|
47679
|
return shift->[0]{max_count} || 9**9**9; |
|
256
|
|
|
|
|
|
|
} |
|
257
|
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
sub dirty { |
|
259
|
180
|
|
66
|
180
|
0
|
108665
|
return shift->[0]{dirty} || (wantarray() ? () : !1); |
|
260
|
|
|
|
|
|
|
} |
|
261
|
|
|
|
|
|
|
|
|
262
|
|
|
|
|
|
|
sub can_die { |
|
263
|
1204
|
|
66
|
1204
|
0
|
170216
|
return shift->[0]{can_die} || (wantarray() ? () : !1); |
|
264
|
|
|
|
|
|
|
} |
|
265
|
|
|
|
|
|
|
|
|
266
|
|
|
|
|
|
|
sub key_index { |
|
267
|
160
|
|
|
160
|
0
|
146037
|
croak "Heap elements are not of type 'Array'"; |
|
268
|
|
|
|
|
|
|
} |
|
269
|
|
|
|
|
|
|
|
|
270
|
|
|
|
|
|
|
sub key_name { |
|
271
|
160
|
|
|
160
|
0
|
123333
|
croak "Heap elements are not of type 'Hash'"; |
|
272
|
|
|
|
|
|
|
} |
|
273
|
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
sub key_method { |
|
275
|
100
|
|
|
100
|
0
|
77367
|
croak "Heap elements are not of type 'Method' or 'Object'"; |
|
276
|
|
|
|
|
|
|
} |
|
277
|
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
sub key_function { |
|
279
|
140
|
|
|
140
|
0
|
140847
|
croak "Heap elements are not of type 'Function' or 'Any'"; |
|
280
|
|
|
|
|
|
|
} |
|
281
|
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
sub key_insert { |
|
283
|
180
|
|
|
180
|
0
|
72164
|
croak "This heap type does not support key_insert"; |
|
284
|
|
|
|
|
|
|
} |
|
285
|
|
|
|
|
|
|
|
|
286
|
|
|
|
|
|
|
sub _key_insert { |
|
287
|
210
|
|
|
210
|
|
101202
|
croak "This heap type does not support _key_insert"; |
|
288
|
|
|
|
|
|
|
} |
|
289
|
|
|
|
|
|
|
|
|
290
|
|
|
|
|
|
|
sub implementation() { |
|
291
|
365
|
|
|
365
|
0
|
4716
|
return __PACKAGE__; |
|
292
|
|
|
|
|
|
|
} |
|
293
|
|
|
|
|
|
|
|
|
294
|
|
|
|
|
|
|
1; |
|
295
|
|
|
|
|
|
|
|
|
296
|
|
|
|
|
|
|
__END__ |