X-Git-Url: https://git.octo.it/?p=sort-networks.git;a=blobdiff_plain;f=src%2Fsn_stage.c;h=158446985371654b3e705644bd6d8e75f470ce6c;hp=ae61578099057eee7e7a4de7da3057f5c8ea015f;hb=785cb745f68b61aa83820a4f85a8c91a0e015228;hpb=9f77fbe43254d5920b3b1fac1ab0c01cc3a3adcc diff --git a/src/sn_stage.c b/src/sn_stage.c index ae61578..1584469 100644 --- a/src/sn_stage.c +++ b/src/sn_stage.c @@ -2,18 +2,19 @@ * 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 @@ -319,6 +320,24 @@ int sn_stage_shift (sn_stage_t *s, int sw, int inputs_num) 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; @@ -607,4 +626,47 @@ sn_stage_t *sn_stage_unserialize (char **ret_buffer, size_t *ret_buffer_size) 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 : */