efl
374 строки · 16.0 Кб
1#ifdef HAVE_CONFIG_H
2# include "elementary_config.h"
3#endif
4
5#include <Efl_Ui.h>
6#include <Elementary.h>
7#include "elm_suite.h"
8
9#define COORD_EQ(a, b) (!!(abs(a - b) < 2))
10#define GEOMETRY_EQ(a, b) (COORD_EQ(a.x, b.x) && COORD_EQ(a.y, b.y) && \
11COORD_EQ(a.w, b.w) && COORD_EQ(a.h, b.h))
12
13typedef struct {
14Eina_Size2D max;
15Eina_Size2D min;
16double weightx;
17double weighty;
18double alignx;
19double aligny;
20int marginl;
21int marginr;
22int margint;
23int marginb;
24Efl_Gfx_Hint_Aspect mode;
25Eina_Size2D aspect;
26Eina_Bool fillx;
27Eina_Bool filly;
28Eina_Size2D layout_size;
29Eina_Size2D layout_expected;
30Eina_Rect expected;
31char testname[1024];
32} Hint;
33
34static Hint hints[] = {
35{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(0, 0), 1, 1, 0.5, 0.5, 0, 0, 0, 0,
36EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_TRUE, EINA_TRUE,
37EINA_SIZE2D(200, 200), EINA_SIZE2D(200, 200),
38EINA_RECT(0, 0, 200, 200), "[0]" },
39{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 1, 1, 0.3, 0.5, 0, 0, 0, 0,
40EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_TRUE, EINA_TRUE,
41EINA_SIZE2D(200, 200), EINA_SIZE2D(200, 200),
42EINA_RECT(0, 0, 200, 200), "[1]" },
43{ EINA_SIZE2D(50, 150), EINA_SIZE2D(70, 70), 1, 1, 0.3, 0.7, 0, 0, 0, 0,
44EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_TRUE, EINA_TRUE,
45EINA_SIZE2D(200, 200), EINA_SIZE2D(200, 200),
46EINA_RECT((200 - 70) * 0.3, (200 - 150) * 0.7, 70, 150), "[2]" },
47{ EINA_SIZE2D(150, -1), EINA_SIZE2D(70, 70), 0, 0, 0.3, 0.7, 0, 0, 0, 0,
48EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_FALSE, EINA_FALSE,
49EINA_SIZE2D(200, 200), EINA_SIZE2D(200, 200),
50EINA_RECT((200 - 70) * 0.3, (200 - 70) * 0.7, 70, 70), "[3]" },
51{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 1, 0, 0.3, 0.7, 0, 0, 0, 0,
52EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_FALSE, EINA_TRUE,
53EINA_SIZE2D(200, 200), EINA_SIZE2D(200, 200),
54EINA_RECT((200 - 70) * 0.3, (200 - 70) * 0.7, 70, 70), "[4]" },
55{ EINA_SIZE2D(150, 150), EINA_SIZE2D(70, 70), 1, 0, 0.3, 0.7, 0, 0, 0, 0,
56EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_FALSE, EINA_TRUE,
57EINA_SIZE2D(200, 200), EINA_SIZE2D(200, 200),
58EINA_RECT((200 - 70) * 0.3, (200 - 70) * 0.7, 70, 70), "[5]" },
59{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 0, 1, 0.3, 0.7, 0, 0, 0, 0,
60EFL_GFX_HINT_ASPECT_BOTH, EINA_SIZE2D(1, 3), EINA_TRUE, EINA_FALSE,
61EINA_SIZE2D(200, 200), EINA_SIZE2D(200, 200),
62EINA_RECT((200 - 70) * 0.3, -7, 70, 70 * 3), "[6]" },
63{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 0, 1, 0.3, 0.7, 0, 0, 0, 0,
64EFL_GFX_HINT_ASPECT_BOTH, EINA_SIZE2D(1, 3), EINA_TRUE, EINA_FALSE,
65EINA_SIZE2D(300, 300), EINA_SIZE2D(300, 300),
66EINA_RECT((300 - 70) * 0.3, (300 - 70 * 3) * 0.7, 70, 70 * 3), "[7]" },
67{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 1, 0, 0.3, 0.7, 0, 0, 0, 0,
68EFL_GFX_HINT_ASPECT_BOTH, EINA_SIZE2D(1, 3), EINA_TRUE, EINA_FALSE,
69EINA_SIZE2D(200, 200), EINA_SIZE2D(200, 200),
70EINA_RECT((200 - 70) * 0.3, -7, 70, 70 * 3), "[8]" },
71{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 1, 0, 0.3, 0.7, 0, 0, 0, 0,
72EFL_GFX_HINT_ASPECT_BOTH, EINA_SIZE2D(1, 3), EINA_TRUE, EINA_FALSE,
73EINA_SIZE2D(300, 300), EINA_SIZE2D(300, 300),
74EINA_RECT((300 - 70) * 0.3, (300 - 70 * 3) * 0.7, 70, 70 * 3), "[9]" },
75{ EINA_SIZE2D(-1, 150), EINA_SIZE2D(70, 70), 0, 1, 0.3, 0.7, 0, 0, 0, 0,
76EFL_GFX_HINT_ASPECT_BOTH, EINA_SIZE2D(1, 3), EINA_TRUE, EINA_FALSE,
77EINA_SIZE2D(200, 200), EINA_SIZE2D(200, 200),
78EINA_RECT((200 - 70) * 0.3, -7, 70, 70 * 3), "[10]" },
79{ EINA_SIZE2D(-1, 150), EINA_SIZE2D(70, 70), 0, 1, 0.3, 0.7, 0, 0, 0, 0,
80EFL_GFX_HINT_ASPECT_BOTH, EINA_SIZE2D(1, 3), EINA_TRUE, EINA_FALSE,
81EINA_SIZE2D(300, 300), EINA_SIZE2D(300, 300),
82EINA_RECT((300 - 70) * 0.3, (300 - 70 * 3) * 0.7, 70, 70 * 3), "[11]" },
83{ EINA_SIZE2D(-1, 150), EINA_SIZE2D(70, 70), 1, 0, 0.3, 0.7, 0, 0, 0, 0,
84EFL_GFX_HINT_ASPECT_BOTH, EINA_SIZE2D(1, 3), EINA_TRUE, EINA_FALSE,
85EINA_SIZE2D(200, 200), EINA_SIZE2D(200, 200),
86EINA_RECT((200 - 70) * 0.3, -7, 70, 70 * 3), "[12]" },
87{ EINA_SIZE2D(-1, 150), EINA_SIZE2D(70, 70), 1, 0, 0.3, 0.7, 0, 0, 0, 0,
88EFL_GFX_HINT_ASPECT_BOTH, EINA_SIZE2D(1, 3), EINA_TRUE, EINA_FALSE,
89EINA_SIZE2D(300, 300), EINA_SIZE2D(300, 300),
90EINA_RECT((300 - 70) * 0.3, (300 - 70 * 3) * 0.7, 70, 70 * 3), "[13]" },
91};
92
93static Hint hints2[][2] = {
94{
95{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 1, 1, 0.3, 0.7, 0, 0, 0, 0,
96EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_FALSE, EINA_FALSE,
97EINA_SIZE2D(150, 300), EINA_SIZE2D(150, 300),
98EINA_RECT((150 - 70) * 0.3, (150 - 70) * 0.7, 70, 70), "[1/1 weight btn]" },
99{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 1, 1, 0.8, 0.2, 0, 0, 0, 0,
100EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_FALSE, EINA_FALSE,
101EINA_SIZE2D(150, 300), EINA_SIZE2D(150, 300),
102EINA_RECT((150 - 70) * 0.8, (150 - 70) * 0.2 + 150, 70, 70), "[1/1 weight btn2]" }
103},
104{
105{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 1, 0, 0.3, 0.7, 0, 0, 0, 0,
106EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_FALSE, EINA_FALSE,
107EINA_SIZE2D(150, 300), EINA_SIZE2D(150, 300),
108EINA_RECT((150 - 70) * 0.3, 0, 70, 70), "[0/1 weight btn]" },
109{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 1, 1, 0.8, 0.2, 0, 0, 0, 0,
110EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_FALSE, EINA_FALSE,
111EINA_SIZE2D(150, 300), EINA_SIZE2D(150, 300),
112EINA_RECT((150 - 70) * 0.8, (300 - 140) * 0.2 + 70, 70, 70), "[0/1 weight btn2]" }
113},
114{
115{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 1, 0, 0.3, 0.7, 0, 0, 0, 0,
116EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_FALSE, EINA_FALSE,
117EINA_SIZE2D(150, 300), EINA_SIZE2D(150, 300),
118EINA_RECT((150 - 70) * 0.3, (300 - 140) * 0.7, 70, 70), "[0/0 weight btn]" },
119{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 1, 0, 0.8, 0.2, 0, 0, 0, 0,
120EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_FALSE, EINA_FALSE,
121EINA_SIZE2D(150, 300), EINA_SIZE2D(150, 300),
122EINA_RECT((150 - 70) * 0.8, (300 - 140) * 0.7 + 70, 70, 70), "[0/0 weight btn2]" }
123},
124};
125
126static Hint hints3[][3] = {
127{
128{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 1, 1, 0.3, 0.7, 0, 0, 0, 0,
129EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_TRUE, EINA_TRUE,
130EINA_SIZE2D(150, 300), EINA_SIZE2D(150, 300),
131EINA_RECT(0, 0, 150, 100), "[1/1/1 weight_l btn]" },
132{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 100), 1, 1, 0.8, 0.2, 0, 0, 0, 0,
133EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_TRUE, EINA_TRUE,
134EINA_SIZE2D(150, 300), EINA_SIZE2D(150, 300),
135EINA_RECT(0, 100, 150, 100), "[1/1/1 weight_l btn2]" },
136{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 1, 1, 0.8, 0.2, 0, 0, 0, 0,
137EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_TRUE, EINA_TRUE,
138EINA_SIZE2D(150, 300), EINA_SIZE2D(150, 300),
139EINA_RECT(0, 100 + 100, 150, 100), "[1/1/1 weight_l btn2]" }
140},
141{
142{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 1, 1, 0.3, 0.7, 0, 0, 0, 0,
143EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_TRUE, EINA_TRUE,
144EINA_SIZE2D(150, 270), EINA_SIZE2D(150, 270),
145EINA_RECT(0, 0, 150, 85), "[1/1/1 weight_m btn]" },
146{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 100), 1, 1, 0.8, 0.2, 0, 0, 0, 0,
147EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_TRUE, EINA_TRUE,
148EINA_SIZE2D(150, 270), EINA_SIZE2D(150, 270),
149EINA_RECT(0, 85, 150, 100), "[1/1/1 weight_m btn2]" },
150{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 1, 1, 0.8, 0.2, 0, 0, 0, 0,
151EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_TRUE, EINA_TRUE,
152EINA_SIZE2D(150, 270), EINA_SIZE2D(150, 270),
153EINA_RECT(0, 100 + 85, 150, 85), "[1/1/1 weight_m btn2]" }
154},
155{
156{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 1, 1, 0.3, 0.7, 0, 0, 0, 0,
157EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_TRUE, EINA_TRUE,
158EINA_SIZE2D(150, 200), EINA_SIZE2D(150, 200),
159EINA_RECT(0, -28, 150, 70), "[1/1/1 weight_s btn]" },
160{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 100), 1, 1, 0.8, 0.2, 0, 0, 0, 0,
161EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_TRUE, EINA_TRUE,
162EINA_SIZE2D(150, 200), EINA_SIZE2D(150, 200),
163EINA_RECT(0, 42, 150, 100), "[1/1/1 weight_s btn2]" },
164{ EINA_SIZE2D(-1, -1), EINA_SIZE2D(70, 70), 1, 1, 0.8, 0.2, 0, 0, 0, 0,
165EFL_GFX_HINT_ASPECT_NONE, EINA_SIZE2D(0, 0), EINA_TRUE, EINA_TRUE,
166EINA_SIZE2D(150, 200), EINA_SIZE2D(150, 200),
167EINA_RECT(0, 142, 150, 70), "[1/1/1 weight_s btn2]" }
168},
169};
170
171static Eo *win, *layout;
172
173static void
174btn_hint_set(Eo *btn, Hint *hint)
175{
176efl_gfx_entity_size_set(layout, hint->layout_size);
177efl_gfx_hint_size_max_set(btn, hint->max);
178efl_gfx_hint_size_min_set(btn, hint->min);
179efl_gfx_hint_margin_set(btn, hint->marginl, hint->marginr, hint->margint,
180hint->marginb);
181efl_gfx_hint_weight_set(btn, hint->weightx, hint->weighty);
182efl_gfx_hint_align_set(btn, hint->alignx, hint->aligny);
183efl_gfx_hint_fill_set(btn, hint->fillx, hint->filly);
184efl_gfx_hint_aspect_set(btn, hint->mode, hint->aspect);
185efl_canvas_group_calculate(layout);
186}
187
188static void
189btn_geom_assert(Hint *hint, Eina_Rect btn_geom)
190{
191Eina_Size2D layout_size, layout_min;
192
193layout_size = efl_gfx_entity_size_get(layout);
194layout_min = efl_gfx_hint_size_min_get(layout);
195layout_size.w = layout_size.w > layout_min.w ? layout_size.w : layout_min.w;
196layout_size.h = layout_size.h > layout_min.h ? layout_size.h : layout_min.h;
197
198ck_assert_msg(GEOMETRY_EQ(btn_geom, hint->expected),
199"Case %s failed... button geometry: (%d, %d, %d, %d) expected geometry: (%d, %d, %d, %d)",
200hint->testname, btn_geom.x, btn_geom.y, btn_geom.w, btn_geom.h,
201hint->expected.x, hint->expected.y, hint->expected.w, hint->expected.h);
202ck_assert_msg(COORD_EQ(layout_size.w, hint->layout_expected.w) &&
203COORD_EQ(layout_size.h, hint->layout_expected.h),
204"Case %s failed... layout size: (%d, %d) expected size: (%d, %d)",
205hint->testname, layout_size.w, layout_size.h,
206hint->layout_expected.w, hint->layout_expected.h);
207}
208
209static void
210layout_setup()
211{
212win = efl_add(EFL_UI_WIN_CLASS, efl_main_loop_get(),
213efl_ui_win_type_set(efl_added, EFL_UI_WIN_TYPE_BASIC));
214
215layout = efl_add(EFL_UI_RELATIVE_CONTAINER_CLASS, win,
216efl_gfx_entity_size_set(efl_added, EINA_SIZE2D(200, 200)));
217
218efl_gfx_entity_size_set(win, EINA_SIZE2D(200, 200));
219}
220
221EFL_START_TEST (efl_ui_relative_container_class_check)
222{
223const char *class;
224
225class = efl_class_name_get(layout);
226
227ck_assert(class != NULL);
228ck_assert(!strcmp(class, "Efl.Ui.Relative_Container"));
229}
230EFL_END_TEST
231
232EFL_START_TEST (efl_ui_relative_container_layout_update)
233{
234int i, max_index = (sizeof(hints) / sizeof(Hint));
235
236Eo *btn = efl_add(EFL_UI_BUTTON_CLASS, layout, efl_pack(layout, efl_added));
237
238for (i = 0; i < max_index; i++)
239{
240btn_hint_set(btn, &hints[i]);
241btn_geom_assert(&hints[i], efl_gfx_entity_geometry_get(btn));
242}
243}
244EFL_END_TEST
245
246EFL_START_TEST (efl_ui_relative_container_layout_update_chain)
247{
248int i, max_index2, max_index3;
249Eo *btn, *btn2, *btn3;
250
251btn = efl_add(EFL_UI_BUTTON_CLASS, layout);
252btn2 = efl_add(EFL_UI_BUTTON_CLASS, layout);
253
254max_index2 = ((sizeof(hints2) / sizeof(Hint)) / 2);
255max_index3 = ((sizeof(hints3) / sizeof(Hint)) / 3);
256
257efl_ui_relative_container_relation_bottom_set(layout, btn, btn2, 0.0);
258efl_ui_relative_container_relation_top_set(layout, btn2, btn, 1.0);
259
260for (i = 0; i < max_index2; i++)
261{
262btn_hint_set(btn, &hints2[i][0]);
263btn_hint_set(btn2, &hints2[i][1]);
264btn_geom_assert(&hints2[i][0], efl_gfx_entity_geometry_get(btn));
265btn_geom_assert(&hints2[i][1], efl_gfx_entity_geometry_get(btn2));
266}
267
268btn3 = efl_add(EFL_UI_BUTTON_CLASS, layout);
269efl_ui_relative_container_relation_bottom_set(layout, btn2, btn3, 0.0);
270efl_ui_relative_container_relation_top_set(layout, btn3, btn2, 1.0);
271
272for (i = 0; i < max_index3; i++)
273{
274btn_hint_set(btn, &hints3[i][0]);
275btn_hint_set(btn2, &hints3[i][1]);
276btn_hint_set(btn3, &hints3[i][2]);
277btn_geom_assert(&hints3[i][0], efl_gfx_entity_geometry_get(btn));
278btn_geom_assert(&hints3[i][1], efl_gfx_entity_geometry_get(btn2));
279btn_geom_assert(&hints3[i][2], efl_gfx_entity_geometry_get(btn3));
280}
281}
282EFL_END_TEST
283
284EFL_START_TEST (efl_ui_relative_container_relation_set)
285{
286Eo *btn;
287Eo *target = NULL;
288double relative;
289
290btn = efl_add(EFL_UI_BUTTON_CLASS, layout);
291
292// negative test
293efl_ui_relative_container_relation_top_get(layout, NULL, &target, &relative);
294ck_assert_ptr_eq(target, NULL);
295ck_assert(EINA_DBL_EQ(relative, 0.0));
296
297efl_ui_relative_container_relation_top_get(layout, btn, &target, &relative);
298ck_assert_ptr_eq(target, NULL);
299ck_assert(EINA_DBL_EQ(relative, 0.0));
300
301efl_ui_relative_container_relation_top_set(layout, NULL, NULL, 0.0);
302ck_assert_ptr_eq(target, NULL);
303ck_assert(EINA_DBL_EQ(relative, 0.0));
304
305// default value test
306efl_ui_relative_container_relation_top_set(layout, btn, layout, 0.0);
307
308efl_ui_relative_container_relation_top_get(layout, btn, &target, &relative);
309ck_assert_ptr_eq(target, layout);
310ck_assert(EINA_DBL_EQ(relative, 0.0));
311efl_ui_relative_container_relation_bottom_get(layout, btn, &target, &relative);
312ck_assert_ptr_eq(target, layout);
313ck_assert(EINA_DBL_EQ(relative, 1.0));
314efl_ui_relative_container_relation_left_get(layout, btn, &target, &relative);
315ck_assert_ptr_eq(target, layout);
316ck_assert(EINA_DBL_EQ(relative, 0.0));
317efl_ui_relative_container_relation_right_get(layout, btn, &target, &relative);
318ck_assert_ptr_eq(target, layout);
319ck_assert(EINA_DBL_EQ(relative, 1.0));
320
321// positive test
322efl_ui_relative_container_relation_top_set(layout, btn, layout, 0.123);
323efl_ui_relative_container_relation_top_get(layout, btn, &target, &relative);
324ck_assert_ptr_eq(target, layout);
325ck_assert(EINA_DBL_EQ(relative, 0.123));
326
327efl_ui_relative_container_relation_top_set(layout, btn, NULL, 0.456);
328efl_ui_relative_container_relation_top_get(layout, btn, &target, &relative);
329ck_assert_ptr_eq(target, layout);
330ck_assert(EINA_DBL_EQ(relative, 0.456));
331}
332EFL_END_TEST
333
334EFL_START_TEST (efl_ui_relative_container_pack)
335{
336Eo *btn[3], *child;
337Eina_Iterator *it;
338int i;
339
340for (i = 0; i < 3; i++)
341btn[i] = efl_add(EFL_UI_BUTTON_CLASS, layout, efl_pack(layout, efl_added));
342ck_assert_int_eq(efl_content_count(layout), 3);
343
344it = efl_content_iterate(layout);
345EINA_ITERATOR_FOREACH(it, child)
346ck_assert_ptr_eq(layout, efl_canvas_object_render_parent_get(child));
347eina_iterator_free(it);
348
349efl_pack_unpack(layout, NULL);
350ck_assert_int_eq(efl_content_count(layout), 3);
351efl_pack_unpack(layout, btn[0]);
352ck_assert_int_eq(efl_content_count(layout), 2);
353efl_pack_unpack_all(layout);
354ck_assert_int_eq(efl_content_count(layout), 0);
355
356for (i = 0; i < 3; i++)
357efl_pack(layout, btn[i]);
358ck_assert_int_eq(efl_content_count(layout), 3);
359efl_pack_clear(layout);
360ck_assert_int_eq(efl_content_count(layout), 0);
361for (i = 0; i < 3; i++)
362ck_assert(efl_invalidated_get(btn[i]));
363}
364EFL_END_TEST
365
366void efl_ui_test_relative_container(TCase *tc)
367{
368tcase_add_checked_fixture(tc, layout_setup, NULL);
369tcase_add_test(tc, efl_ui_relative_container_class_check);
370tcase_add_test(tc, efl_ui_relative_container_layout_update);
371tcase_add_test(tc, efl_ui_relative_container_layout_update_chain);
372tcase_add_test(tc, efl_ui_relative_container_relation_set);
373tcase_add_test(tc, efl_ui_relative_container_pack);
374}
375