1# 2# (c) Jan Gehring <jan.gehring@gmail.com> 3# 4# vim: set ts=2 sw=2 tw=0: 5# vim: set expandtab: 6 7package Rex::Shared::Var::Array; 8 9use 5.010001; 10use strict; 11use warnings; 12 13use Rex::Shared::Var::Common qw/__lock __store __retrieve/; 14 15our $VERSION = '1.13.4'; # VERSION 16 17sub TIEARRAY { 18 my $self = { varname => $_[1], }; 19 bless $self, $_[0]; 20} 21 22sub STORE { 23 my $self = shift; 24 my $index = shift; 25 my $value = shift; 26 27 return __lock sub { 28 my $ref = __retrieve; 29 my $ret = $ref->{ $self->{varname} }->{data}->[$index] = $value; 30 __store $ref; 31 32 return $ret; 33 }; 34} 35 36sub FETCH { 37 my $self = shift; 38 my $index = shift; 39 40 return __lock sub { 41 my $ref = __retrieve; 42 my $ret = $ref->{ $self->{varname} }->{data}->[$index]; 43 44 return $ret; 45 }; 46} 47 48sub CLEAR { 49 my $self = shift; 50 51 __lock sub { 52 my $ref = __retrieve; 53 $ref->{ $self->{varname} } = { data => [] }; 54 __store $ref; 55 }; 56} 57 58sub DELETE { 59 my $self = shift; 60 my $index = shift; 61 62 __lock sub { 63 my $ref = __retrieve; 64 delete $ref->{ $self->{varname} }->{data}->[$index]; 65 __store $ref; 66 }; 67} 68 69sub EXISTS { 70 my $self = shift; 71 my $index = shift; 72 73 return __lock sub { 74 my $ref = __retrieve; 75 return exists $ref->{ $self->{varname} }->{data}->[$index]; 76 }; 77} 78 79sub PUSH { 80 my $self = shift; 81 my @data = @_; 82 83 __lock sub { 84 my $ref = __retrieve; 85 86 if ( !ref( $ref->{ $self->{varname} }->{data} ) eq "ARRAY" ) { 87 $ref->{ $self->{varname} }->{data} = []; 88 } 89 90 push( @{ $ref->{ $self->{varname} }->{data} }, @data ); 91 92 __store $ref; 93 }; 94} 95 96sub UNSHIFT { 97 my $self = shift; 98 my @data = @_; 99 100 __lock sub { 101 my $ref = __retrieve; 102 103 if ( !ref( $ref->{ $self->{varname} }->{data} ) eq "ARRAY" ) { 104 $ref->{ $self->{varname} }->{data} = []; 105 } 106 107 unshift( @{ $ref->{ $self->{varname} }->{data} }, @data ); 108 109 __store $ref; 110 }; 111} 112 113sub SHIFT { 114 my $self = shift; 115 my @data = @_; 116 my $result; 117 118 __lock sub { 119 my $ref = __retrieve; 120 121 $result = shift( @{ $ref->{ $self->{varname} }->{data} } ); 122 123 __store $ref; 124 }; 125 126 return $result; 127} 128 129sub POP { 130 my $self = shift; 131 my @data = @_; 132 my $result; 133 134 __lock sub { 135 my $ref = __retrieve; 136 137 $result = pop( @{ $ref->{ $self->{varname} }->{data} } ); 138 139 __store $ref; 140 }; 141 142 return $result; 143} 144 145sub EXTEND { 146 my $self = shift; 147 my $count = shift; 148} 149 150sub STORESIZE { 151 my $self = shift; 152 my $newsize = shift; 153} 154 155sub FETCHSIZE { 156 my $self = shift; 157 158 return __lock sub { 159 my $ref = __retrieve; 160 if ( !exists $ref->{ $self->{varname} } ) { 161 return 0; 162 } 163 return scalar( @{ $ref->{ $self->{varname} }->{data} } ); 164 }; 165} 166 1671; 168