]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/vector.c
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / lib / vector.c
index 4af564a82ff8de47b4cce02a3f12dbf3fba7b9b1..bbea67c12f22e850e1f99fffffb06dd6f2973efb 100644 (file)
@@ -1,21 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
 /* Generic vector interface routine
  * Copyright (C) 1997 Kunihiro Ishiguro
- *
- * This file is part of GNU Zebra.
- *
- * GNU Zebra 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; either version 2, or (at your option) any
- * later version.
- *
- * GNU Zebra 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.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; see the file COPYING; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <zebra.h>
@@ -37,6 +22,7 @@ vector vector_init(unsigned int size)
 
        v->alloced = size;
        v->active = 0;
+       v->count = 0;
        v->index = XCALLOC(MTYPE_VECTOR_INDEX, sizeof(void *) * size);
        return v;
 }
@@ -54,6 +40,7 @@ vector vector_copy(vector v)
 
        new->active = v->active;
        new->alloced = v->alloced;
+       new->count = v->count;
 
        size = sizeof(void *) * (v->alloced);
        new->index = XCALLOC(MTYPE_VECTOR_INDEX, size);
@@ -84,6 +71,9 @@ int vector_empty_slot(vector v)
 {
        unsigned int i;
 
+       if (v->active == v->count)
+               return v->active;
+
        if (v->active == 0)
                return 0;
 
@@ -102,6 +92,10 @@ int vector_set(vector v, void *val)
        i = vector_empty_slot(v);
        vector_ensure(v, i);
 
+       if (v->index[i])
+               v->count--;
+       if (val)
+               v->count++;
        v->index[i] = val;
 
        if (v->active <= i)
@@ -115,6 +109,10 @@ int vector_set_index(vector v, unsigned int i, void *val)
 {
        vector_ensure(v, i);
 
+       if (v->index[i])
+               v->count--;
+       if (val)
+               v->count++;
        v->index[i] = val;
 
        if (v->active <= i)
@@ -123,17 +121,6 @@ int vector_set_index(vector v, unsigned int i, void *val)
        return i;
 }
 
-/* Make a specified index slot active and return its address. */
-void **vector_get_index(vector v, unsigned int i)
-{
-       vector_ensure(v, i);
-
-       if (v->active <= i)
-               v->active = i + 1;
-
-       return &v->index[i];
-}
-
 /* Look up vector.  */
 void *vector_lookup(vector v, unsigned int i)
 {
@@ -155,6 +142,9 @@ void vector_unset(vector v, unsigned int i)
        if (i >= v->alloced)
                return;
 
+       if (v->index[i])
+               v->count--;
+
        v->index[i] = NULL;
 
        if (i + 1 == v->active) {
@@ -169,6 +159,9 @@ void vector_remove(vector v, unsigned int ix)
        if (ix >= v->active)
                return;
 
+       if (v->index[ix])
+               v->count--;
+
        int n = (--v->active) - ix;
 
        memmove(&v->index[ix], &v->index[ix + 1], n * sizeof(void *));
@@ -192,6 +185,7 @@ void vector_unset_value(vector v, void *val)
        for (i = 0; i < v->active; i++)
                if (v->index[i] == val) {
                        v->index[i] = NULL;
+                       v->count--;
                        break;
                }
 
@@ -201,19 +195,6 @@ void vector_unset_value(vector v, void *val)
                while (i && v->index[--i] == NULL);
 }
 
-/* Count the number of not emplty slot. */
-unsigned int vector_count(vector v)
-{
-       unsigned int i;
-       unsigned count = 0;
-
-       for (i = 0; i < v->active; i++)
-               if (v->index[i] != NULL)
-                       count++;
-
-       return count;
-}
-
 void vector_to_array(vector v, void ***dest, int *argc)
 {
        *dest = XCALLOC(MTYPE_TMP, sizeof(void *) * v->active);