aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLAN-TW <lantw44@gmail.com>2014-01-14 17:42:22 +0800
committerLAN-TW <lantw44@gmail.com>2014-01-14 17:42:22 +0800
commit79f0f7a105abd1613e1ddb34b4c489a8d67a68e4 (patch)
tree6bbc8f21c8b52eb07435ae09d1fc328d813bdf16
parenta48f8ee270b3aa01043fd7585fd918e86869d7af (diff)
downloadl4basic-79f0f7a105abd1613e1ddb34b4c489a8d67a68e4.tar.gz
l4basic-79f0f7a105abd1613e1ddb34b4c489a8d67a68e4.tar.zst
l4basic-79f0f7a105abd1613e1ddb34b4c489a8d67a68e4.zip
LbsArray: Insert more than one item in a function call
-rw-r--r--l4array.c25
-rw-r--r--l4array.h2
-rw-r--r--test-array.c10
3 files changed, 36 insertions, 1 deletions
diff --git a/l4array.c b/l4array.c
index 04cdf28..a55afd8 100644
--- a/l4array.c
+++ b/l4array.c
@@ -194,7 +194,7 @@ int lbs_array_append_ptr (LbsArray* array, const void* ptr) {
int lbs_array_append_data (LbsArray* array, const void* data) {
if (array->max < array->len + 1) {
- if (array->max > 0){
+ if (array->max > 0) {
if (lbs_array_set_max (array, array->max * 2) < 0) {
return -1;
}
@@ -210,6 +210,29 @@ int lbs_array_append_data (LbsArray* array, const void* data) {
return 0;
}
+int lbs_array_append_mass (LbsArray* array, const void* data, size_t count) {
+ bool need_expand = false;
+
+ while (array->max < array->len + count) {
+ need_expand = true;
+ if (array->max > 0) {
+ array->max *= 2;
+ } else {
+ array->max = 1;
+ }
+ }
+
+ if (need_expand) {
+ if (lbs_array_set_max (array, array->max) < 0) {
+ return -1;
+ }
+ }
+
+ memcpy (lbs_array_vp (array, array->len), data, array->size * count);
+ array->len += count;
+ return 0;
+}
+
int lbs_array_remove (LbsArray* array) {
if (array->len <= 0) {
return -1;
diff --git a/l4array.h b/l4array.h
index 73fc884..5b085f9 100644
--- a/l4array.h
+++ b/l4array.h
@@ -69,6 +69,8 @@ int lbs_array_set_max (LbsArray* array, size_t max);
(lbs_array_append_data ((array), (&(var))))
int lbs_array_append_ptr (LbsArray* array, const void* ptr);
int lbs_array_append_data (LbsArray* array, const void* data);
+int lbs_array_append_mass (LbsArray* array, const void* data,
+ size_t count);
int lbs_array_remove (LbsArray* array);
int lbs_array_minimize (LbsArray* array);
#define lbs_array_push_back lbs_array_append_data
diff --git a/test-array.c b/test-array.c
index 7bfed37..cb015fe 100644
--- a/test-array.c
+++ b/test-array.c
@@ -168,6 +168,16 @@ void test_array_op (void) {
assert (lbs_array_v (array, int, i) == i);
}
+ array->len = 4;
+ lbs_array_minimize (array);
+
+ int arrins[] = { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
+ lbs_array_append_mass (array, arrins, 10);
+ assert (lbs_array_get_len (array) == 14);
+ for (int i = 0; i < 14; i++) {
+ assert (lbs_array_v (array, int, i) == i);
+ }
+
lbs_array_unref (array);
printf ("%s => PASS!\n", __func__);
}