File Coverage

blib/lib/DateTime/Event/Cron/Quartz/TreeSet.pm
Criterion Covered Total %
statement 61 65 93.8
branch 20 26 76.9
condition n/a
subroutine 11 12 91.6
pod 7 8 87.5
total 99 111 89.1


line stmt bran cond sub pod time code
1             package DateTime::Event::Cron::Quartz::TreeSet;
2              
3 1     1   27 use 5.006001;
  1         5  
  1         46  
4 1     1   7 use strict;
  1         3  
  1         36  
5 1     1   8 use warnings;
  1         2  
  1         787  
6              
7             our $VERSION = '0.05';
8              
9             sub new {
10 1923     1923 1 2594 my $class = shift;
11              
12 1923         2341 my $list = shift;
13              
14 1923 100       8299 my $self = {
15             _sorted => 0,
16             _array => defined $list ? $list : [],
17             _index => {}
18             };
19              
20 1923         11068 return bless $self, $class;
21             }
22              
23             sub size {
24 6883     6883 1 9121 return ( int @{ shift->{_array} } );
  6883         45724  
25             }
26              
27             sub contains {
28 9325     9325 1 13876 my $self = shift;
29              
30 9325         12581 my $value = shift;
31              
32 9325         51609 return ( exists $self->{_index}->{$value} );
33             }
34              
35             sub first_item {
36 1906     1906 1 6970 my $self = shift;
37              
38 1906 100       5109 if ( !$self->{_sorted} ) {
39 1586         3334 $self->_sort;
40             }
41              
42 1906 50       4717 return ( $self->size > 0 ? $self->{_array}->[0] : undef );
43             }
44              
45             sub last_item {
46 19     19 1 182 my $self = shift;
47 19 50       58 if ( !$self->{_sorted} ) {
48 19         156 $self->_sort;
49             }
50              
51 19 50       46 return ( $self->size > 0 ? $self->{_array}->[ $self->size - 1 ] : undef );
52             }
53              
54             sub add {
55 7036     7036 0 9707 my $self = shift;
56 7036         8382 my $value = shift;
57              
58 7036 50       12014 if ( !$self->contains($value) ) {
59 7036         14294 push @{ $self->{_array} }, $value;
  7036         21338  
60 7036         19005 $self->{_index}->{$value} = undef;
61 7036         11927 $self->{_sorted} = 0;
62             }
63              
64 7036         44932 return;
65             }
66              
67             sub to_array {
68 0     0 1 0 my $self = shift;
69            
70 0 0       0 if (!$self->{_sorted}) {
71 0         0 $self->_sort;
72             }
73            
74 0         0 return $self->{_array};
75             }
76              
77             sub tail_set {
78 1833     1833 1 20798 my $self = shift;
79 1833         2191 my $from_element = shift;
80              
81 1833 100       5196 if ( !$self->{_sorted} ) {
82 192         437 $self->_sort;
83             }
84              
85 1833         2830 my $idx;
86              
87 1833 100       3658 if ( $self->contains($from_element) ) {
88              
89             # try to find in index
90 1296         3493 $idx = $self->{_index}->{$from_element};
91             }
92             else {
93              
94             # find closest in array
95 537         623 foreach my $val ( @{ $self->{_array} } ) {
  537         2171  
96 568 100       1550 if ( $val >= $from_element ) {
97 277         553 $idx = int $self->{_index}->{$val};
98 277         510 CORE::last;
99             }
100             }
101             }
102              
103 1833         3320 my $result_set;
104              
105 1833 100       4871 if ( defined $idx ) {
106 1573         3213 my $size = $self->size - 1;
107              
108 1573         5557 $result_set = [ @{ $self->{_array} }[ $idx .. $size ] ];
  1573         8239  
109             }
110              
111 1833 100       12305 return ( defined $result_set ? ( ref $self )->new($result_set) : undef );
112             }
113              
114             # performs internal sorting and search index building
115             sub _sort {
116 1797     1797   2993 my $self = shift;
117              
118 1797 100       3419 if ( ( my $size = $self->size ) > 0 ) {
119 1795         2246 $self->{_array} = [ CORE::sort { $a <=> $b } @{ $self->{_array} } ];
  18968         22546  
  1795         6739  
120              
121             # build search index
122 1795         9185 foreach my $i ( 0 .. ( $size - 1 ) ) {
123 18655         48206 $self->{_index}->{ $self->{_array}->[$i] } = $i;
124             }
125             }
126              
127 1797         3757 $self->{_sorted} = 1;
128              
129 1797         3250 return;
130             }
131              
132             1;
133              
134             __END__