diff options
Diffstat (limited to 'lib/Devscripts/Set.pm')
-rw-r--r-- | lib/Devscripts/Set.pm | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/lib/Devscripts/Set.pm b/lib/Devscripts/Set.pm new file mode 100644 index 0000000..9ad4e1f --- /dev/null +++ b/lib/Devscripts/Set.pm @@ -0,0 +1,126 @@ +# Copyright Bill Allombert <ballombe@debian.org> 2001. +# Modifications copyright 2002 Julian Gilbey <jdg@debian.org> + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +package Devscripts::Set; + +use strict; + +BEGIN { + use Exporter (); + use vars qw(@EXPORT @ISA %EXPORT_TAGS); + @EXPORT = qw(SetMinus SetInter SetUnion); + @ISA = qw(Exporter); + %EXPORT_TAGS = (); +} + +# Several routines to work with arrays whose elements are unique +# (here called sets) + +=head1 NAME + +Devscripts::Set - Functions for handling sets. + +=head1 SYNOPSIS + +use Devscripts::Set; + +@set=ListToSet(@list); + +@setdiff=SetMinus(\@set1,\@set2); + +@setinter=SetInter(\@set1,\@set2); + +@setunion=SetUnion(\@set1,\@set2); + +=head1 DESCRIPTION + +ListToSet: Make a set (array with duplicates removed) from a list of +items given by an array. + +SetMinus, SetInter, SetUnion: Compute the set theoretic difference, +intersection, union of two sets given as arrays. + +=cut + +# Transforms a list to a set, removing duplicates +# input: list +# output: set + +sub ListToSet (@) { + my %items; + + grep $items{$_}++, @_; + + return keys %items; +} + +# Compute the set-theoretic difference of two sets. +# input: ref to Set 1, ref to Set 2 +# output: set + +sub SetMinus ($$) { + my ($set1, $set2) = @_; + my %items; + + grep $items{$_}++, @$set1; + grep $items{$_}--, @$set2; + + return grep $items{$_} > 0, keys %items; +} + +# Compute the set-theoretic intersection of two sets. +# input: ref to Set 1, ref to Set 2 +# output: set + +sub SetInter ($$) { + my ($set1, $set2) = @_; + my %items; + + grep $items{$_}++, @$set1; + grep $items{$_}++, @$set2; + + return grep $items{$_} == 2, keys %items; +} + +#Compute the set-theoretic union of two sets. +#input: ref to Set 1, ref to Set 2 +#output: set + +sub SetUnion ($$) { + my ($set1, $set2) = @_; + my %items; + + grep $items{$_}++, @$set1; + grep $items{$_}++, @$set2; + + return grep $items{$_} > 0, keys %items; +} + +1; + +=head1 AUTHOR + +Bill Allombert <ballombe@debian.org> + +=head1 COPYING + +Copyright 2001 Bill Allombert <ballombe@debian.org> +Modifications Copyright 2002 Julian Gilbey <jdg@debian.org> +dpkg-depcheck is free software, covered by the GNU General Public License, and +you are welcome to change it and/or distribute copies of it under +certain conditions. There is absolutely no warranty for dpkg-depcheck. + +=cut |