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