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