diff --git a/dune/common/shared_ptr.hh b/dune/common/shared_ptr.hh index cde45e10d3d173158aeb0688fb49c146ba25dc3b..446da04f01dcc203160912919b2703114400b44c 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 179cc01610fd0cb62faec69028e6b7614be14a78..c7ed80237f59e10192e7fadf7afebd180c3701a3 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 2afa3903c8fd65d0ec4a2152685c477b6dd1b374..ee46424b9e091fe05bcdac462608a26a917d4f7d 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 562bfeaede517374e59acefccfa1006ce9704f7e..2cca28414ef42d373a8bbd0c0e2ead55a7e9beb4 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])