summaryrefslogtreecommitdiff
path: root/src/upb_array.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/upb_array.h')
-rw-r--r--src/upb_array.h89
1 files changed, 15 insertions, 74 deletions
diff --git a/src/upb_array.h b/src/upb_array.h
index 370f6eb..732c4aa 100644
--- a/src/upb_array.h
+++ b/src/upb_array.h
@@ -23,7 +23,7 @@
#define UPB_ARRAY_H_
#include <stdlib.h>
-#include "upb.h"
+#include "upb_msg.h" /* Because we use upb_msg_fielddef */
#ifdef __cplusplus
extern "C" {
@@ -31,41 +31,6 @@ extern "C" {
struct upb_string;
-/* upb_arrays can be at most 2**32 elements long. */
-typedef uint32_t upb_arraylen_t;
-
-/* Represents an array (a repeated field) of any type. The interpretation of
- * the data in the array depends on the type. */
-struct upb_array {
- union upb_value_ptr elements;
- upb_arraylen_t len; /* Number of elements in "elements". */
- upb_arraylen_t size; /* Memory we own (0 if by reference). */
- void *gptr;
-};
-
-INLINE void upb_array_init(struct upb_array *arr)
-{
- arr->elements._void = NULL;
- arr->len = 0;
- arr->size = 0;
-}
-
-INLINE void upb_array_uninit(struct upb_array *arr)
-{
- if(arr->size) free(arr->elements._void);
-}
-
-INLINE struct upb_array *upb_array_new(void) {
- struct upb_array *arr = malloc(sizeof(*arr));
- upb_array_init(arr);
- return arr;
-}
-
-INLINE void upb_array_free(struct upb_array *arr) {
- upb_array_uninit(arr);
- free(arr);
-}
-
/* Returns a pointer to an array element. Does not perform a bounds check! */
INLINE union upb_value_ptr upb_array_getelementptr(
struct upb_array *arr, upb_arraylen_t n, upb_field_type_t type)
@@ -75,10 +40,17 @@ INLINE union upb_value_ptr upb_array_getelementptr(
return ptr;
}
-INLINE union upb_value upb_array_getelement(
- struct upb_array *arr, upb_arraylen_t n, upb_field_type_t type)
+/* Allocation/Deallocation/Resizing. ******************************************/
+
+INLINE struct upb_array *upb_array_new(struct upb_msg_fielddef *f)
{
- return upb_deref(upb_array_getelementptr(arr, n, type), type);
+ struct upb_array *arr = malloc(sizeof(*arr));
+ upb_mmhead_init(&arr->mmhead);
+ arr->elements._void = NULL;
+ arr->len = 0;
+ arr->size = 0;
+ arr->fielddef = f;
+ return arr;
}
INLINE uint32_t upb_round_up_to_pow2(uint32_t v)
@@ -94,13 +66,10 @@ INLINE uint32_t upb_round_up_to_pow2(uint32_t v)
return v;
}
-/* Resizes array to be "len" elements long and ensures we have write access
- * to the array (reallocating if necessary). Returns true iff we were
- * referencing memory for the array and dropped the reference. */
-INLINE bool upb_array_resize(struct upb_array *arr, upb_arraylen_t newlen,
- upb_field_type_t type)
+/* Resizes array to be "len" elements long (reallocating if necessary). */
+INLINE bool upb_array_resize(struct upb_array *arr, upb_arraylen_t newlen)
{
- size_t type_size = upb_type_info[type].size;
+ size_t type_size = upb_type_info[arr->fielddef->type].size;
bool dropped = false;
bool ref = arr->size == 0; /* Ref'ing external memory. */
void *data = arr->elements._void;
@@ -114,39 +83,11 @@ INLINE bool upb_array_resize(struct upb_array *arr, upb_arraylen_t newlen,
memcpy(arr->elements._void, data, UPB_MIN(arr->len, newlen) * type_size);
dropped = true;
}
+ /* TODO: fill with defaults. */
arr->len = newlen;
return dropped;
}
-/* These are all overlays on upb_array, pointers between them can be cast. */
-#define UPB_DEFINE_ARRAY_TYPE(name, type) \
- struct name ## _array { \
- struct upb_fielddef *f; \
- void *gptr; \
- type *elements; \
- upb_arraylen_t len; \
- upb_arraylen_t size; \
- };
-
-UPB_DEFINE_ARRAY_TYPE(upb_double, double)
-UPB_DEFINE_ARRAY_TYPE(upb_float, float)
-UPB_DEFINE_ARRAY_TYPE(upb_int32, int32_t)
-UPB_DEFINE_ARRAY_TYPE(upb_int64, int64_t)
-UPB_DEFINE_ARRAY_TYPE(upb_uint32, uint32_t)
-UPB_DEFINE_ARRAY_TYPE(upb_uint64, uint64_t)
-UPB_DEFINE_ARRAY_TYPE(upb_bool, bool)
-UPB_DEFINE_ARRAY_TYPE(upb_string, struct upb_string*)
-UPB_DEFINE_ARRAY_TYPE(upb_msg, void*)
-
-/* Defines an array of a specific message type (an overlay of upb_array). */
-#define UPB_MSG_ARRAY(msg_type) struct msg_type ## _array
-#define UPB_DEFINE_MSG_ARRAY(msg_type) \
- UPB_MSG_ARRAY(msg_type) { \
- msg_type **elements; \
- upb_arraylen_t len; \
- upb_arraylen_t size; \
- };
-
#ifdef __cplusplus
} /* extern "C" */
#endif
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback