1package Math::Calc::Units::Convert::Combo; 2use base 'Math::Calc::Units::Convert::Base2Metric'; 3use strict; 4use vars qw(%units %metric_units %prefixable_metric_units %total_unit_map); 5use vars qw(%ranges %pref); 6 7%units = ( 8); 9 10%metric_units = ( 11); 12 13%prefixable_metric_units = ( bps => [ 1, { bit => 1, sec => -1 } ] ); 14 15%ranges = ( default => [ 1, 999 ] ); 16 17%pref = ( default => 1 ); 18 19sub canonical_unit { return; } 20 21sub unit_map { 22 my ($self) = @_; 23 if (keys %total_unit_map == 0) { 24 %total_unit_map = (%{$self->SUPER::unit_map()}, 25 %units, 26 %metric_units, 27 %prefixable_metric_units); 28 } 29 return \%total_unit_map; 30} 31 32# Singular("Mbps") is Mbps, not Mbp 33sub singular { 34 my ($self, $unit) = @_; 35 return $self->SUPER::singular($unit) unless $unit =~ /bps$/; 36 return $unit; 37} 38 39# demetric : string => mult x base 40# 41sub demetric { 42 my ($self, $string) = @_; 43 if (my $prefix = $self->get_prefix($string)) { 44 my $tail = lc($self->singular(substr($string, length($prefix)))); 45 if ($metric_units{$tail}) { 46 return ($self->get_metric($prefix), $tail); 47 } 48 } elsif (my $abbrev = $self->get_abbrev_prefix($string)) { 49 my $tail = lc($self->singular(substr($string, length($abbrev)))); 50 if ($prefixable_metric_units{$tail}) { 51 my $prefix = $self->get_abbrev($abbrev); 52 return ($self->get_metric($prefix), $tail); 53 } 54 } 55 56 return (1, $string); 57} 58 59# to_canonical : unitName -> amount x unitName 60# 61sub to_canonical { return; } 62 63sub lookup_compound { 64 my ($self, $unitName) = @_; 65 66 foreach (keys %units, keys %metric_units, keys %prefixable_metric_units) { 67 if (my $mult = $self->simple_convert($unitName, $_)) { 68 my $u = $units{$_} 69 || $metric_units{$_} 70 || $prefixable_metric_units{$_}; 71 return [ $mult * $u->[0], $u->[1] ]; 72 } 73 } 74 75 return; 76} 77 78sub get_ranges { 79 return \%ranges; 80} 81 82sub get_prefs { 83 return \%pref; 84} 85 861; 87