summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/python/test/select_holder.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/boost/libs/python/test/select_holder.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/boost/libs/python/test/select_holder.cpp b/src/boost/libs/python/test/select_holder.cpp
new file mode 100644
index 000000000..8650bd06a
--- /dev/null
+++ b/src/boost/libs/python/test/select_holder.cpp
@@ -0,0 +1,76 @@
+// Copyright David Abrahams 2002.
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+#include <boost/python/object/class_metadata.hpp>
+#include <boost/python/has_back_reference.hpp>
+#include <boost/python/detail/not_specified.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/python/detail/type_traits.hpp>
+#include <boost/function/function0.hpp>
+#include <boost/mpl/bool.hpp>
+#include <memory>
+
+struct BR {};
+
+struct Base {};
+struct Derived : Base {};
+
+namespace boost { namespace python
+{
+ // specialization
+ template <>
+ struct has_back_reference<BR>
+ : mpl::true_
+ {
+ };
+}} // namespace boost::python
+
+template <class T, class U>
+void assert_same(U* = 0, T* = 0)
+{
+ BOOST_STATIC_ASSERT((boost::python::detail::is_same<T,U>::value));
+
+}
+
+template <class T, class Held, class Holder>
+void assert_holder(T* = 0, Held* = 0, Holder* = 0)
+{
+ using namespace boost::python::detail;
+ using namespace boost::python::objects;
+
+ typedef typename class_metadata<
+ T,Held,not_specified,not_specified
+ >::holder h;
+
+ assert_same<Holder>(
+ (h*)0
+ );
+}
+
+int test_main(int, char * [])
+{
+ using namespace boost::python::detail;
+ using namespace boost::python::objects;
+
+ assert_holder<Base,not_specified,value_holder<Base> >();
+
+ assert_holder<BR,not_specified,value_holder_back_reference<BR,BR> >();
+ assert_holder<Base,Base,value_holder_back_reference<Base,Base> >();
+ assert_holder<BR,BR,value_holder_back_reference<BR,BR> >();
+
+ assert_holder<Base,Derived
+ ,value_holder_back_reference<Base,Derived> >();
+
+ assert_holder<Base,std::auto_ptr<Base>
+ ,pointer_holder<std::auto_ptr<Base>,Base> >();
+
+ assert_holder<Base,std::auto_ptr<Derived>
+ ,pointer_holder_back_reference<std::auto_ptr<Derived>,Base> >();
+
+ assert_holder<BR,std::auto_ptr<BR>
+ ,pointer_holder_back_reference<std::auto_ptr<BR>,BR> > ();
+
+ return 0;
+}
+