File Coverage

blib/lib/Data/Range/Compare/Stream/Iterator/File/MergeSortAsc/Stack.pm
Criterion Covered Total %
statement 53 53 100.0
branch 15 18 83.3
condition n/a
subroutine 10 10 100.0
pod 2 5 40.0
total 80 86 93.0


line stmt bran cond sub pod time code
1             package Data::Range::Compare::Stream::Iterator::File::MergeSortAsc::Stack;
2              
3 3     3   2095 use strict;
  3         6  
  3         96  
4 3     3   15 use warnings;
  3         4  
  3         73  
5              
6 3     3   967 use IO::File;
  3         1190  
  3         529  
7 3     3   15 use base qw(Data::Range::Compare::Stream::Iterator::File::Temp);
  3         6  
  3         2085  
8              
9             sub new {
10 14     14 0 457 my ($class,%args)=@_;
11 14         111 my $self=bless {next_stack_count=>0,stack_count=>0,%args},$class;
12              
13 14         106 $self->{next_stack}=$self->get_temp;
14              
15 14         350177 return $self;
16             }
17              
18             sub push {
19 103     103 1 5482 my ($self,$todo)=@_;
20 103         553 $self->{next_stack}->print($todo,"\n");
21 103         1247 $self->{next_stack_count}++;
22              
23             }
24              
25             sub has_next {
26 64     64 0 545 my ($self)=@_;
27 64 100       237 if($self->{stack_count}>1) {
28 35         200 return 2;
29             } else {
30 29         81 my $total=$self->{stack_count} + $self->{next_stack_count};
31 29 100       124 return 2 if $total>1;
32 19 100       123 return 1 if $total==1;
33             }
34 2         10 return 0;
35             }
36              
37             sub roll_stack {
38 24     24 0 42 my ($self)=@_;
39 24 100       72 if(defined($self->{stack})) {
40 10         48 $self->{stack}->close ;
41 10         214 unlink $self->{stack}->filename;
42             }
43 24         1139 $self->{stack_count}=$self->{next_stack_count};
44 24         40 $self->{next_stack_count}=0;
45 24         54 $self->{stack}=$self->{next_stack};
46 24         526 $self->{stack}->flush;
47 24         809 seek($self->{stack},0,0);
48 24         113 $self->{next_stack}=$self->get_temp;
49             }
50              
51             sub get_next {
52 103     103 1 190 my ($self)=@_;
53 103 100       394 $self->roll_stack unless defined($self->{stack});
54 103 100       6153 $self->roll_stack if $self->{stack_count}==0;
55              
56 103         8238 my $next=$self->{stack}->getline;
57 103         3367 --$self->{stack_count};
58 103         186 chomp($next);
59              
60 103         345 return $next;
61             }
62              
63             sub DESTROY {
64 14     14   603 my ($self)=@_;
65 14 50       40 return unless defined($self);
66 14 50       50 if(defined($self->{stack})) {
67 14         54 my $name=$self->{stack}->filename;
68 14         116 $self->{stack}->close;
69 14         1565 unlink $name;
70             }
71 14 50       58 if(defined($self->{next_stack})) {
72 14         56 my $name=$self->{next_stack}->filename;
73 14         114 $self->{next_stack}->close;
74 14         1069 unlink $name;
75             }
76             }
77              
78             1;