1 #include <boost/shared_ptr.hpp>
2 #include <boost/weak_ptr.hpp>
10 T
* get_pointer(boost::shared_ptr
<T
>& p
) { return p
.get(); }
13 boost::shared_ptr
<const A
>* get_const_holder(boost::shared_ptr
<A
>*)
22 LUABIND_ANONYMOUS_FIX
int feedback
= 0;
26 base(): n(4) { feedback
= 3; }
27 virtual ~base() { feedback
= 1; }
37 // this is here to make sure the pointer offsetting works
44 struct derived
: first_base
, base
46 derived(): n2(7) { feedback
= 7; }
47 void f() { feedback
= 5; }
53 if (t
->n
== 4) feedback
= 2;
56 void tester_(derived
* t
)
58 if (t
->n2
== 7) feedback
= 8;
61 void tester2(boost::shared_ptr
<base
> t
)
63 if (t
->n
== 4) feedback
= 9;
66 void tester3(boost::shared_ptr
<const base
> t
)
68 if (t
->n
== 4) feedback
= 10;
71 void tester4(const boost::shared_ptr
<const base
>& t
)
73 if (t
->n
== 4) feedback
= 11;
76 void tester5(const boost::shared_ptr
<const base
>* t
)
78 if ((*t
)->n
== 4) feedback
= 12;
81 void tester6(const boost::shared_ptr
<base
>* t
)
83 if ((*t
)->n
== 4) feedback
= 13;
86 void tester7(boost::shared_ptr
<base
>* t
)
88 if ((*t
)->n
== 4) feedback
= 14;
91 boost::shared_ptr
<base
> tester9()
94 return boost::shared_ptr
<base
>(new base());
99 tester10() : m_member(new base()) {}
100 const boost::shared_ptr
<base
>& test() { return m_member
; }
101 boost::shared_ptr
<base
> m_member
;
106 LUABIND_ANONYMOUS_FIX
int pointer_cnt
= 0;
112 explicit base_holder(base_2
* p
): ptr(p
), secret(2068)
115 base_holder(const base_holder
&)
124 assert(secret
== 2068);
128 base_2
* get() const { return ptr
; }
135 int base_holder::counter
= 0;
137 struct const_base_holder
141 explicit const_base_holder(const base_2
* p
): ptr(p
), secret(9999)
146 const_base_holder(const base_holder
& x
)
150 const_base_holder(const const_base_holder
&)
159 assert(secret
== 9999);
163 const base_2
* get() const { return ptr
; }
171 int const_base_holder::counter
= 0;
173 void tester8(const const_base_holder
&)
178 void tester15(const_base_holder
)
183 const_base_holder
tester16()
185 return const_base_holder(0);
188 } // anonymous namespace
192 base_2
* get_pointer(const base_holder
& p
) { return p
.get(); }
193 const base_2
* get_pointer(const const_base_holder
& p
) { return p
.get(); }
195 const_base_holder
* get_const_holder(base_holder
*)
201 bool test_held_type()
203 using namespace luabind
;
205 boost::shared_ptr
<base
> ptr(new base());
208 lua_State
* L
= lua_open();
211 int top
= lua_gettop(L
);
217 def("tester", &tester
),
218 def("tester", &tester_
),
219 def("tester2", &tester2
),
220 def("tester3", &tester3
),
221 def("tester4", &tester4
),
222 def("tester5", &tester5
),
223 def("tester6", &tester6
),
224 def("tester7", &tester7
),
225 def("tester8", &tester8
),
226 def("tester9", &tester9
),
227 def("tester15", &tester15
),
228 def("tester16", &tester16
),
230 class_
<base
, boost::shared_ptr
<base
> >("base")
231 .def(constructor
<>())
234 class_
<derived
, base
, boost::shared_ptr
<base
> >("derived")
235 .def(constructor
<>())
236 .def("f", &derived::f
),
238 class_
<tester10
>("tester10")
239 .def(constructor
<>())
240 .def("test", &tester10::test
),
242 class_
<base_2
, base_holder
>("base_")
243 .def(constructor
<>())
248 object g
= get_globals(L
);
250 g
["foobar"] = boost::shared_ptr
<const base
>(new base());
252 if (dostring(L
, "tester(test)")) return false;
253 if (feedback
!= 2) return false;
254 if (dostring(L
, "a = base()")) return false;
255 if (feedback
!= 3) return false;
256 if (dostring(L
, "b = derived()")) return false;
257 if (feedback
!= 7) return false;
258 if (dostring(L
, "tester(a)")) return false;
259 if (feedback
!= 2) return false;
260 if (dostring(L
, "tester(b)")) return false;
261 if (feedback
!= 8) return false;
262 if (dostring(L
, "tester2(b)")) return false;
263 if (feedback
!= 9) return false;
264 if (dostring(L
, "tester3(b)")) return false;
265 if (feedback
!= 10) return false;
266 if (dostring(L
, "tester4(foobar)")) return false;
267 if (feedback
!= 11) return false;
268 if (dostring(L
, "tester5(foobar)")) return false;
269 if (feedback
!= 12) return false;
270 if (dostring(L
, "tester6(b)")) return false;
271 if (feedback
!= 13) return false;
272 if (dostring(L
, "tester7(b)")) return false;
273 if (feedback
!= 14) return false;
274 // if (dostring(L, "tester8(b)")) return false;
275 // if (feedback != 19) return false;
276 if (dostring(L
, "c = tester9()")) return false;
277 if (feedback
!= 3) return false;
280 if (dostring(L
, "d = tester10()")) return false;
281 if (dostring(L
, "e = d:test()")) return false;
282 if (feedback
!= 3) return false;
284 if (dostring(L
, "a = base_()")) return false;
285 if (dostring(L
, "tester8(a)")) return false;
286 if (feedback
!= 100) return false;
287 if (dostring(L
, "tester15(a)")) return false;
288 if (feedback
!= 101) return false;
289 if (dostring(L
, "tester8(tester16())")) return false;
290 if (feedback
!= 100) return false;
292 if (top
!= lua_gettop(L
)) return false;
297 if (feedback
!= 1) return false;
299 if (base_holder::counter
!= 0) return false;
300 if (const_base_holder::counter
!= 0) return false;