]> granicus.if.org Git - taglib/commitdiff
Use shared_ptr if possible regardless of C++11 support
authorTsuda kageyu <tsuda.kageyu@gmail.com>
Wed, 17 Apr 2013 12:41:23 +0000 (21:41 +0900)
committerTsuda kageyu <tsuda.kageyu@gmail.com>
Wed, 17 Apr 2013 12:41:23 +0000 (21:41 +0900)
CMakeLists.txt
ConfigureChecks.cmake
config-taglib.h.cmake
taglib/toolkit/trefcountptr.h

index e56978f52718fd996039e7eb1a26ad6cd1c30382..1f29e4634a65452b532cbd1f6912e7dfe5ef2707 100755 (executable)
@@ -11,11 +11,6 @@ else()
 endif()
 OPTION(ENABLE_STATIC_RUNTIME "Visual Studio, link with runtime statically"  OFF)
 
-option(ENABLE_CXX11 "Enable C++11 features" OFF)
-if(ENABLE_CXX11)
-  add_definitions(-DTAGLIB_USE_CXX11)
-endif()
-
 option(VISIBILITY_HIDDEN "Build with -fvisibility=hidden"  OFF)
 if(VISIBILITY_HIDDEN)
   add_definitions (-fvisibility=hidden)
index e4a6d1fac59c91dafb29d9b30cafffd17b397ec2..ec0da6d154d5a9bd596a2528f5c8b4d5e7255c85 100644 (file)
@@ -9,15 +9,32 @@ include(CheckCXXSourceCompiles)
 # check for libz using the cmake supplied FindZLIB.cmake
 find_package(ZLIB)
 if(ZLIB_FOUND)
-       set(HAVE_ZLIB 1)
+    set(HAVE_ZLIB 1)
 else()
-       set(HAVE_ZLIB 0)
+    set(HAVE_ZLIB 0)
 endif()
 
+# Determine where shared_ptr<T> is defined regardless of C++11 support.
+
+check_cxx_source_compiles("
+    #include <memory>
+    int main() { std::tr1::shared_ptr<int> x; return 0; }
+" HAVE_STD_SHARED_PTR)
+
+check_cxx_source_compiles("
+    #include <tr1/memory>
+    int main() { std::tr1::shared_ptr<int> x; return 0; }
+" HAVE_TR1_SHARED_PTR)
+
+check_cxx_source_compiles("
+    #include <boost/shared_ptr.hpp>
+    int main() { boost::shared_ptr<int> x; return 0; }
+" HAVE_BOOST_SHARED_PTR)
+
 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
 find_package(CppUnit)
 if(NOT CppUnit_FOUND AND BUILD_TESTS)
-       message(STATUS "CppUnit not found, disabling tests.")
-       set(BUILD_TESTS OFF)
+    message(STATUS "CppUnit not found, disabling tests.")
+    set(BUILD_TESTS OFF)
 endif()
 
index 9c2f487d1dea0e501d06f42b7af82c9205e5253a..8ce6798b3cd3566c1992f095c30af75b8dcfd508 100644 (file)
@@ -3,6 +3,10 @@
 /* Define if you have libz */
 #cmakedefine   HAVE_ZLIB 1
 
+#cmakedefine   HAVE_STD_SHARED_PTR 1
+#cmakedefine   HAVE_TR1_SHARED_PTR 1
+#cmakedefine   HAVE_BOOST_SHARED_PTR 1
+
 #cmakedefine   NO_ITUNES_HACKS 1
 #cmakedefine   WITH_ASF 1
 #cmakedefine   WITH_MP4 1
index fb01de37dae4477e31c49f0a6b856b96e7a0f574..492afcd576c8c7108f6b833659eaa2f68ca2b010 100644 (file)
 #ifndef TAGLIB_REFCOUNTPTR_H
 #define TAGLIB_REFCOUNTPTR_H
 
-// TAGLIB_USE_CXX11 determines whether or not to enable C++11 features.
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef DO_NOT_DOCUMENT // Tell Doxygen to skip this class.
+/*!
+ * \internal
+ * This is just used as a smart pointer for shared classes in TagLib.
+ *
+ * \warning This <b>is not</b> part of the TagLib public API!
+ */
 
-#ifdef TAGLIB_USE_CXX11
+// RefCountPtr<T> is just an alias of shared_ptr<T> if it is available.
+
+#if defined(HAVE_STD_SHARED_PTR)
 # include <memory>
+# define RefCountPtr std::tr1::shared_ptr
+
+#elif defined(HAVE_TR1_SHARED_PTR) 
+# include <tr1/memory>
+# define RefCountPtr std::tr1::shared_ptr
+
+#elif defined(HAVE_BOOST_SHARED_PTR) 
+# include <boost/shared_ptr.hpp>
+# define RefCountPtr boost::shared_ptr
 
 #else
 # ifdef __APPLE__
 #   include <ia64intrin.h>
 #   define TAGLIB_ATOMIC_GCC
 # endif
-#endif
-
-#ifndef DO_NOT_DOCUMENT // Tell Doxygen to skip this class.
-
-/*!
- * \internal
- * This is just used as a smart pointer for shared classes in TagLib.
- *
- * \warning This <b>is not</b> part of the TagLib public API!
- */
-
-#ifdef TAGLIB_USE_CXX11
-
-  // RefCountPtr<T> is just an alias of std::shared_ptr<T> if C++11 is available.
-# define RefCountPtr std::shared_ptr
-
-  // Workaround for the fact that some compilers don't support the template aliases.
-
-#else
 
 namespace TagLib {
 
-  // RefCountPtr<T> mimics std::shared_ptr<T> if C++11 is not available.
+  // RefCountPtr<T> mimics std::shared_ptr<T> if it is not available.
 
   template<typename T>
   class RefCountPtr