]> git.vpit.fr Git - perl/modules/Sub-Nary.git/commitdiff
Rewrite normalize in XS
authorVincent Pit <vince@profvince.com>
Fri, 8 Aug 2008 10:22:27 +0000 (12:22 +0200)
committerVincent Pit <vince@profvince.com>
Fri, 8 Aug 2008 10:22:27 +0000 (12:22 +0200)
Nary.xs
lib/Sub/Nary.pm

diff --git a/Nary.xs b/Nary.xs
index 0165a66cb947b058a20f7e20bb1251d957433108..116040c30e788468ee61455a2ca670e48adea5c9 100644 (file)
--- a/Nary.xs
+++ b/Nary.xs
@@ -86,6 +86,47 @@ CODE:
  }
  XSRETURN_NV(c);
 
+void
+normalize(SV *sv)
+PROTOTYPE: $
+PREINIT:
+ HV *hv, *res;
+ HE *key;
+ SV *val;
+ NV c = 0;
+CODE:
+ if (!SvOK(sv))
+  XSRETURN_UNDEF;
+ res = newHV();
+ if (!SvROK(sv)) {
+  val = newSVuv(1);
+  if (!hv_store_ent(res, sv, val, 0)) {
+   SvREFCNT_dec(val);
+   XSRETURN_UNDEF;
+  }
+ } else {
+  hv = (HV *) SvRV(sv);
+  if (!hv_iterinit(hv)) {
+   val = newSVuv(1);
+   if (!hv_store(res, "0", 1, val, 0)) {
+    SvREFCNT_dec(val);
+    XSRETURN_UNDEF;
+   }
+  } else {
+   while (key = hv_iternext(hv)) {
+    c += SvNV(HeVAL(key));
+   }
+   hv_iterinit(hv);
+   while (key = hv_iternext(hv)) {
+    val = newSVnv(SvNV(HeVAL(key)) / c);
+    if (!hv_store_ent(res, HeSVKEY_force(key), val, HeHASH(key)))
+     SvREFCNT_dec(val);
+   }
+  }
+ }
+ ST(0) = sv_2mortal(newRV_noinc((SV *) res));
+ XSRETURN(1);
+
 void
 scalops()
 PROTOTYPE:
index 6dc1820a15ae53e3b170fbbb64ebf2f0d9e1f7f8..bda8335f47b95803c87f56b0308866ea011f02cc 100644 (file)
@@ -178,14 +178,6 @@ sub name ($) {
  $n eq 'null' ? substr(ppname($_[0]->targ), 3) : $n
 }
 
-sub normalize ($) {
- my $r = $_[0];
- return unless defined $r;
- return { 0 => 1 } unless keys %$r;
- my $total = count $r;
- return { map { $_ => $r->{$_} / $total } keys %$r };
-}
-
 sub scale {
  my ($c, $r) = @_;
  return unless defined $r;