]>
git.proxmox.com Git - libgit2.git/blob - src/vector.h
2 * Copyright (C) 2009-2012 the libgit2 contributors
4 * This file is part of libgit2, distributed under the GNU GPL v2 with
5 * a Linking Exception. For full terms see the included COPYING file.
7 #ifndef INCLUDE_vector_h__
8 #define INCLUDE_vector_h__
10 #include "git2/common.h"
12 typedef int (*git_vector_cmp
)(const void *, const void *);
14 typedef struct git_vector
{
22 #define GIT_VECTOR_INIT {0}
24 int git_vector_init(git_vector
*v
, size_t initial_size
, git_vector_cmp cmp
);
25 void git_vector_free(git_vector
*v
);
26 void git_vector_clear(git_vector
*v
);
27 int git_vector_dup(git_vector
*v
, const git_vector
*src
, git_vector_cmp cmp
);
28 void git_vector_swap(git_vector
*a
, git_vector
*b
);
30 void git_vector_sort(git_vector
*v
);
32 /** Linear search for matching entry using internal comparison function */
33 int git_vector_search(const git_vector
*v
, const void *entry
);
35 /** Linear search for matching entry using explicit comparison function */
36 int git_vector_search2(const git_vector
*v
, git_vector_cmp cmp
, const void *key
);
39 * Binary search for matching entry using explicit comparison function that
40 * returns position where item would go if not found.
42 int git_vector_bsearch3(
43 size_t *at_pos
, git_vector
*v
, git_vector_cmp cmp
, const void *key
);
45 /** Binary search for matching entry using internal comparison function */
46 GIT_INLINE(int) git_vector_bsearch(git_vector
*v
, const void *key
)
48 return git_vector_bsearch3(NULL
, v
, v
->_cmp
, key
);
51 /** Binary search for matching entry using explicit comparison function */
52 GIT_INLINE(int) git_vector_bsearch2(
53 git_vector
*v
, git_vector_cmp cmp
, const void *key
)
55 return git_vector_bsearch3(NULL
, v
, cmp
, key
);
58 GIT_INLINE(void *) git_vector_get(const git_vector
*v
, size_t position
)
60 return (position
< v
->length
) ? v
->contents
[position
] : NULL
;
63 #define GIT_VECTOR_GET(V,I) ((I) < (V)->length ? (V)->contents[(I)] : NULL)
65 GIT_INLINE(void *) git_vector_last(const git_vector
*v
)
67 return (v
->length
> 0) ? git_vector_get(v
, v
->length
- 1) : NULL
;
70 #define git_vector_foreach(v, iter, elem) \
71 for ((iter) = 0; (iter) < (v)->length && ((elem) = (v)->contents[(iter)], 1); (iter)++ )
73 #define git_vector_rforeach(v, iter, elem) \
74 for ((iter) = (v)->length; (iter) > 0 && ((elem) = (v)->contents[(iter)-1], 1); (iter)-- )
76 int git_vector_insert(git_vector
*v
, void *element
);
77 int git_vector_insert_sorted(git_vector
*v
, void *element
,
78 int (*on_dup
)(void **old
, void *new));
79 int git_vector_remove(git_vector
*v
, size_t idx
);
80 void git_vector_pop(git_vector
*v
);
81 void git_vector_uniq(git_vector
*v
);
82 void git_vector_remove_matching(
83 git_vector
*v
, int (*match
)(const git_vector
*v
, size_t idx
));
85 int git_vector_resize_to(git_vector
*v
, size_t new_length
);
86 int git_vector_set(void **old
, git_vector
*v
, size_t position
, void *value
);