sub addU { my ($self, $item) = @_; my $key = $item->{key}; if (! exists $self->{$key}) { $self->{$key} = pack ('NN', 1, $item->{cond}); } else { my ($count, $flag) = unpack ('NN', $self->{$key}); $self->{$key} = pack ('NN', $count + 1, $flag || $item->{cond}); } } sub getFlagU { return (unpack ('NN', $_[0]->{$_[1]}))[1]; } sub getCountU { return (unpack ('NN', $_[0]->{$_[1]}))[0]; } sub addA { my ($self, $item) = @_; my $key = $item->{key}; if (! exists $self->{$key}) { $self->{$key} = [1, $item->{cond}] } else { $self->{$key}[0]++; $self->{$key}[1] ||= $item->{cond}; } } sub getFlagA { return $_[0]->{$_[1]}[1]; } sub getCountA { return $_[0]->{$_[1]}[0]; } sub addI { my ($self, $item) = @_; my $key = $item->{key}; if (! exists $self->{$key}) { $self->{$key} = 2 | !!$item->{cond}; } else { $self->{$key} += 2; $self->{$key} |= !!$item->{cond}; } } sub getFlagI { return int ($_[0]->{$_[1]} & 1); } sub getCountI { return int ($_[0]->{$_[1]} / 2); }