[clutter] actor: Add ActorIter.is_valid()



commit 1da42dd8a0407bc9929c36ec676827f8d0fb56c5
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Wed Jun 27 12:57:36 2012 +0100

    actor: Add ActorIter.is_valid()
    
    It can be useful to check whether a ClutterActorIter is currently valid,
    i.e. if the iterator has been initialized *and* if the actor to which it
    refers to hasn't been updated.
    
    We can also use the is_valid() method in the conformance test suite to
    check that initialization has been successful, and that changing the
    children list through the ClutterActorIter API leaves the iterator in a
    valid state.

 clutter/clutter-actor.c    |   27 +++++++++++++++++++++++++++
 clutter/clutter-actor.h    |    2 ++
 clutter/clutter.symbols    |    1 +
 tests/conform/actor-iter.c |   18 ++++++++++++++----
 4 files changed, 44 insertions(+), 4 deletions(-)
---
diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c
index b0c874b..5728983 100644
--- a/clutter/clutter-actor.c
+++ b/clutter/clutter-actor.c
@@ -17194,6 +17194,33 @@ clutter_actor_iter_init (ClutterActorIter *iter,
 }
 
 /**
+ * clutter_actor_iter_is_valid:
+ * @iter: a #ClutterActorIter
+ *
+ * Checks whether a #ClutterActorIter is still valid.
+ *
+ * An iterator is considered valid if it has been initialized, and
+ * if the #ClutterActor that it refers to hasn't been modified after
+ * the initialization.
+ *
+ * Return value: %TRUE if the iterator is valid, and %FALSE otherwise
+ *
+ * Since: 1.12
+ */
+gboolean
+clutter_actor_iter_is_valid (const ClutterActorIter *iter)
+{
+  RealActorIter *ri = (RealActorIter *) iter;
+
+  g_return_val_if_fail (iter != NULL, FALSE);
+
+  if (ri->root == NULL)
+    return FALSE;
+
+  return ri->root->priv->age == ri->age;
+}
+
+/**
  * clutter_actor_iter_next:
  * @iter: a #ClutterActorIter
  * @child: (out): return location for a #ClutterActor
diff --git a/clutter/clutter-actor.h b/clutter/clutter-actor.h
index ae95418..e98cd55 100644
--- a/clutter/clutter-actor.h
+++ b/clutter/clutter-actor.h
@@ -617,6 +617,8 @@ CLUTTER_AVAILABLE_IN_1_10
 void                            clutter_actor_iter_remove                       (ClutterActorIter           *iter);
 CLUTTER_AVAILABLE_IN_1_10
 void                            clutter_actor_iter_destroy                      (ClutterActorIter           *iter);
+CLUTTER_AVAILABLE_IN_1_12
+gboolean                        clutter_actor_iter_is_valid                     (const ClutterActorIter     *iter);
 
 /* Transformations */
 gboolean                        clutter_actor_is_rotated                        (ClutterActor               *self);
diff --git a/clutter/clutter.symbols b/clutter/clutter.symbols
index fd32e82..39307e7 100644
--- a/clutter/clutter.symbols
+++ b/clutter/clutter.symbols
@@ -178,6 +178,7 @@ clutter_actor_is_rotated
 clutter_actor_is_scaled
 clutter_actor_iter_destroy
 clutter_actor_iter_init
+clutter_actor_iter_is_valid
 clutter_actor_iter_next
 clutter_actor_iter_prev
 clutter_actor_iter_remove
diff --git a/tests/conform/actor-iter.c b/tests/conform/actor-iter.c
index 5633e2f..4c55079 100644
--- a/tests/conform/actor-iter.c
+++ b/tests/conform/actor-iter.c
@@ -33,6 +33,8 @@ actor_iter_traverse_children (TestConformSimpleFixture *fixture G_GNUC_UNUSED,
 
   i = 0;
   clutter_actor_iter_init (&iter, actor);
+  g_assert (clutter_actor_iter_is_valid (&iter));
+
   while (clutter_actor_iter_next (&iter, &child))
     {
       g_assert (CLUTTER_IS_ACTOR (child));
@@ -54,6 +56,8 @@ actor_iter_traverse_children (TestConformSimpleFixture *fixture G_GNUC_UNUSED,
 
   i = 0;
   clutter_actor_iter_init (&iter, actor);
+  g_assert (clutter_actor_iter_is_valid (&iter));
+
   while (clutter_actor_iter_prev (&iter, &child))
     {
       g_assert (CLUTTER_IS_ACTOR (child));
@@ -105,6 +109,8 @@ actor_iter_traverse_remove (TestConformSimpleFixture *fixture G_GNUC_UNUSED,
 
   i = 0;
   clutter_actor_iter_init (&iter, actor);
+  g_assert (clutter_actor_iter_is_valid (&iter));
+
   while (clutter_actor_iter_next (&iter, &child))
     {
       g_assert (CLUTTER_IS_ACTOR (child));
@@ -120,6 +126,7 @@ actor_iter_traverse_remove (TestConformSimpleFixture *fixture G_GNUC_UNUSED,
         g_assert (child == clutter_actor_get_last_child (actor));
 
       clutter_actor_iter_remove (&iter);
+      g_assert (clutter_actor_iter_is_valid (&iter));
 
       i += 1;
     }
@@ -163,6 +170,9 @@ actor_iter_assignment (TestConformSimpleFixture *fixure G_GNUC_UNUSED,
 
   iter_b = iter_a;
 
+  g_assert (clutter_actor_iter_is_valid (&iter_a));
+  g_assert (clutter_actor_iter_is_valid (&iter_b));
+
   while (clutter_actor_iter_next (&iter_a, &child))
     {
       g_assert (CLUTTER_IS_ACTOR (child));
@@ -182,7 +192,7 @@ actor_iter_assignment (TestConformSimpleFixture *fixure G_GNUC_UNUSED,
 
   g_assert_cmpint (i, ==, n_actors);
 
-  i = n_actors;
+  i = n_actors - 1;
 
   while (clutter_actor_iter_prev (&iter_b, &child))
     {
@@ -191,16 +201,16 @@ actor_iter_assignment (TestConformSimpleFixture *fixure G_GNUC_UNUSED,
       if (g_test_verbose ())
         g_print ("actor %2d = '%s'\n", i, clutter_actor_get_name (child));
 
-      if (i == n_actors)
+      if (i == n_actors - 1)
         g_assert (child == clutter_actor_get_last_child (actor));
 
-      if (i == 1)
+      if (i == 0)
         g_assert (child == clutter_actor_get_first_child (actor));
 
       i -= 1;
     }
 
-  g_assert_cmpint (i, ==, 0);
+  g_assert_cmpint (i, ==, -1);
 
   g_object_unref (actor);
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]