From acc415b0e770ce1edae840b658ac70ac2294e0fb Mon Sep 17 00:00:00 2001
From: Christian Engwer <christi@dune-project.org>
Date: Wed, 23 Feb 2011 15:10:35 +0000
Subject: [PATCH] implement extended make_shared test to fix problems with
 std::tr1

[[Imported from SVN: r6354]]
---
 dune/common/shared_ptr.hh |  2 +-
 m4/dune_common.m4         |  2 +-
 m4/make_shared.m4         | 36 +++++++++++++++++++++++++++++++-----
 m4/shared_ptr.m4          |  1 +
 4 files changed, 34 insertions(+), 7 deletions(-)

diff --git a/dune/common/shared_ptr.hh b/dune/common/shared_ptr.hh
index cde45e10d..446da04f0 100644
--- a/dune/common/shared_ptr.hh
+++ b/dune/common/shared_ptr.hh
@@ -305,7 +305,7 @@ namespace Dune
   // C++0x and Boost have a make_shared implementation, TR1 does not.
   // Unfortunately, TR1 gets picked over Boost if present.
   // Moreover, boost::make_shared() only exists for (remotely) recent versions of Boost.
-#if HAVE_MEMORY || (HAVE_BOOST_SHARED_PTR_HPP && HAVE_BOOST_MAKE_SHARED_HPP && !HAVE_TR1_MEMORY)
+#if HAVE_MAKE_SHARED
   using SHARED_PTR_NAMESPACE :: make_shared;
 #else
 
diff --git a/m4/dune_common.m4 b/m4/dune_common.m4
index 179cc0161..c7ed80237 100644
--- a/m4/dune_common.m4
+++ b/m4/dune_common.m4
@@ -22,7 +22,7 @@ AC_DEFUN([DUNE_COMMON_CHECKS],
   AC_REQUIRE([STATIC_ASSERT_CHECK])
   AC_REQUIRE([NULLPTR_CHECK])
   AC_REQUIRE([SHARED_PTR])
-  AC_REQUIRE([BOOST_MAKE_SHARED_HPP])
+  AC_REQUIRE([MAKE_SHARED])
   AC_REQUIRE([DUNE_LINKCXX])
   AC_REQUIRE([DUNE_CHECKDEPRECATED])
   AC_REQUIRE([DUNE_SET_MINIMAL_DEBUG_LEVEL])
diff --git a/m4/make_shared.m4 b/m4/make_shared.m4
index 2afa3903c..ee46424b9 100644
--- a/m4/make_shared.m4
+++ b/m4/make_shared.m4
@@ -1,8 +1,34 @@
-AC_DEFUN([BOOST_MAKE_SHARED_HPP],[
-  AC_REQUIRE([AC_PROG_CXX])
+AC_DEFUN([MAKE_SHARED],[
+  AC_REQUIRE([SHARED_PTR])
+  AS_IF([test "$SHARED_PTR_NAMESPACE" = "boost"],[
+    AC_CHECK_HEADER([boost/make_shared.hpp],
+                  [AC_DEFINE([HAVE_BOOST_MAKE_SHARED_HPP], [1],
+                        [Define to 1 if you have <boost/make_shared.hpp>.])])])
+  AC_MSG_CHECKING([whether SHARED_PTR_NAMESPACE ($SHARED_PTR_NAMESPACE) provides make_shared])
   AC_LANG_PUSH([C++])
-     AC_CHECK_HEADER([boost/make_shared.hpp],
-                     [AC_DEFINE([HAVE_BOOST_MAKE_SHARED_HPP], [1],
-                        [Define to 1 if you have <boost/make_shared.hpp>.])])
+    AC_COMPILE_IFELSE(
+      [AC_LANG_PROGRAM([[
+#if defined(HAVE_MEMORY)
+# include <memory>
+#endif
+#if defined(HAVE_TR1_MEMORY)
+# include <tr1/memory>
+#endif
+#if defined(HAVE_BOOST_SHARED_PTR_HPP) && defined(HAVE_BOOST_MAKE_SHARED_HPP)
+# include <boost/shared_ptr.hpp>
+# include <boost/make_shared.hpp>
+#endif
+#include <string>
+            ]],[[
+$SHARED_PTR_NAMESPACE::make_shared<int>(3);
+            ]])],
+            [ AC_MSG_RESULT(yes)
+              have_make_shared=yes
+            ],[AC_MSG_RESULT(no)
+              have_make_shared=no
+            ])
+  AS_IF([test "$have_make_shared" = "yes"],[
+    AC_DEFINE([HAVE_MAKE_SHARED], [1],
+                        [Define to 1 if SHARED_PTR_NAMESPACE::make_shared is usable.])])
   AC_LANG_POP
 ])
diff --git a/m4/shared_ptr.m4 b/m4/shared_ptr.m4
index 562bfeaed..2cca28414 100644
--- a/m4/shared_ptr.m4
+++ b/m4/shared_ptr.m4
@@ -54,6 +54,7 @@ shared_ptr<string> test_ptr(new string("test string"));
   ])
   AS_IF([ test "x$ac_cv_shared_ptr_namespace" = xmissing ],
     [], [
+      SHARED_PTR_NAMESPACE=${ac_cv_shared_ptr_namespace}
       AC_DEFINE_UNQUOTED([SHARED_PTR_NAMESPACE],
                          ${ac_cv_shared_ptr_namespace},
                          [The namespace in which SHARED_PTR can be found])
-- 
GitLab