From 9570461440db497be65ee1ab4b5d9974e87f9a7d Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Fri, 17 Apr 2015 14:31:19 +0100 Subject: [PATCH] Eo: Add eo_do_part. This is a convenience macro to be used by the common pattern of getting a part and then immediately calling functions on it. For example, without this macro, you'd have to write code like: Eo *part; eo_do(obj, part = efl_part_name_get("partname")); eo_do(part, a_set(7)); while using the helper function trims it to: eo_do_part(obj, efl_part_name_get("partname"), a_set(7)); @feature --- src/lib/eo/Eo.h | 7 +++++ src/tests/eo/suite/eo_test_class_simple.c | 10 +++++++ src/tests/eo/suite/eo_test_class_simple.h | 1 + src/tests/eo/suite/eo_test_general.c | 34 +++++++++++++++++++++++ 4 files changed, 52 insertions(+) diff --git a/src/lib/eo/Eo.h b/src/lib/eo/Eo.h index 46e9d73ef8..59a8528e7f 100644 --- a/src/lib/eo/Eo.h +++ b/src/lib/eo/Eo.h @@ -607,6 +607,13 @@ EAPI Eo * _eo_add_end(void); #define eo_do_super_ret(eoid, clsid, ret_tmp, func) _eo_do_common_ret(eoid, clsid, EINA_TRUE, ret_tmp, func) +#define eo_do_part(eoid, part_func, ...) \ + do { \ + Eo *__eo_part = eoid; \ + eo_do(eoid, __eo_part = part_func); \ + eo_do(__eo_part, __VA_ARGS__); \ + } while (0) + /*****************************************************************************/ /** diff --git a/src/tests/eo/suite/eo_test_class_simple.c b/src/tests/eo/suite/eo_test_class_simple.c index cbefee7d1d..4bc3904acb 100644 --- a/src/tests/eo/suite/eo_test_class_simple.c +++ b/src/tests/eo/suite/eo_test_class_simple.c @@ -45,6 +45,15 @@ _class_hi_print(Eo_Class *klass, void *data EINA_UNUSED) return EINA_TRUE; } +EO_FUNC_BODYV(simple_part_get, Eo *, NULL, EO_FUNC_CALL(name), const char *name); + +static Eo * +_part_get(Eo *obj, void *class_data EINA_UNUSED, const char *name EINA_UNUSED) +{ + /* A normal part get will do something saner, we just create objects. */ + return eo_add(SIMPLE_CLASS, obj); +} + EO_VOID_FUNC_BODYV(simple_recursive, EO_FUNC_CALL(n), int n); static void @@ -83,6 +92,7 @@ static Eo_Op_Description op_descs[] = { EO_OP_FUNC(simple_a_print, _a_print, "Print property a"), EO_OP_CLASS_FUNC(simple_class_hi_print, _class_hi_print, "Print property a"), EO_OP_FUNC(simple_recursive, _recursive, "Recursive function"), + EO_OP_FUNC(simple_part_get, _part_get, "Part getter"), EO_OP_FUNC(simple_pure_virtual, NULL, "Pure Virtual function"), EO_OP_SENTINEL }; diff --git a/src/tests/eo/suite/eo_test_class_simple.h b/src/tests/eo/suite/eo_test_class_simple.h index 7d774b761f..2fce591372 100644 --- a/src/tests/eo/suite/eo_test_class_simple.h +++ b/src/tests/eo/suite/eo_test_class_simple.h @@ -13,6 +13,7 @@ EAPI Eina_Bool simple_class_hi_print(void); EAPI void simple_recursive(int n); EAPI void simple_pure_virtual(void); EAPI void simple_no_implementation(void); +EAPI Eo *simple_part_get(const char *name); extern const Eo_Event_Description _EV_A_CHANGED; #define EV_A_CHANGED (&(_EV_A_CHANGED)) diff --git a/src/tests/eo/suite/eo_test_general.c b/src/tests/eo/suite/eo_test_general.c index baef2fe569..91ecd1c4c8 100644 --- a/src/tests/eo/suite/eo_test_general.c +++ b/src/tests/eo/suite/eo_test_general.c @@ -937,6 +937,39 @@ START_TEST(eo_add_failures) } END_TEST +START_TEST(eo_parts) +{ + int a = 0; + + eo_init(); + + Eo *obj = eo_add(SIMPLE_CLASS, NULL); + + eo_do(obj, simple_a_set(3), a = simple_a_get()); + ck_assert_int_eq(a, 3); + + eo_do_part(obj, simple_part_get("test"), + simple_a_set(7), + a = simple_a_get() + ); + ck_assert_int_eq(a, 7); + + eo_do(obj, simple_a_set(3), a = simple_a_get()); + ck_assert_int_eq(a, 3); + + /* Faking a call, just asserting NULL as the part to check default values. */ + eo_do_part(obj, NULL, + simple_a_set(7), + a = simple_a_get() + ); + ck_assert_int_eq(a, 0); + + eo_del(obj); + + eo_shutdown(); +} +END_TEST + void eo_test_general(TCase *tc) { tcase_add_test(tc, eo_simple); @@ -954,4 +987,5 @@ void eo_test_general(TCase *tc) tcase_add_test(tc, eo_add_do_and_custom); tcase_add_test(tc, eo_pointers_indirection); tcase_add_test(tc, eo_add_failures); + tcase_add_test(tc, eo_parts); }