Merge lp:~kamstrup/dee/less-gtype-dancing into lp:dee
- less-gtype-dancing
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Michal Hruby |
Approved revision: | 353 |
Merged at revision: | 348 |
Proposed branch: | lp:~kamstrup/dee/less-gtype-dancing |
Merge into: | lp:dee |
Diff against target: |
302 lines (+83/-34) 7 files modified
src/dee-model.c (+6/-13) src/dee-model.h (+4/-1) src/dee-sequence-model.c (+37/-15) src/dee-serializable-model.c (+28/-3) vapi/Dee-1.0-custom.vala (+6/-0) vapi/Dee-1.0.metadata (+1/-1) vapi/dee-1.0.vapi (+1/-1) |
To merge this branch: | bzr merge lp:~kamstrup/dee/less-gtype-dancing |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Michal Hruby (community) | Approve | ||
Mikkel Kamstrup Erlandsen | Pending | ||
Review via email:
|
This proposal supersedes a proposal from 2012-02-21.
Commit message
Description of the change
A series of optimizations for DeeSequenceModel. Notably benchmarks report improvements:
append+prepend: ~10%
sorted: ~5%
read_string: ~25%
read_row: ~50%
clear: ~10%
walk_next: ~50%
walk_pos: ~15%
FilterModel.
Probably many small gains here and there.
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Mikkel Kamstrup Erlandsen (kamstrup) wrote : Posted in a previous version of this proposal | # |
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Michal Hruby (mhr3) wrote : Posted in a previous version of this proposal | # |
Faster everything, yey!
This seems to have broken gir a little and vapigen now can't match the virtual get_row to the invoker method, could you move the whole get_row method to -custom.vala (with all the annotations there were + make it abstract).
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Mikkel Kamstrup Erlandsen (kamstrup) wrote : Posted in a previous version of this proposal | # |
> Faster everything, yey!
>
> This seems to have broken gir a little and vapigen now can't match the virtual
> get_row to the invoker method, could you move the whole get_row method to
> -custom.vala (with all the annotations there were + make it abstract).
Pushed as r352
Preview Diff
1 | === modified file 'src/dee-model.c' | |||
2 | --- src/dee-model.c 2012-01-26 18:30:57 +0000 | |||
3 | +++ src/dee-model.c 2012-02-21 12:37:14 +0000 | |||
4 | @@ -1436,26 +1436,19 @@ | |||
5 | 1436 | * or a newly allocated array otherwise which you must free | 1436 | * or a newly allocated array otherwise which you must free |
6 | 1437 | * with g_free(). The variants in the array will have a strong | 1437 | * with g_free(). The variants in the array will have a strong |
7 | 1438 | * reference and needs to be freed with g_variant_unref(). | 1438 | * reference and needs to be freed with g_variant_unref(). |
9 | 1439 | **/ | 1439 | */ |
10 | 1440 | GVariant** | 1440 | GVariant** |
11 | 1441 | dee_model_get_row (DeeModel *self, | 1441 | dee_model_get_row (DeeModel *self, |
12 | 1442 | DeeModelIter *iter, | 1442 | DeeModelIter *iter, |
13 | 1443 | GVariant **out_row_members) | 1443 | GVariant **out_row_members) |
14 | 1444 | { | 1444 | { |
16 | 1445 | guint col, n_cols; | 1445 | DeeModelIface *iface; |
17 | 1446 | 1446 | ||
18 | 1447 | g_return_val_if_fail (DEE_IS_MODEL (self), NULL); | 1447 | g_return_val_if_fail (DEE_IS_MODEL (self), NULL); |
30 | 1448 | g_return_val_if_fail (iter != NULL, NULL); | 1448 | |
31 | 1449 | 1449 | iface = DEE_MODEL_GET_IFACE (self); | |
32 | 1450 | n_cols = dee_model_get_n_columns (self); | 1450 | |
33 | 1451 | 1451 | return (* iface->get_row) (self, iter, out_row_members); | |
23 | 1452 | if (out_row_members == NULL) | ||
24 | 1453 | out_row_members = g_new0 (GVariant*, n_cols + 1); | ||
25 | 1454 | |||
26 | 1455 | for (col = 0; col < n_cols; col++) | ||
27 | 1456 | out_row_members[col] = dee_model_get_value (self, iter, col); | ||
28 | 1457 | |||
29 | 1458 | return out_row_members; | ||
34 | 1459 | } | 1452 | } |
35 | 1460 | 1453 | ||
36 | 1461 | /** | 1454 | /** |
37 | 1462 | 1455 | ||
38 | === modified file 'src/dee-model.h' | |||
39 | --- src/dee-model.h 2012-01-26 18:30:57 +0000 | |||
40 | +++ src/dee-model.h 2012-02-21 12:37:14 +0000 | |||
41 | @@ -215,6 +215,10 @@ | |||
42 | 215 | DeeModelIter *iter, | 215 | DeeModelIter *iter, |
43 | 216 | DeeModelTag *tag, | 216 | DeeModelTag *tag, |
44 | 217 | gpointer value); | 217 | gpointer value); |
45 | 218 | |||
46 | 219 | GVariant** (*get_row) (DeeModel *self, | ||
47 | 220 | DeeModelIter *iter, | ||
48 | 221 | GVariant **out_row_members); | ||
49 | 218 | 222 | ||
50 | 219 | /*< private >*/ | 223 | /*< private >*/ |
51 | 220 | void (*_dee_model_1) (void); | 224 | void (*_dee_model_1) (void); |
52 | @@ -224,7 +228,6 @@ | |||
53 | 224 | void (*_dee_model_5) (void); | 228 | void (*_dee_model_5) (void); |
54 | 225 | void (*_dee_model_6) (void); | 229 | void (*_dee_model_6) (void); |
55 | 226 | void (*_dee_model_7) (void); | 230 | void (*_dee_model_7) (void); |
56 | 227 | void (*_dee_model_8) (void); | ||
57 | 228 | }; | 231 | }; |
58 | 229 | 232 | ||
59 | 230 | GType dee_model_iter_get_type (void); | 233 | GType dee_model_iter_get_type (void); |
60 | 231 | 234 | ||
61 | === modified file 'src/dee-sequence-model.c' | |||
62 | --- src/dee-sequence-model.c 2012-01-10 07:43:54 +0000 | |||
63 | +++ src/dee-sequence-model.c 2012-02-21 12:37:14 +0000 | |||
64 | @@ -128,6 +128,10 @@ | |||
65 | 128 | DeeModelIter *iter, | 128 | DeeModelIter *iter, |
66 | 129 | guint column); | 129 | guint column); |
67 | 130 | 130 | ||
68 | 131 | static GVariant** dee_sequence_model_get_row (DeeModel *self, | ||
69 | 132 | DeeModelIter *iter, | ||
70 | 133 | GVariant **out_row_members); | ||
71 | 134 | |||
72 | 131 | static DeeModelIter* dee_sequence_model_get_first_iter (DeeModel *self); | 135 | static DeeModelIter* dee_sequence_model_get_first_iter (DeeModel *self); |
73 | 132 | 136 | ||
74 | 133 | static DeeModelIter* dee_sequence_model_get_last_iter (DeeModel *self); | 137 | static DeeModelIter* dee_sequence_model_get_last_iter (DeeModel *self); |
75 | @@ -295,6 +299,7 @@ | |||
76 | 295 | iface->set_row = dee_sequence_model_set_row; | 299 | iface->set_row = dee_sequence_model_set_row; |
77 | 296 | iface->set_value = dee_sequence_model_set_value; | 300 | iface->set_value = dee_sequence_model_set_value; |
78 | 297 | iface->get_value = dee_sequence_model_get_value; | 301 | iface->get_value = dee_sequence_model_get_value; |
79 | 302 | iface->get_row = dee_sequence_model_get_row; | ||
80 | 298 | iface->get_first_iter = dee_sequence_model_get_first_iter; | 303 | iface->get_first_iter = dee_sequence_model_get_first_iter; |
81 | 299 | iface->get_last_iter = dee_sequence_model_get_last_iter; | 304 | iface->get_last_iter = dee_sequence_model_get_last_iter; |
82 | 300 | iface->get_iter_at_row = dee_sequence_model_get_iter_at_row; | 305 | iface->get_iter_at_row = dee_sequence_model_get_iter_at_row; |
83 | @@ -469,9 +474,7 @@ | |||
84 | 469 | 474 | ||
85 | 470 | g_return_if_fail (DEE_IS_SEQUENCE_MODEL (_self)); | 475 | g_return_if_fail (DEE_IS_SEQUENCE_MODEL (_self)); |
86 | 471 | g_return_if_fail (iter != NULL); | 476 | g_return_if_fail (iter != NULL); |
90 | 472 | 477 | g_return_if_fail (!g_sequence_iter_is_end (iter)); | |
88 | 473 | if (iter_ == dee_model_get_last_iter (self)) | ||
89 | 474 | return; | ||
91 | 475 | 478 | ||
92 | 476 | if (iter) | 479 | if (iter) |
93 | 477 | { | 480 | { |
94 | @@ -500,6 +503,7 @@ | |||
95 | 500 | g_return_if_fail (DEE_IS_SEQUENCE_MODEL (_self)); | 503 | g_return_if_fail (DEE_IS_SEQUENCE_MODEL (_self)); |
96 | 501 | g_return_if_fail (iter != NULL); | 504 | g_return_if_fail (iter != NULL); |
97 | 502 | g_return_if_fail (value != NULL); | 505 | g_return_if_fail (value != NULL); |
98 | 506 | g_return_if_fail (column < dee_model_get_n_columns (self)); | ||
99 | 503 | 507 | ||
100 | 504 | priv = _self->priv; | 508 | priv = _self->priv; |
101 | 505 | 509 | ||
102 | @@ -546,14 +550,9 @@ | |||
103 | 546 | guint column, | 550 | guint column, |
104 | 547 | GVariant *value) | 551 | GVariant *value) |
105 | 548 | { | 552 | { |
106 | 549 | DeeSequenceModel *_self = (DeeSequenceModel *)self; | ||
107 | 550 | gpointer *row; | 553 | gpointer *row; |
108 | 551 | 554 | ||
109 | 552 | g_return_if_fail (DEE_IS_SEQUENCE_MODEL (_self)); | ||
110 | 553 | g_return_if_fail (iter != NULL); | ||
111 | 554 | g_return_if_fail (column < dee_model_get_n_columns (self)); | ||
112 | 555 | g_return_if_fail (g_variant_type_equal (g_variant_get_type (value), G_VARIANT_TYPE (dee_model_get_column_schema (self, column)))); | 555 | g_return_if_fail (g_variant_type_equal (g_variant_get_type (value), G_VARIANT_TYPE (dee_model_get_column_schema (self, column)))); |
113 | 556 | g_return_if_fail (value != NULL); | ||
114 | 557 | 556 | ||
115 | 558 | row = g_sequence_get ((GSequenceIter *) iter); | 557 | row = g_sequence_get ((GSequenceIter *) iter); |
116 | 559 | 558 | ||
117 | @@ -576,13 +575,8 @@ | |||
118 | 576 | DeeModelIter *iter, | 575 | DeeModelIter *iter, |
119 | 577 | guint column) | 576 | guint column) |
120 | 578 | { | 577 | { |
121 | 579 | DeeSequenceModel *_self = (DeeSequenceModel *)self; | ||
122 | 580 | gpointer *row; | 578 | gpointer *row; |
123 | 581 | 579 | ||
124 | 582 | g_return_val_if_fail (DEE_IS_SEQUENCE_MODEL (_self), NULL); | ||
125 | 583 | g_return_val_if_fail (iter != NULL, NULL); | ||
126 | 584 | g_return_val_if_fail (column < dee_model_get_n_columns (self), NULL); | ||
127 | 585 | |||
128 | 586 | row = g_sequence_get ((GSequenceIter *) iter); | 580 | row = g_sequence_get ((GSequenceIter *) iter); |
129 | 587 | if (G_UNLIKELY (row == NULL)) | 581 | if (G_UNLIKELY (row == NULL)) |
130 | 588 | { | 582 | { |
131 | @@ -600,6 +594,10 @@ | |||
132 | 600 | DeeModelIter *iter, | 594 | DeeModelIter *iter, |
133 | 601 | guint column) | 595 | guint column) |
134 | 602 | { | 596 | { |
135 | 597 | g_return_val_if_fail (DEE_IS_SEQUENCE_MODEL (self), NULL); | ||
136 | 598 | g_return_val_if_fail (iter != NULL, NULL); | ||
137 | 599 | g_return_val_if_fail (column < dee_model_get_n_columns (self), NULL); | ||
138 | 600 | |||
139 | 603 | GVariant *val = dee_sequence_model_peek_value (self, iter, column); | 601 | GVariant *val = dee_sequence_model_peek_value (self, iter, column); |
140 | 604 | 602 | ||
141 | 605 | if (G_UNLIKELY (val == NULL)) | 603 | if (G_UNLIKELY (val == NULL)) |
142 | @@ -613,6 +611,30 @@ | |||
143 | 613 | return g_variant_ref (val); | 611 | return g_variant_ref (val); |
144 | 614 | } | 612 | } |
145 | 615 | 613 | ||
146 | 614 | static GVariant** | ||
147 | 615 | dee_sequence_model_get_row (DeeModel *self, | ||
148 | 616 | DeeModelIter *iter, | ||
149 | 617 | GVariant **out_row_members) | ||
150 | 618 | { | ||
151 | 619 | guint col, n_cols; | ||
152 | 620 | |||
153 | 621 | g_return_val_if_fail (DEE_IS_SEQUENCE_MODEL (self), NULL); | ||
154 | 622 | |||
155 | 623 | n_cols = dee_model_get_n_columns (self); | ||
156 | 624 | |||
157 | 625 | if (out_row_members == NULL) | ||
158 | 626 | out_row_members = g_new0 (GVariant*, n_cols + 1); | ||
159 | 627 | |||
160 | 628 | /* We use peek_value() here because it saves us from some expensive checks | ||
161 | 629 | * compared to get_value(), that we can guarantee from this call site anyway | ||
162 | 630 | */ | ||
163 | 631 | for (col = 0; col < n_cols; col++) | ||
164 | 632 | out_row_members[col] = g_variant_ref ( | ||
165 | 633 | dee_sequence_model_peek_value (self, iter, col)); | ||
166 | 634 | |||
167 | 635 | return out_row_members; | ||
168 | 636 | } | ||
169 | 637 | |||
170 | 616 | static DeeModelIter* | 638 | static DeeModelIter* |
171 | 617 | dee_sequence_model_get_first_iter (DeeModel *self) | 639 | dee_sequence_model_get_first_iter (DeeModel *self) |
172 | 618 | { | 640 | { |
173 | @@ -794,7 +816,7 @@ | |||
174 | 794 | { | 816 | { |
175 | 795 | g_return_val_if_fail (DEE_IS_SEQUENCE_MODEL (self), NULL); | 817 | g_return_val_if_fail (DEE_IS_SEQUENCE_MODEL (self), NULL); |
176 | 796 | g_return_val_if_fail (iter, NULL); | 818 | g_return_val_if_fail (iter, NULL); |
178 | 797 | g_return_val_if_fail (!dee_model_is_last (self, iter), NULL); | 819 | g_return_val_if_fail (!g_sequence_iter_is_end ((GSequenceIter*) iter), NULL); |
179 | 798 | 820 | ||
180 | 799 | return (DeeModelIter *) g_sequence_iter_next ((GSequenceIter *)iter); | 821 | return (DeeModelIter *) g_sequence_iter_next ((GSequenceIter *)iter); |
181 | 800 | } | 822 | } |
182 | @@ -805,7 +827,7 @@ | |||
183 | 805 | { | 827 | { |
184 | 806 | g_return_val_if_fail (DEE_IS_SEQUENCE_MODEL (self), NULL); | 828 | g_return_val_if_fail (DEE_IS_SEQUENCE_MODEL (self), NULL); |
185 | 807 | g_return_val_if_fail (iter, NULL); | 829 | g_return_val_if_fail (iter, NULL); |
187 | 808 | g_return_val_if_fail (!dee_model_is_first (self, iter), NULL); | 830 | g_return_val_if_fail (!g_sequence_iter_is_begin ((GSequenceIter*) iter), NULL); |
188 | 809 | 831 | ||
189 | 810 | return (DeeModelIter *) g_sequence_iter_prev ((GSequenceIter *)iter); | 832 | return (DeeModelIter *) g_sequence_iter_prev ((GSequenceIter *)iter); |
190 | 811 | } | 833 | } |
191 | 812 | 834 | ||
192 | === modified file 'src/dee-serializable-model.c' | |||
193 | --- src/dee-serializable-model.c 2012-01-09 11:17:10 +0000 | |||
194 | +++ src/dee-serializable-model.c 2012-02-21 12:37:14 +0000 | |||
195 | @@ -144,6 +144,10 @@ | |||
196 | 144 | DeeModelIter *iter, | 144 | DeeModelIter *iter, |
197 | 145 | guint column); | 145 | guint column); |
198 | 146 | 146 | ||
199 | 147 | static GVariant** dee_serializable_model_get_row (DeeModel *self, | ||
200 | 148 | DeeModelIter *iter, | ||
201 | 149 | GVariant **out_row_members); | ||
202 | 150 | |||
203 | 147 | static DeeModelIter* dee_serializable_model_get_first_iter (DeeModel *self); | 151 | static DeeModelIter* dee_serializable_model_get_first_iter (DeeModel *self); |
204 | 148 | 152 | ||
205 | 149 | static DeeModelIter* dee_serializable_model_get_last_iter (DeeModel *self); | 153 | static DeeModelIter* dee_serializable_model_get_last_iter (DeeModel *self); |
206 | @@ -456,16 +460,16 @@ | |||
207 | 456 | static void | 460 | static void |
208 | 457 | dee_serializable_model_clear (DeeModel *self) | 461 | dee_serializable_model_clear (DeeModel *self) |
209 | 458 | { | 462 | { |
211 | 459 | DeeModelIter *iter; | 463 | DeeModelIter *iter, *end; |
212 | 460 | 464 | ||
213 | 461 | g_return_if_fail (DEE_IS_SERIALIZABLE_MODEL (self)); | 465 | g_return_if_fail (DEE_IS_SERIALIZABLE_MODEL (self)); |
214 | 462 | 466 | ||
215 | 463 | iter = dee_model_get_first_iter (self); | 467 | iter = dee_model_get_first_iter (self); |
216 | 468 | end = dee_model_get_last_iter (self); | ||
217 | 464 | 469 | ||
219 | 465 | while (!dee_model_is_last (self, iter)) | 470 | while (iter != end) |
220 | 466 | { | 471 | { |
221 | 467 | dee_model_remove (self, iter); | 472 | dee_model_remove (self, iter); |
222 | 468 | |||
223 | 469 | iter = dee_model_get_first_iter (self); | 473 | iter = dee_model_get_first_iter (self); |
224 | 470 | } | 474 | } |
225 | 471 | } | 475 | } |
226 | @@ -614,6 +618,26 @@ | |||
227 | 614 | return NULL; | 618 | return NULL; |
228 | 615 | } | 619 | } |
229 | 616 | 620 | ||
230 | 621 | static GVariant** | ||
231 | 622 | dee_serializable_model_get_row (DeeModel *self, | ||
232 | 623 | DeeModelIter *iter, | ||
233 | 624 | GVariant **out_row_members) | ||
234 | 625 | { | ||
235 | 626 | guint col, n_cols; | ||
236 | 627 | |||
237 | 628 | g_return_val_if_fail (DEE_IS_SERIALIZABLE_MODEL (self), NULL); | ||
238 | 629 | |||
239 | 630 | n_cols = dee_model_get_n_columns (self); | ||
240 | 631 | |||
241 | 632 | if (out_row_members == NULL) | ||
242 | 633 | out_row_members = g_new0 (GVariant*, n_cols + 1); | ||
243 | 634 | |||
244 | 635 | for (col = 0; col < n_cols; col++) | ||
245 | 636 | out_row_members[col] = dee_model_get_value (self, iter, col); | ||
246 | 637 | |||
247 | 638 | return out_row_members; | ||
248 | 639 | } | ||
249 | 640 | |||
250 | 617 | static gboolean | 641 | static gboolean |
251 | 618 | dee_serializable_model_get_bool (DeeModel *self, | 642 | dee_serializable_model_get_bool (DeeModel *self, |
252 | 619 | DeeModelIter *iter, | 643 | DeeModelIter *iter, |
253 | @@ -1111,6 +1135,7 @@ | |||
254 | 1111 | iface->set_value = dee_serializable_model_set_value; | 1135 | iface->set_value = dee_serializable_model_set_value; |
255 | 1112 | iface->set_row = dee_serializable_model_set_row; | 1136 | iface->set_row = dee_serializable_model_set_row; |
256 | 1113 | iface->get_value = dee_serializable_model_get_value; | 1137 | iface->get_value = dee_serializable_model_get_value; |
257 | 1138 | iface->get_row = dee_serializable_model_get_row; | ||
258 | 1114 | iface->get_first_iter = dee_serializable_model_get_first_iter; | 1139 | iface->get_first_iter = dee_serializable_model_get_first_iter; |
259 | 1115 | iface->get_last_iter = dee_serializable_model_get_last_iter; | 1140 | iface->get_last_iter = dee_serializable_model_get_last_iter; |
260 | 1116 | iface->get_iter_at_row = dee_serializable_model_get_iter_at_row; | 1141 | iface->get_iter_at_row = dee_serializable_model_get_iter_at_row; |
261 | 1117 | 1142 | ||
262 | === modified file 'vapi/Dee-1.0-custom.vala' | |||
263 | --- vapi/Dee-1.0-custom.vala 2012-02-19 17:19:33 +0000 | |||
264 | +++ vapi/Dee-1.0-custom.vala 2012-02-21 12:37:14 +0000 | |||
265 | @@ -1,5 +1,11 @@ | |||
266 | 1 | namespace Dee { | 1 | namespace Dee { |
267 | 2 | 2 | ||
268 | 3 | [CCode (type_id = "dee_model_get_type ()")] | ||
269 | 4 | public interface Model { | ||
270 | 5 | [CCode (array_length = false, array_null_terminated = true)] | ||
271 | 6 | public abstract GLib.Variant[] get_row (Dee.ModelIter iter, [CCode (array_length = false)] out GLib.Variant[] out_row_members = null); | ||
272 | 7 | } | ||
273 | 8 | |||
274 | 3 | public struct Filter { | 9 | public struct Filter { |
275 | 4 | [CCode (cname = "destroy")] | 10 | [CCode (cname = "destroy")] |
276 | 5 | public GLib.DestroyNotify destroy_notify; | 11 | public GLib.DestroyNotify destroy_notify; |
277 | 6 | 12 | ||
278 | === modified file 'vapi/Dee-1.0.metadata' | |||
279 | --- vapi/Dee-1.0.metadata 2012-01-26 10:51:42 +0000 | |||
280 | +++ vapi/Dee-1.0.metadata 2012-02-21 12:37:14 +0000 | |||
281 | @@ -6,7 +6,7 @@ | |||
282 | 6 | Model | 6 | Model |
283 | 7 | .append skip=false | 7 | .append skip=false |
284 | 8 | .get skip=false | 8 | .get skip=false |
286 | 9 | .get_row.out_row_members default=null | 9 | .get_row skip |
287 | 10 | .insert skip=false | 10 | .insert skip=false |
288 | 11 | .insert_before skip=false | 11 | .insert_before skip=false |
289 | 12 | .insert_sorted skip=false | 12 | .insert_sorted skip=false |
290 | 13 | 13 | ||
291 | === modified file 'vapi/dee-1.0.vapi' | |||
292 | --- vapi/dee-1.0.vapi 2012-02-19 17:19:33 +0000 | |||
293 | +++ vapi/dee-1.0.vapi 2012-02-21 12:37:14 +0000 | |||
294 | @@ -217,7 +217,7 @@ | |||
295 | 217 | public abstract uint get_n_rows (); | 217 | public abstract uint get_n_rows (); |
296 | 218 | public abstract uint get_position (Dee.ModelIter iter); | 218 | public abstract uint get_position (Dee.ModelIter iter); |
297 | 219 | [CCode (array_length = false, array_null_terminated = true)] | 219 | [CCode (array_length = false, array_null_terminated = true)] |
299 | 220 | public GLib.Variant[] get_row (Dee.ModelIter iter, [CCode (array_length = false)] out GLib.Variant[] out_row_members = null); | 220 | public abstract GLib.Variant[] get_row (Dee.ModelIter iter, [CCode (array_length = false)] out GLib.Variant[] out_row_members = null); |
300 | 221 | [CCode (array_length_pos = 0.1, array_length_type = "guint")] | 221 | [CCode (array_length_pos = 0.1, array_length_type = "guint")] |
301 | 222 | public abstract unowned string[] get_schema (); | 222 | public abstract unowned string[] get_schema (); |
302 | 223 | public abstract unowned string get_string (Dee.ModelIter iter, uint column); | 223 | public abstract unowned string get_string (Dee.ModelIter iter, uint column); |
I am not entirely sure what the impact of this is...
269 - [CCode (array_length = false, array_null_ terminated = true)]
270 - public GLib.Variant[] get_row (Dee.ModelIter iter, [CCode (array_length = false)] out GLib.Variant[] out_row_members = null);
271 + [NoWrapper]
272 + public abstract GLib.Variant get_row (Dee.ModelIter iter, GLib.Variant out_row_members = null);