sn_network_get_hashval(): Return a 64bit integer value.
[sort-networks.git] / src / sn_network.c
index e7e3144..9dd2329 100644 (file)
@@ -82,24 +82,22 @@ sn_network_t *sn_network_create_odd_even_mergesort (int inputs_num) /* {{{ */
 {
   sn_network_t *n;
 
-  n = sn_network_create (inputs_num);
-
   assert (inputs_num > 0);
   if (inputs_num == 1)
   {
-    return (n);
+    return (sn_network_create (inputs_num));
   }
   if (inputs_num == 2)
   {
-    sn_stage_t *s;
     sn_comparator_t c;
 
+    n = sn_network_create (inputs_num);
+
+    memset (&c, 0, sizeof (c));
     c.min = 0;
     c.max = 1;
 
-    s = sn_stage_create (/* depth = */ 0);
-    sn_stage_comparator_add (s, &c);
-    sn_network_stage_add (n, s);
+    sn_network_comparator_add (n, &c);
 
     return (n);
   }
@@ -552,6 +550,22 @@ int sn_network_normalize (sn_network_t *n) /* {{{ */
   return (0);
 } /* }}} int sn_network_normalize */
 
+int sn_network_unify (sn_network_t *n) /* {{{ */
+{
+  int i;
+
+  if (n == NULL)
+    return (EINVAL);
+
+  sn_network_normalize (n);
+  sn_network_compress (n);
+
+  for (i = 0; i < n->stages_num; i++)
+    sn_stage_unify (n->stages[i]);
+
+  return (0);
+} /* }}} int sn_network_unify */
+
 int sn_network_remove_input (sn_network_t *n, int input) /* {{{ */
 {
   int i;
@@ -1173,4 +1187,20 @@ sn_network_t *sn_network_unserialize (char *buffer, /* {{{ */
   return (n);
 } /* }}} sn_network_t *sn_network_unserialize */
 
+uint64_t sn_network_get_hashval (const sn_network_t *n) /* {{{ */
+{
+  uint64_t hash;
+  int i;
+
+  if (n == NULL)
+    return (0);
+
+  hash = (uint64_t) n->inputs_num;
+
+  for (i = 0; i < n->stages_num; i++)
+    hash = (hash * 104207) + sn_stage_get_hashval (n->stages[i]);
+
+  return (hash);
+} /* }}} uint64_t sn_network_get_hashval */
+
 /* vim: set sw=2 sts=2 et fdm=marker : */