* libsortnetwork - src/sn_stage.c
* Copyright (C) 2008-2010 Florian octo Forster
*
- * 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; only version 2 of the License is applicable.
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 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.
+ * This library 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 Lesser General Public License
+ * for more details.
*
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Authors:
* Florian octo Forster <ff at octo.it>
return (0);
} /* int sn_stage_shift */
+static int sn_stage_unify__qsort_callback (const void *p0, const void *p1) /* {{{ */
+{
+ return (sn_comparator_compare (p0, p1));
+} /* }}} int sn_stage_unify__qsort_callback */
+
+int sn_stage_unify (sn_stage_t *s) /* {{{ */
+{
+ if (s == NULL)
+ return (EINVAL);
+
+ qsort (s->comparators,
+ (size_t) s->comparators_num,
+ sizeof (*s->comparators),
+ sn_stage_unify__qsort_callback);
+
+ return (0);
+} /* }}} int sn_stage_unify */
+
int sn_stage_swap (sn_stage_t *s, int con0, int con1)
{
int i;
return (s);
} /* sn_stage_t *sn_stage_unserialize */
-/* vim: set shiftwidth=2 softtabstop=2 expandtab : */
+int sn_stage_compare (const sn_stage_t *s0, const sn_stage_t *s1) /* {{{ */
+{
+ int status;
+ int i;
+
+ if (s0 == s1)
+ return (0);
+ else if (s0 == NULL)
+ return (-1);
+ else if (s1 == NULL)
+ return (1);
+
+ if (s0->comparators_num < s1->comparators_num)
+ return (-1);
+ else if (s0->comparators_num > s1->comparators_num)
+ return (1);
+
+ for (i = 0; i < s0->comparators_num; i++)
+ {
+ status = sn_comparator_compare (s0->comparators + i, s1->comparators + i);
+ if (status != 0)
+ return (status);
+ }
+
+ return (0);
+} /* }}} int sn_stage_compare */
+
+uint64_t sn_stage_get_hashval (const sn_stage_t *s) /* {{{ */
+{
+ uint64_t hash;
+ int i;
+
+ if (s == NULL)
+ return (0);
+
+ hash = (uint64_t) s->depth;
+
+ for (i = 0; i < s->comparators_num; i++)
+ hash = (hash * 99991) + sn_comparator_get_hashval (s->comparators + i);
+
+ return (hash);
+} /* }}} uint64_t sn_stage_get_hashval */
+
+/* vim: set shiftwidth=2 softtabstop=2 expandtab fdm=marker : */