Skip to content

Commit bffbfd2

Browse files
committed
[libvector] fix repeated vector_next with tmp_cursor
1 parent 7efee34 commit bffbfd2

File tree

4 files changed

+28
-30
lines changed

4 files changed

+28
-30
lines changed

gear-lib/CMakeLists.txt

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,23 +48,12 @@ ADD_SUBDIRECTORY(libbitmap)
4848
ADD_SUBDIRECTORY(libdict)
4949
ADD_SUBDIRECTORY(libfile)
5050
ADD_SUBDIRECTORY(libhash)
51-
52-
53-
IF (NOT DEFINED ENV_MINGW)
5451
ADD_SUBDIRECTORY(libdarray)
5552
ADD_SUBDIRECTORY(libthread)
5653
ADD_SUBDIRECTORY(libsock)
5754
ADD_SUBDIRECTORY(libgevent)
58-
ENDIF ()
59-
60-
IF (NOT DEFINED OS_WINDOWS)
6155
ADD_SUBDIRECTORY(libqueue)
62-
ADD_SUBDIRECTORY(libthread)
63-
ADD_SUBDIRECTORY(libgevent)
6456
ADD_SUBDIRECTORY(libdebug)
65-
ADD_SUBDIRECTORY(libhash)
66-
ADD_SUBDIRECTORY(libdarray)
67-
ADD_SUBDIRECTORY(libqueue)
6857
ADD_SUBDIRECTORY(libtime)
6958
ADD_SUBDIRECTORY(liblog)
7059
ADD_SUBDIRECTORY(libmedia-io)
@@ -79,6 +68,12 @@ ADD_SUBDIRECTORY(libworkq)
7968
ADD_SUBDIRECTORY(libhal)
8069
ADD_SUBDIRECTORY(librpc)
8170
ADD_SUBDIRECTORY(libmp4)
71+
72+
IF (NOT DEFINED ENV_MINGW)
73+
ENDIF ()
74+
75+
IF (NOT DEFINED OS_WINDOWS)
76+
8277
ENDIF ()
8378

8479
#libcollections

gear-lib/libvector/libvector.c

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ int vector_empty(struct vector *v)
7373
printf("%s: paraments invalid!\n", __func__);
7474
return -1;
7575
}
76-
v->tmp_cursor = 0;
7776
return (v->size == 0);
7877
}
7978

@@ -104,28 +103,30 @@ vector_iter vector_last(struct vector *v)
104103
return (void *)((uint8_t *)v->buf.iov_base + (v->size-1) * v->type_size);
105104
}
106105

107-
vector_iter vector_next(struct vector *v)
106+
vector_iter vector_next(struct vector *v, vector_iter iter)
108107
{
109-
if (!v) {
108+
if (!v || !iter) {
110109
printf("%s: paraments invalid!\n", __func__);
111110
return NULL;
112111
}
113-
if (v->tmp_cursor < v->size) {
114-
v->tmp_cursor++;
115-
} else {
116-
return NULL;
112+
if (iter == vector_end(v)) {
113+
printf("%s: vector reach the end!\n", __func__);
114+
return iter;
117115
}
118-
return (void *)((uint8_t *)v->buf.iov_base + v->tmp_cursor * v->type_size);
116+
return (void *)((uint8_t *)iter + v->type_size);
119117
}
120118

121-
vector_iter vector_prev(struct vector *v)
119+
vector_iter vector_prev(struct vector *v, vector_iter iter)
122120
{
123-
if (!v) {
121+
if (!v || !iter) {
124122
printf("%s: paraments invalid!\n", __func__);
125123
return NULL;
126124
}
127-
v->tmp_cursor--;
128-
return (void *)((uint8_t *)v->buf.iov_base + v->tmp_cursor * v->type_size);
125+
if (iter == vector_begin(v)) {
126+
printf("%s: vector reach the begin!\n", __func__);
127+
return iter;
128+
}
129+
return (void *)((uint8_t *)iter - v->type_size);
129130
}
130131

131132
void *_vector_iter_value(struct vector *v, vector_iter iter)
@@ -134,7 +135,11 @@ void *_vector_iter_value(struct vector *v, vector_iter iter)
134135
printf("%s: paraments invalid!\n", __func__);
135136
return NULL;
136137
}
137-
return (void *)((uint8_t *)v->buf.iov_base + v->tmp_cursor * v->type_size);
138+
if (iter > vector_end(v) || iter < vector_begin(v)) {
139+
printf("%s: iter out of range!\n", __func__);
140+
return NULL;
141+
}
142+
return (void *)((uint8_t *)iter);
138143
}
139144

140145
void *_vector_at(struct vector *v, int pos)
@@ -154,7 +159,6 @@ struct vector *_vector_create(size_t size)
154159
return NULL;
155160
}
156161
v->size = 0;
157-
v->tmp_cursor = 0;
158162
v->type_size = size;
159163
v->max_size = (size_t)(-1/size);
160164
v->capacity = VECTOR_DEFAULT_BUF_LEN;

gear-lib/libvector/libvector.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ typedef struct vector {
3939
size_t max_size; //max number of element
4040
size_t capacity; //size of allocated storage capacity
4141
size_t type_size;
42-
size_t tmp_cursor;
4342
struct iovec buf;
4443
vector_iter iterator;
4544
} vector_t;
@@ -69,8 +68,8 @@ void _vector_push_back(struct vector *v, void *e, size_t type_size);
6968
vector_iter vector_begin(struct vector *v);
7069
vector_iter vector_end(struct vector *v);
7170
vector_iter vector_last(struct vector *v);//last=end-1
72-
vector_iter vector_next(struct vector *v);
73-
vector_iter vector_prev(struct vector *v);
71+
vector_iter vector_next(struct vector *v, vector_iter iter);
72+
vector_iter vector_prev(struct vector *v, vector_iter iter);
7473
void *_vector_iter_value(struct vector *v, vector_iter iter);
7574
void *_vector_at(struct vector *v, int pos);
7675

gear-lib/libvector/test_libvector.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ void mix_struct()
4545
c = _vector_create(sizeof(struct tmp_box));
4646
#endif
4747
vector_push_back(c, tb);
48-
for (iter = vector_begin(c); iter != vector_end(c); iter = vector_next(c)) {
48+
for (iter = vector_begin(c); iter != vector_end(c); iter = vector_next(c, iter)) {
4949
struct tmp_box *tt = vector_iter_valuep(c, iter, struct tmp_box);
5050
printf("vector member.c: %c\n", tt->c);
5151
printf("vector member.i: %d\n", tt->i);
@@ -79,7 +79,7 @@ void default_struct()
7979
vector_push_back(a, t1);
8080
vector_push_back(a, t2);
8181
vector_push_back(a, t3);
82-
for (iter = vector_begin(a); iter != vector_end(a); iter = vector_next(a)) {
82+
for (iter = vector_begin(a); iter != vector_end(a); iter = vector_next(a, iter)) {
8383
printf("vector member: %d\n", *vector_iter_valuep(a, iter, int));
8484
}
8585
for (i = 0; i < a->size; i++) {

0 commit comments

Comments
 (0)