From a2a8ce1f11a492b54124b38bc2919168ddf67190 Mon Sep 17 00:00:00 2001 From: xianjimli Date: Tue, 26 Feb 2019 11:21:39 +0800 Subject: [PATCH] row support typecheck --- src/widgets/row.c | 10 ++++++---- src/widgets/row.h | 5 +++++ tests/row_test.cc | 10 ++++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) mode change 100755 => 100644 src/widgets/row.c create mode 100644 tests/row_test.cc diff --git a/src/widgets/row.c b/src/widgets/row.c old mode 100755 new mode 100644 index b2c8dc037..483dc35e2 --- a/src/widgets/row.c +++ b/src/widgets/row.c @@ -22,15 +22,17 @@ #include "tkc/mem.h" #include "widgets/row.h" -static const widget_vtable_t s_row_vtable = { - .size = sizeof(row_t), .type = WIDGET_TYPE_ROW, .create = row_create}; +TK_DECL_VTABLE(row) = {.size = sizeof(row_t), + .type = WIDGET_TYPE_ROW, + .parent = TK_PARENT_VTABLE(widget), + .create = row_create}; widget_t* row_create(widget_t* parent, xy_t x, xy_t y, wh_t w, wh_t h) { - return widget_create(parent, &s_row_vtable, x, y, w, h); + return widget_create(parent, TK_REF_VTABLE(row), x, y, w, h); } widget_t* row_cast(widget_t* widget) { - return_value_if_fail(widget != NULL && widget->vt == &s_row_vtable, NULL); + return_value_if_fail(WIDGET_IS_INSTANCE_OF(widget, row), NULL); return widget; } diff --git a/src/widgets/row.h b/src/widgets/row.h index a57815356..019aa42b4 100644 --- a/src/widgets/row.h +++ b/src/widgets/row.h @@ -85,6 +85,11 @@ widget_t* row_create(widget_t* parent, xy_t x, xy_t y, wh_t w, wh_t h); */ widget_t* row_cast(widget_t* widget); +#define ROW(widget) ((row_t*)(row_cast(WIDGET(widget)))) + +/*public for subclass and runtime type check*/ +TK_EXTERN_VTABLE(row); + END_C_DECLS #endif /*TK_ROW_H*/ diff --git a/tests/row_test.cc b/tests/row_test.cc new file mode 100644 index 000000000..51cabc6de --- /dev/null +++ b/tests/row_test.cc @@ -0,0 +1,10 @@ +#include "widgets/row.h" +#include "gtest/gtest.h" + +TEST(Row, cast) { + widget_t* w = row_create(NULL, 10, 20, 30, 40); + + ASSERT_EQ(w, row_cast(w)); + + widget_destroy(w); +}