You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rh...@apache.org on 2014/02/15 11:20:29 UTC
svn commit: r1568605 - in /qpid/proton/trunk/proton-c:
include/proton/object.h src/object/object.c src/tests/object.c
Author: rhs
Date: Sat Feb 15 10:20:29 2014
New Revision: 1568605
URL: http://svn.apache.org/r1568605
Log:
added iterators
Modified:
qpid/proton/trunk/proton-c/include/proton/object.h
qpid/proton/trunk/proton-c/src/object/object.c
qpid/proton/trunk/proton-c/src/tests/object.c
Modified: qpid/proton/trunk/proton-c/include/proton/object.h
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/include/proton/object.h?rev=1568605&r1=1568604&r2=1568605&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/include/proton/object.h (original)
+++ qpid/proton/trunk/proton-c/include/proton/object.h Sat Feb 15 10:20:29 2014
@@ -134,6 +134,13 @@ PN_EXTERN size_t pn_string_capacity(pn_s
PN_EXTERN int pn_string_resize(pn_string_t *string, size_t size);
PN_EXTERN int pn_string_copy(pn_string_t *string, pn_string_t *src);
+typedef void *(pn_iterator_next_t)(void *state);
+typedef struct pn_iterator_t pn_iterator_t;
+
+PN_EXTERN pn_iterator_t *pn_iterator(void);
+PN_EXTERN void *pn_iterator_start(pn_iterator_t *iterator,
+ pn_iterator_next_t *next, size_t size);
+PN_EXTERN void *pn_iterator_next(pn_iterator_t *iterator);
#ifdef __cplusplus
}
Modified: qpid/proton/trunk/proton-c/src/object/object.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/object/object.c?rev=1568605&r1=1568604&r2=1568605&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/object/object.c (original)
+++ qpid/proton/trunk/proton-c/src/object/object.c Sat Feb 15 10:20:29 2014
@@ -761,11 +761,10 @@ pn_string_t *pn_string(const char *bytes
#define pn_string_initialize NULL
-static pn_class_t clazz = PN_CLASS(pn_string);
pn_string_t *pn_stringn(const char *bytes, size_t n)
{
-
+ static pn_class_t clazz = PN_CLASS(pn_string);
pn_string_t *string = (pn_string_t *) pn_new(sizeof(pn_string_t), &clazz);
string->capacity = n ? n * sizeof(char) : 16;
string->bytes = (char *) malloc(string->capacity);
@@ -927,3 +926,50 @@ int pn_string_copy(pn_string_t *string,
assert(string);
return pn_string_setn(string, pn_string_get(src), pn_string_size(src));
}
+
+struct pn_iterator_t {
+ pn_iterator_next_t *next;
+ size_t size;
+ void *state;
+};
+
+static void pn_iterator_initialize(void *object)
+{
+ pn_iterator_t *it = (pn_iterator_t *) object;
+ it->next = NULL;
+ it->size = 0;
+ it->state = NULL;
+}
+
+static void pn_iterator_finalize(void *object)
+{
+ pn_iterator_t *it = (pn_iterator_t *) object;
+ free(it->state);
+}
+
+#define pn_iterator_hashcode NULL
+#define pn_iterator_compare NULL
+#define pn_iterator_inspect NULL
+
+pn_iterator_t *pn_iterator()
+{
+ static pn_class_t clazz = PN_CLASS(pn_iterator);
+ pn_iterator_t *it = (pn_iterator_t *) pn_new(sizeof(pn_iterator_t), &clazz);
+ return it;
+}
+
+void *pn_iterator_start(pn_iterator_t *iterator, pn_iterator_next_t *next,
+ size_t size) {
+ assert(iterator);
+ assert(next);
+ iterator->next = next;
+ if (iterator->size < size) {
+ iterator->state = realloc(iterator->state, size);
+ }
+ return iterator->state;
+}
+
+void *pn_iterator_next(pn_iterator_t *iterator) {
+ assert(iterator);
+ return iterator->next(iterator->state);
+}
Modified: qpid/proton/trunk/proton-c/src/tests/object.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/tests/object.c?rev=1568605&r1=1568604&r2=1568605&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/tests/object.c (original)
+++ qpid/proton/trunk/proton-c/src/tests/object.c Sat Feb 15 10:20:29 2014
@@ -725,6 +725,45 @@ void test_list_compare(void)
pn_free(one); pn_free(two); pn_free(three);
}
+typedef struct {
+ pn_list_t *list;
+ size_t index;
+} pn_it_state_t;
+
+static void *pn_it_next(void *state) {
+ pn_it_state_t *it = (pn_it_state_t *) state;
+ if (it->index < pn_list_size(it->list)) {
+ return pn_list_get(it->list, it->index++);
+ } else {
+ return NULL;
+ }
+}
+
+void test_iterator(void)
+{
+ pn_list_t *list = build_list(0, PN_REFCOUNT,
+ pn_string("one"),
+ pn_string("two"),
+ pn_string("three"),
+ pn_string("four"),
+ END);
+ pn_iterator_t *it = pn_iterator();
+ pn_it_state_t *state = (pn_it_state_t *) pn_iterator_start
+ (it, pn_it_next, sizeof(pn_it_state_t));
+ state->list = list;
+ state->index = 0;
+
+ void *obj;
+ int index = 0;
+ while ((obj = pn_iterator_next(it))) {
+ assert(obj == pn_list_get(list, index++));
+ }
+ assert(index == 4);
+
+ pn_free(list);
+ pn_free(it);
+}
+
int main(int argc, char **argv)
{
for (size_t i = 0; i < 128; i++) {
@@ -779,6 +818,7 @@ int main(int argc, char **argv)
test_list_inspect();
test_map_inspect();
test_list_compare();
+ test_iterator();
return 0;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org