File Coverage

blib/lib/Array/AsObject.pm
Criterion Covered Total %
statement 405 471 85.9
branch 151 194 77.8
condition 33 42 78.5
subroutine 43 47 91.4
pod 41 41 100.0
total 673 795 84.6


line stmt bran cond sub pod time code
1             package Array::AsObject;
2             # Copyright (c) 2009-2010 Sullivan Beck. All rights reserved.
3             # This program is free software; you can redistribute it and/or modify it
4             # under the same terms as Perl itself.
5              
6             ###############################################################################
7              
8             require 5.004;
9              
10 5     5   3856 use warnings;
  5         9  
  5         178  
11 5     5   27 use strict;
  5         9  
  5         201  
12 5     5   6060 use Sort::DataTypes qw(sort_by_method sort_valid_method);
  5         96044  
  5         724  
13              
14 5     5   137 use vars qw($VERSION);
  5         9  
  5         28273  
15             $VERSION = "1.02";
16              
17             ###############################################################################
18             # BASE METHODS
19             ###############################################################################
20              
21             sub new {
22 30     30 1 15482 my($class,@array) = @_;
23              
24 30         95 my $self = {
25             "set" => [],
26             "err" => "",
27             };
28 30         67 bless $self, $class;
29              
30 30 100       127 $self->list(@array) if (@array);
31 30         81 return $self;
32             }
33              
34             sub version {
35 0     0 1 0 my($self) = @_;
36              
37 0         0 return $VERSION;
38             }
39              
40             sub err {
41 246     246 1 556 my($self) = @_;
42              
43 246 100       532 return 1 if ($$self{"err"});
44 237         972 return 0;
45             }
46              
47             sub errmsg {
48 0     0 1 0 my($self) = @_;
49              
50 0         0 return $$self{"err"};
51             }
52              
53             ###############################################################################
54             # LIST EXAMINATION METHODS
55             ###############################################################################
56              
57             sub as_hash {
58 6     6 1 1174 my($self,$full) = @_;
59 6         12 $$self{"err"} = "";
60              
61 6 100       11 if ($full) {
62              
63 3         3 my %count;
64             my %vals;
65 0         0 my %refs;
66 0         0 my %scal;
67 0         0 my $undef;
68 3         4 my $label = 1;
69 3         3 foreach my $ele (@{ $$self{"set"} }) {
  3         6  
70 15 50       30 if (! defined $ele) {
    100          
71 0 0       0 if ($undef) {
72 0         0 $count{$undef}++;
73             } else {
74 0         0 $undef = $label++;
75 0         0 $vals{$undef} = undef;
76 0         0 $count{$undef} = 1;
77             }
78             } elsif (ref($ele)) {
79 4         4 my $s = scalar($ele);
80 4         4 my $l;
81 4 100       9 if (exists $refs{$s}) {
82 1         3 $l = $refs{$s};
83 1         2 $count{$l}++;
84             } else {
85 3         6 $l = $label++;
86 3         5 $refs{$s} = $l;
87 3         4 $vals{$l} = $ele;
88 3         5 $count{$l} = 1;
89             }
90             } else {
91 11         9 my $l;
92 11 100       22 if (exists $scal{$ele}) {
93 4         5 $l = $scal{$ele};
94 4         7 $count{$l}++;
95             } else {
96 7         6 $l = $label++;
97 7         10 $scal{$ele} = $l;
98 7         11 $vals{$l} = $ele;
99 7         11 $count{$l} = 1;
100             }
101             }
102             }
103              
104 3         58 return (\%count, \%vals);
105              
106             } else {
107              
108 3         3 my %tmp;
109 3         4 foreach my $ele (@{ $$self{"set"} }) {
  3         6  
110 15 100 66     54 next if (! defined $ele || ref($ele));
111 11 100       16 if (exists $tmp{$ele}) {
112 4         8 $tmp{$ele}++;
113             } else {
114 7         492 $tmp{$ele} = 1;
115             }
116             }
117              
118 3         18 return %tmp;
119              
120             }
121             }
122              
123             sub at {
124 14     14 1 3532 my($self,@n) = @_;
125 14         926 $$self{"err"} = "";
126              
127 14 50 100     114 if (! @n) {
    100          
128 0         0 $$self{"err"} = "Index required";
129 0         0 return undef;
130             } elsif ($#n > 0 && ! wantarray) {
131 2         5 $$self{"err"} = "In scalar context, only a single index allowed";
132 2         9 return undef;
133             }
134              
135 12         24 my @list = @{ $$self{"set"} };
  12         42  
136 12 50       40 if (! @list) {
137 0         0 $$self{"err"} = "Operation (at) invalid with empty list";
138 0         0 return undef;
139             }
140              
141 12         20 my(@ret);
142 12         26 my $len = $#list + 1;
143              
144 12         26 foreach my $n (@n) {
145 14 100       96 if ($n =~ /^[+-]?\d+$/) {
146 12 100 100     91 if ($n < -$len || $n > $len-1) {
147 4         10 $$self{"err"} = "Index out of range";
148 4         19 return undef;
149             }
150 8         31 CORE::push(@ret,$list[$n]);
151             } else {
152 2         6 $$self{"err"} = "Index must be an integer";
153 2         14 return undef;
154             }
155             }
156              
157 6 100       21 if (wantarray) {
158 4         24 return @ret;
159             } else {
160 2         10 return $ret[0];
161             }
162             }
163              
164             sub count {
165 36     36 1 517 my($self,$val) = @_;
166 36         64 my @idx = $self->index($val);
167 36 50       63 return undef if ($self->err());
168              
169 36         119 return $#idx + 1;
170             }
171              
172             sub exists {
173 74     74 1 650 my($self,@val) = @_;
174 74 100       145 @val = (undef) if (! @val);
175              
176 74         105 foreach my $val (@val) {
177 76         133 my @idx = $self->index($val);
178 76 50       174 return undef if ($self->err());
179 76 100       279 return 0 if (! @idx);
180             }
181 49         159 return 1;
182             }
183              
184             sub first {
185 1     1 1 89 my($self) = @_;
186 1         3 $$self{"err"} = "";
187              
188 1         1 my @list = @{ $$self{"set"} };
  1         3  
189 1 50       4 if (! @list) {
190 0         0 $$self{"err"} = "Operation (first) invalid with empty list";
191 0         0 return undef;
192             }
193              
194 1         4 return $list[0];
195             }
196              
197             sub last {
198 1     1 1 82 my($self) = @_;
199 1         2 $$self{"err"} = "";
200              
201 1         2 my @list = @{ $$self{"set"} };
  1         3  
202 1 50       3 if (! @list) {
203 0         0 $$self{"err"} = "Operation (first) invalid with empty list";
204 0         0 return undef;
205             }
206              
207 1         3 return $list[$#list];
208             }
209              
210             sub index {
211 185     185 1 1870 my($self,$val) = @_;
212 185         264 $$self{"err"} = "";
213              
214 185         225 my @idx = ();
215 185         183 my @list = @{ $$self{"set"} };
  185         431  
216              
217 185         469 for (my $i=0; $i<=$#list; $i++) {
218 625         752 my $ele = $list[$i];
219 625 100       963 CORE::push(@idx,$i) if (_eq($self,$val,$ele));
220             }
221              
222 185 100       320 if (wantarray) {
    100          
223 156         434 return @idx;
224             } elsif (@idx) {
225 23         100 return $idx[0];
226             } else {
227 6         17 return -1;
228             }
229             }
230              
231             sub rindex {
232 33     33 1 305 my($self,$val) = @_;
233 33         62 my @idx = $self->index($val);
234              
235 33 100       63 if (wantarray) {
    100          
236 25         65 return CORE::reverse(@idx);
237             } elsif (@idx) {
238 5         13 return $idx[$#idx];
239             } else {
240 3         6 return -1;
241             }
242             }
243              
244             sub is_empty {
245 6     6 1 682 my($self,$undef) = @_;
246 6         9 $$self{"err"} = "";
247              
248 6         7 my @list = @{ $$self{"set"} };
  6         18  
249 6 100       20 return 1 if ($#list == -1);
250              
251 4         7 foreach my $ele (@list) {
252 5 100 100     22 next if ($undef && ! defined $ele);
253 3         10 return 0;
254             }
255              
256 1         4 return 1;
257             }
258              
259             sub length {
260 5     5 1 4224 my($self) = @_;
261 5         18 $$self{"err"} = "";
262              
263 5         6 return $#{ $$self{"set"} } + 1;
  5         20  
264             }
265              
266             sub list {
267 81     81 1 6486 my($self,@list) = @_;
268 81         151 $$self{"err"} = "";
269              
270 81 100       151 if (@list) {
271 40         105 $$self{"set"} = [@list];
272 40         121 return;
273             } else {
274 41         41 return @{ $$self{"set"} };
  41         179  
275             }
276             }
277              
278             sub _eq {
279 625     625   733 my($self,$val1,$val2) = @_;
280              
281 625 100 100     5366 if (! defined $val1 && ! defined $val2) {
    100 100        
    100 100        
    100 66        
    100 100        
282 20         71 return 1;
283             } elsif (! defined $val1 || ! defined $val2) {
284 121         429 return 0;
285              
286             } elsif (ref($val1) && ref($val2) && scalar($val1) eq scalar($val2)) {
287 8         35 return 1;
288             } elsif (ref($val1) || ref($val2)) {
289 28         108 return 0;
290              
291             } elsif ($val1 eq $val2) {
292 183         750 return 1;
293             } else {
294 265         979 return 0;
295             }
296             }
297              
298             ###############################################################################
299             # SIMPLE LIST MODIFICATION METHODS
300             ###############################################################################
301              
302             sub clear {
303 3     3 1 257 my($self,$undef) = @_;
304 3         4 $$self{"err"} = "";
305              
306 3 100       7 if ($undef) {
307 1         1 foreach my $ele (@{ $$self{"set"} }) {
  1         3  
308 2         3 $ele = undef;
309             }
310              
311             } else {
312 2         6 $$self{"set"} = [];
313             }
314              
315 3         10 return;
316             }
317              
318             sub compact {
319 1     1 1 144 my($self) = @_;
320 1         3 $$self{"err"} = "";
321              
322 1         2 my @list = ();
323 1         2 foreach my $ele (@{ $$self{"set"} }) {
  1         3  
324 5 100       17 CORE::push(@list,$ele) if (defined $ele);
325             }
326 1         5 $$self{"set"} = [@list];
327 1         5 return;
328             }
329              
330             sub delete {
331 32     32 1 658 my($self,$all,$undef,@val) = @_;
332 32         47 $$self{"err"} = "";
333              
334 32         48 foreach my $val (@val) {
335 36         35 my(@idx);
336 36 100       61 if ($all) {
337 15         35 @idx = $self->rindex($val);
338 15 100       40 next if (! @idx);
339             } else {
340 21         49 my $idx = $self->index($val);
341 21 100       54 next if ($idx == -1);
342 18         28 @idx = ($idx);
343             }
344              
345 30 100       52 if ($undef) {
346 4         7 foreach my $idx (@idx) {
347 7         20 $$self{"set"}[$idx] = undef;
348             }
349             } else {
350 26         41 foreach my $idx (@idx) {
351 32         32 CORE::splice(@{ $$self{"set"} },$idx,1);
  32         117  
352             }
353             }
354             }
355 32         74 return;
356             }
357              
358             sub delete_at {
359 2     2 1 227 my($self,$undef,@idx) = @_;
360 2         4 $$self{"err"} = "";
361              
362 2         3 my @list = @{ $$self{"set"} };
  2         6  
363 2         4 foreach my $idx (@idx) {
364 6 50       23 if ($idx !~ /^[+-]?\d+$/) {
365 0         0 $$self{"err"} = "Index must be an integer";
366 0         0 return undef;
367             }
368 6 50 33     25 if ($idx < -($#list + 1) ||
369             $idx > $#list) {
370 0         0 $$self{"err"} = "Index out of bounds";
371 0         0 return undef;
372             }
373 6 50       13 if ($idx < 0) {
374 0         0 $idx = $#list + 1 + $idx;
375             }
376             }
377 2         7 @idx = sort { $b <=> $a } @idx;
  4         6  
378              
379 2 100       4 if ($undef) {
380 1         2 foreach my $idx (@idx) {
381 3         9 $$self{"set"}[$idx] = undef;
382             }
383             } else {
384 1         2 foreach my $idx (@idx) {
385 3         3 CORE::splice(@{ $$self{"set"} },$idx,1);
  3         7  
386             }
387             }
388 2         8 return;
389             }
390              
391             sub fill {
392 7     7 1 800 my($self,$val,$start,$length) = @_;
393 7         14 $$self{"err"} = "";
394              
395 7         6 my @list = @{ $$self{"set"} };
  7         20  
396              
397 7 100       16 $start = 0 if (! $start);
398 7 50       26 if ($start !~ /^[+-]?\d+$/) {
399 0         0 $$self{"err"} = "Start must be an integer";
400 0         0 return undef;
401             }
402 7 100 66     119 if ($start < -($#list + 1) ||
403             $start > $#list + 1) {
404 1         3 $$self{"err"} = "Start out of bounds";
405 1         3 return undef;
406             }
407 6 100       15 if ($start < 0) {
408 1         2 $start = $#list + 1 + $start;
409             }
410              
411 6 100       10 if (! defined $length) {
412 4 100       9 if ($start > $#list) {
413 1         2 $length = 1;
414             } else {
415 3         5 $length = ($#list + 1 - $start);
416             }
417             }
418              
419 6 50       23 if ($length !~ /^\d+$/) {
420 0         0 $$self{"err"} = "Length must be an unsigned integer";
421 0         0 return undef;
422             }
423 6         8 my $end = $start + $length - 1;
424              
425 6         12 foreach my $i ($start..$end) {
426 15         22 $list[$i] = $val;
427             }
428              
429 6         20 $$self{"set"} = [@list];
430 6         20 return;
431             }
432              
433             sub min {
434 2     2 1 213 my($self,$method,@args) = @_;
435              
436 2 100       7 if (! defined $method) {
437 1         2 $method = "numerical";
438             }
439              
440 2         6 my(@list) = _sort($self,$method,@args);
441 2 50       5 return undef if ($self->err());
442              
443 2         8 return $list[0];
444             }
445              
446             sub max {
447 2     2 1 221 my($self,$method,@args) = @_;
448              
449 2 100       6 if (! defined $method) {
450 1         2 $method = "numerical";
451             }
452              
453 2         5 my(@list) = _sort($self,$method,@args);
454 2 50       5 return undef if ($self->err());
455              
456 2         8 return $list[$#list];
457             }
458              
459             sub pop {
460 1     1 1 101 my($self) = @_;
461 1         2 $$self{"err"} = "";
462              
463 1         2 my $val = CORE::pop @{ $$self{"set"} };
  1         3  
464 1         3 return $val;
465             }
466              
467             sub shift {
468 1     1 1 124 my($self) = @_;
469 1         3 $$self{"err"} = "";
470              
471 1         2 my $val = CORE::shift @{ $$self{"set"} };
  1         4  
472 1         5 return $val;
473             }
474              
475             sub push {
476 11     11 1 121 my($self,@list) = @_;
477 11         18 $$self{"err"} = "";
478              
479 11         10 CORE::push(@{ $$self{"set"} },@list);
  11         23  
480 11         21 return;
481             }
482              
483             sub unshift {
484 1     1 1 108 my($self,@list) = @_;
485 1         2 $$self{"err"} = "";
486              
487 1         2 CORE::unshift(@{ $$self{"set"} },@list);
  1         3  
488 1         3 return;
489             }
490              
491             sub randomize {
492 0     0 1 0 my($self) = @_;
493 0         0 $self->sort("random");
494             }
495              
496             sub reverse {
497 1     1 1 116 my($self) = @_;
498 1         3 $$self{"err"} = "";
499              
500 1         2 my @list = @{ $$self{"set"} };
  1         4  
501 1         3 $$self{"set"} = [ CORE::reverse(@list) ];
502 1         4 return;
503             }
504              
505             sub rotate {
506 5     5 1 497 my($self,$n) = @_;
507 5 100       10 $n = 1 if (! defined $n);
508 5         8 $$self{"err"} = "";
509              
510 5 50       24 if ($n !~ /^[+-]?\d+$/) {
511 0         0 $$self{"err"} = "Rotation number must be an integer";
512 0         0 return undef;
513             }
514              
515 5         5 my @list = @{ $$self{"set"} };
  5         16  
516 5 100       14 if ($n > 0) {
    50          
517 3         9 for (my $i=1; $i<=$n; $i++) {
518 5         13 CORE::push(@list,CORE::shift(@list));
519             }
520             } elsif ($n < 0) {
521 2         3 $n *= -1;
522 2         6 for (my $i=1; $i<=$n; $i++) {
523 4         10 CORE::unshift(@list,CORE::pop(@list));
524             }
525             }
526              
527 5         15 $$self{"set"} = [@list];
528 5         20 return;
529             }
530              
531             sub set {
532 2     2 1 222 my($self,$index,$val) = @_;
533 2         4 $$self{"err"} = "";
534              
535 2 50       5 if (! defined $index) {
536 0         0 $$self{"err"} = "Index required";
537 0         0 return undef;
538             }
539              
540 2         4 my @list = @{ $$self{"set"} };
  2         6  
541              
542 2 50       10 if ($index !~ /^[+-]?\d+$/) {
543 0         0 $$self{"err"} = "Index must be an integer";
544 0         0 return undef;
545             }
546 2 50 33     13 if ($index < -($#list + 1) ||
547             $index > $#list) {
548 0         0 $$self{"err"} = "Index out of bounds";
549 0         0 return undef;
550             }
551              
552 2         5 $$self{"set"}[$index] = $val;
553 2         6 return;
554             }
555              
556             sub sort {
557 2     2 1 207 my($self,$method,@args) = @_;
558              
559 2 100       6 if (! defined $method) {
560 1         2 $method = "alphabetic";
561             }
562              
563 2         3 my(@list) = _sort($self,$method,@args);
564 2 50       6 return undef if ($self->err());
565              
566 2         7 $$self{"set"} = [@list];
567 2         7 return;
568             }
569              
570             sub _sort {
571 6     6   12 my($self,$method,@args) = @_;
572 6         11 $$self{"err"} = "";
573              
574 6 50       15 if (! sort_valid_method($method)) {
575 0         0 $$self{"err"} = "Invalid sort method";
576 0         0 return undef;
577             }
578              
579 6         34 my @list = @{ $$self{"set"} };
  6         19  
580 6         18 sort_by_method($method,\@list,@args);
581 6         852 return @list;
582             }
583              
584             sub splice {
585 3     3 1 403 my($self,$start,$length,@vals) = @_;
586 3         5 $$self{"err"} = "";
587              
588 3         3 my @list = @{ $$self{"set"} };
  3         12  
589              
590 3 50       6 $start = 0 if (! $start);
591 3 50       14 if ($start !~ /^[+-]?\d+$/) {
592 0         0 $$self{"err"} = "Start must be an integer";
593 0         0 return undef;
594             }
595 3 50 33     22 if ($start < -($#list + 1) ||
596             $start > $#list) {
597 0         0 $$self{"err"} = "Start out of bounds";
598 0         0 return undef;
599             }
600 3 100       8 if ($start < 0) {
601 1         3 $start = $#list + 1 + $start;
602             }
603              
604 3 50       9 if (! defined $length) {
605 0 0       0 if ($start > $#list) {
606 0         0 $length = 1;
607             } else {
608 0         0 $length = ($#list + 1 - $start);
609             }
610             }
611              
612 3 50       10 if ($length !~ /^\d+$/) {
613 0         0 $$self{"err"} = "Length must be an unsigned integer";
614 0         0 return undef;
615             }
616 3         5 my $end = $start + $length - 1;
617              
618 3         8 my @ret = CORE::splice(@list,$start,$length,@vals);
619              
620 3         9 $$self{"set"} = [@list];
621 3         14 return @ret;
622             }
623              
624             sub unique {
625 2     2 1 115 my($self) = @_;
626 2         6 $$self{"err"} = "";
627              
628 2         4 my @list = ();
629 2         6 my %list = ();
630 2         4 my $undef = 0;
631              
632 2         4 foreach my $ele (@{ $$self{"set"} }) {
  2         6  
633 12 50       38 if (! defined($ele)) {
    100          
634 0 0       0 if (! $undef) {
635 0         0 CORE::push(@list,$ele);
636 0         0 $undef = 1;
637             }
638             } elsif (! CORE::exists $list{$ele}) {
639 7         26 CORE::push(@list,$ele);
640 7         16 $list{$ele} = 1;
641             }
642             }
643 2         9 $$self{"set"} = [@list];
644 2         10 return;
645             }
646              
647             ###############################################################################
648             # SET METHODS
649             ###############################################################################
650              
651             sub difference {
652 2     2 1 299 my($obj1,$obj2,$unique) = @_;
653              
654 2         3 my @list = @{ $$obj1{"set"} };
  2         7  
655 2         4 my $class = ref($obj1);
656 2         4 my $ret = new $class;
657              
658 2 50       6 if (ref($obj2) ne $class) {
659 0         0 $$ret{"err"} = "Obj2 not of the right class";
660 0         0 return $ret;
661             }
662              
663             # $ret starts as identical to $obj1
664             # remove every element in $obj2 from $ret
665              
666 2         5 $ret->list(@list);
667 2 100       21 my $all = ($unique ? 1 : 0);
668 2         3 foreach my $ele (@{ $$obj2{"set"} }) {
  2         5  
669 10         23 $ret->delete($all,0,$ele);
670             }
671              
672 2         7 return $ret;
673             }
674              
675             sub intersection {
676 2     2 1 286 my($obj1,$obj2,$unique) = @_;
677              
678 2         3 my $class = ref($obj1);
679 2         5 my $ret = new $class;
680              
681 2 50       6 if (ref($obj2) ne $class) {
682 0         0 $$ret{"err"} = "Obj2 not of the right class";
683 0         0 return $ret;
684             }
685              
686             # $tmp is identical to $obj2
687             # foreach element in $obj1
688             # if it's in $tmp
689             # add it to $ret
690             # remove it from $tmp
691              
692 2         5 my $tmp = new $class;
693 2         3 $tmp->list(@{ $$obj2{"set"} });
  2         5  
694 2 100       5 my $all = ($unique ? 1 : 0);
695              
696 2         3 my @list = @{ $$obj1{"set"} };
  2         5  
697 2         5 foreach my $ele (@list) {
698 8 100       20 if ($tmp->exists($ele)) {
699 5         12 $ret->push($ele);
700 5         10 $tmp->delete($all,0,$ele);
701             }
702             }
703              
704 2         11 return $ret;
705             }
706              
707             sub is_equal {
708 8     8 1 569 my($obj1,$obj2,$unique) = @_;
709              
710 8         13 my $class = ref($obj1);
711              
712 8 50       19 if (ref($obj2) ne $class) {
713 0         0 return undef;
714             }
715              
716 8         11 my @list1 = @{ $$obj1{"set"} };
  8         22  
717 8         9 my @list2 = @{ $$obj2{"set"} };
  8         18  
718              
719 8 100       17 if ($unique) {
720 4         7 foreach my $ele (@list1) {
721 10 50       22 return 0 if (! $obj2->exists($ele));
722             }
723 4         12 foreach my $ele (@list2) {
724 8 50       17 return 0 if (! $obj1->exists($ele));
725             }
726 4         16 return 1;
727             }
728              
729 4         7 foreach my $ele (@list1,@list2) {
730 10 100       25 return 0 if ($obj1->count($ele) != $obj2->count($ele));
731             }
732 2         8 return 1;
733             }
734              
735             sub not_equal {
736 4     4 1 503 return 1 - is_equal(@_);
737             }
738              
739             sub is_subset {
740 5     5 1 656 my($obj1,$obj2,$unique) = @_;
741              
742 5         11 my $class = ref($obj1);
743              
744 5 50       12 if (ref($obj2) ne $class) {
745 0         0 return undef;
746             }
747              
748 5         6 my @list = @{ $$obj2{"set"} };
  5         15  
749              
750 5 100       11 if ($unique) {
751 2         4 foreach my $ele (@list) {
752 5 50       10 return 0 if (! $obj1->exists($ele));
753             }
754 2         6 return 1;
755             }
756              
757 3         5 foreach my $ele (@list) {
758 6 100       15 return 0 if ($obj2->count($ele) > $obj1->count($ele));
759             }
760 2         10 return 1;
761             }
762              
763             sub not_subset {
764 0     0 1 0 return 1 - is_subset(@_);
765             }
766              
767             sub symmetric_difference {
768 2     2 1 283 my($obj1,$obj2,$unique) = @_;
769              
770 2         4 my $class = ref($obj1);
771 2         5 my $ret = new $class;
772              
773 2 50       7 if (ref($obj2) ne $class) {
774 0         0 $$ret{"err"} = "Obj2 not of the right class";
775 0         0 return $ret;
776             }
777              
778 2         6 my $tmp1 = new $class;
779 2         3 my @list1 = @{ $$obj1{"set"} };
  2         7  
780 2         5 $tmp1->list(@list1);
781              
782 2         3 my $tmp2 = new $class;
783 2         3 my @list2 = @{ $$obj2{"set"} };
  2         6  
784 2         4 $tmp2->list(@list2);
785              
786 2 100       6 my $all = ($unique ? 1 : 0);
787              
788 2         5 foreach my $ele (@list1,@list2) {
789 14 100 100     31 if ($tmp1->exists($ele) && $tmp2->exists($ele)) {
    100          
    50          
790 4         9 $tmp1->delete($all,0,$ele);
791 4         10 $tmp2->delete($all,0,$ele);
792             } elsif ($tmp1->exists($ele)) {
793 5         13 $ret->push($ele);
794 5         12 $tmp1->delete(0,0,$ele);
795             } elsif ($tmp2->exists($ele)) {
796 0         0 $ret->push($ele);
797 0         0 $tmp2->delete(0,0,$ele);
798             }
799             }
800              
801 2         13 return $ret;
802             }
803              
804             sub union {
805 2     2 1 1645 my($obj1,$obj2,$unique) = @_;
806              
807 2         5 my $class = ref($obj1);
808 2         106 my $ret = new $class;
809              
810 2 50       6 if (ref($obj2) ne $class) {
811 0         0 $$ret{"err"} = "Obj2 not of the right class";
812 0         0 return $ret;
813             }
814              
815 2         5 my @list1 = @{ $$obj1{"set"} };
  2         10  
816 2         8 my @list2 = @{ $$obj2{"set"} };
  2         8  
817              
818 2         7 $ret->list(@list1,@list2);
819 2 100       9 if ($unique) {
820 1         4 $ret->unique();
821             }
822              
823 2         8 return $ret;
824             }
825              
826             1;
827             # Local Variables:
828             # mode: cperl
829             # indent-tabs-mode: nil
830             # cperl-indent-level: 3
831             # cperl-continued-statement-offset: 2
832             # cperl-continued-brace-offset: 0
833             # cperl-brace-offset: 0
834             # cperl-brace-imaginary-offset: 0
835             # cperl-label-offset: -2
836             # End: