summaryrefslogtreecommitdiff
path: root/src/vector.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/vector.cc')
-rw-r--r--src/vector.cc69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/vector.cc b/src/vector.cc
new file mode 100644
index 00000000..b7135e67
--- /dev/null
+++ b/src/vector.cc
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2016 WebAssembly Community Group participants
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "vector.h"
+
+#define INITIAL_VECTOR_CAPACITY 8
+
+void wabt_ensure_capacity(void** data,
+ size_t* capacity,
+ size_t desired_size,
+ size_t elt_byte_size) {
+ if (desired_size > *capacity) {
+ size_t new_capacity = *capacity ? *capacity * 2 : INITIAL_VECTOR_CAPACITY;
+ while (new_capacity < desired_size)
+ new_capacity *= 2;
+ size_t new_byte_size = new_capacity * elt_byte_size;
+ *data = wabt_realloc(*data, new_byte_size);
+ *capacity = new_capacity;
+ }
+}
+
+void wabt_resize_vector(void** data,
+ size_t* size,
+ size_t* capacity,
+ size_t desired_size,
+ size_t elt_byte_size) {
+ size_t old_size = *size;
+ wabt_ensure_capacity(data, capacity, desired_size, elt_byte_size);
+ if (desired_size > old_size) {
+ memset((void*)((size_t)*data + old_size * elt_byte_size), 0,
+ (desired_size - old_size) * elt_byte_size);
+ }
+ *size = desired_size;
+}
+
+void* wabt_append_element(void** data,
+ size_t* size,
+ size_t* capacity,
+ size_t elt_byte_size) {
+ wabt_ensure_capacity(data, capacity, *size + 1, elt_byte_size);
+ void* p = (void*)((size_t)*data + (*size)++ * elt_byte_size);
+ memset(p, 0, elt_byte_size);
+ return p;
+}
+
+void wabt_extend_elements(void** dst,
+ size_t* dst_size,
+ size_t* dst_capacity,
+ const void** src,
+ size_t src_size,
+ size_t elt_byte_size) {
+ wabt_ensure_capacity(dst, dst_capacity, *dst_size + src_size, elt_byte_size);
+ memcpy((void*)((size_t)*dst + (*dst_size * elt_byte_size)), *src,
+ src_size * elt_byte_size);
+ *dst_size += src_size;
+}