summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/convert/test/has_member.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/convert/test/has_member.cpp')
-rw-r--r--src/boost/libs/convert/test/has_member.cpp104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/boost/libs/convert/test/has_member.cpp b/src/boost/libs/convert/test/has_member.cpp
new file mode 100644
index 000000000..088d047ae
--- /dev/null
+++ b/src/boost/libs/convert/test/has_member.cpp
@@ -0,0 +1,104 @@
+// Boost.Convert test and usage example
+// Copyright (c) 2009-2016 Vladimir Batov.
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. See http://www.boost.org/LICENSE_1_0.txt.
+
+#include "./test.hpp"
+
+#if defined(BOOST_CONVERT_IS_NOT_SUPPORTED)
+int main(int, char const* []) { return 0; }
+#else
+
+#include <boost/convert.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <vector>
+#include <iostream>
+
+//[has_member_declaration
+namespace { namespace local
+{
+ BOOST_DECLARE_HAS_MEMBER(has_begin, begin);
+ BOOST_DECLARE_HAS_MEMBER(has_funop, operator());
+}}
+//]
+//[has_member_classes_tested
+namespace { namespace local
+{
+ struct test01 { int begin; };
+ struct test02 { char* begin() { return 0; } };
+ struct test22 { void operator()() {} };
+}}
+//]
+
+namespace { namespace local
+{
+ struct test03
+ {
+ void begin(int) {}
+ int begin(int, int) { return 0; }
+ };
+ struct test04
+ {
+ virtual ~test04() {}
+
+ private: virtual char* begin() { return 0; }
+ };
+ struct test05
+ {
+ virtual char* begin() { return 0; }
+ virtual ~test05() {}
+ };
+ struct test06 : public test04 {};
+ struct test07 : private test04 {};
+ struct test08 : public test05 {};
+ struct test09 : private test05 {};
+
+ struct test11 { int no_begin; };
+ struct test12 { char* no_begin() { return 0; } };
+}}
+
+namespace { namespace local
+{
+ struct test21 { void zoo () {} };
+ struct test23 { void operator() () const {} };
+ struct test24 { int operator() (int) { return 0; } };
+ struct test25 { int operator() (int) const { return 0; } };
+ struct test26 { int operator() (int) const { return 0; } void operator() () const {} };
+}}
+
+int
+main(int, char const* [])
+{
+ BOOST_TEST(local::has_begin<local::test01>::value == true);
+ BOOST_TEST(local::has_begin<local::test02>::value == true);
+ BOOST_TEST(local::has_begin<local::test03>::value == true);
+ BOOST_TEST(local::has_begin<local::test04>::value == true);
+ BOOST_TEST(local::has_begin<local::test05>::value == true);
+ BOOST_TEST(local::has_begin<local::test06>::value == true);
+ BOOST_TEST(local::has_begin<local::test07>::value == true);
+ BOOST_TEST(local::has_begin<local::test08>::value == true);
+ BOOST_TEST(local::has_begin<local::test09>::value == true);
+ BOOST_TEST(local::has_begin<std::string>::value == true);
+ BOOST_TEST(local::has_begin<std::vector<int> >::value == true);
+
+ BOOST_TEST(local::has_begin<local::test11>::value == false);
+ BOOST_TEST(local::has_begin<local::test12>::value == false);
+ BOOST_TEST(local::has_begin<std::iostream>::value == false);
+
+ //[has_member_usage
+ BOOST_TEST(local::has_begin<local::test01>::value == true);
+ BOOST_TEST(local::has_begin<local::test02>::value == true);
+ BOOST_TEST(local::has_funop<local::test22>::value == true);
+ //]
+
+ BOOST_TEST(local::has_funop<local::test21>::value == false);
+ BOOST_TEST(local::has_funop<local::test22>::value == true);
+ BOOST_TEST(local::has_funop<local::test23>::value == true);
+ BOOST_TEST(local::has_funop<local::test24>::value == true);
+ BOOST_TEST(local::has_funop<local::test25>::value == true);
+ BOOST_TEST(local::has_funop<local::test26>::value == true);
+
+ return boost::report_errors();
+}
+
+#endif