]>
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
, 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 int git_vector_search(git_vector
*v
, const void *entry
);
33 int git_vector_search2(git_vector
*v
, git_vector_cmp cmp
, const void *key
);
35 int git_vector_bsearch3(
36 unsigned int *at_pos
, git_vector
*v
, git_vector_cmp cmp
, const void *key
);
38 GIT_INLINE(int) git_vector_bsearch(git_vector
*v
, const void *key
)
40 return git_vector_bsearch3(NULL
, v
, v
->_cmp
, key
);
43 GIT_INLINE(int) git_vector_bsearch2(
44 git_vector
*v
, git_vector_cmp cmp
, const void *key
)
46 return git_vector_bsearch3(NULL
, v
, cmp
, key
);
49 GIT_INLINE(void *) git_vector_get(git_vector
*v
, size_t position
)
51 return (position
< v
->length
) ? v
->contents
[position
] : NULL
;
54 GIT_INLINE(const void *) git_vector_get_const(const git_vector
*v
, size_t position
)
56 return (position
< v
->length
) ? v
->contents
[position
] : NULL
;
59 #define GIT_VECTOR_GET(V,I) ((I) < (V)->length ? (V)->contents[(I)] : NULL)
61 GIT_INLINE(void *) git_vector_last(git_vector
*v
)
63 return (v
->length
> 0) ? git_vector_get(v
, v
->length
- 1) : NULL
;
66 #define git_vector_foreach(v, iter, elem) \
67 for ((iter) = 0; (iter) < (v)->length && ((elem) = (v)->contents[(iter)], 1); (iter)++ )
69 #define git_vector_rforeach(v, iter, elem) \
70 for ((iter) = (v)->length; (iter) > 0 && ((elem) = (v)->contents[(iter)-1], 1); (iter)-- )
72 int git_vector_insert(git_vector
*v
, void *element
);
73 int git_vector_insert_sorted(git_vector
*v
, void *element
,
74 int (*on_dup
)(void **old
, void *new));
75 int git_vector_remove(git_vector
*v
, unsigned int idx
);
76 void git_vector_pop(git_vector
*v
);
77 void git_vector_uniq(git_vector
*v
);
79 int git_vector_resize_to(git_vector
*v
, size_t new_length
);
80 int git_vector_set(void **old
, git_vector
*v
, size_t position
, void *value
);