Support building without TR1. Change-Id: Ib59e201198e1ff2621626ab80e6b6f2156f0d1d1
diff --git a/CMakeLists.txt b/CMakeLists.txt index 628cab7..f8af88c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -413,17 +413,27 @@ ADD_DEFINITIONS(-DCERES_NO_THREADS) ENDIF (${BUILD_ANDROID}) -# Use the std namespace for the hash<> and related templates. This may vary by -# system. -IF (MSVC) - # This is known to work with Visual Studio 2010 Express. - ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_START=namespace std {\"") - ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_END=}\"") -ELSE (MSVC) - # This is known to work with recent versions of Linux and Mac OS X. - ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_START=namespace std { namespace tr1 {\"") - ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_END=}}\"") -ENDIF (MSVC) +OPTION(DISABLE_TR1 + "Don't use TR1. This replaces some hash tables with sets. Slower." + OFF) + +IF (${DISABLE_TR1}) + MESSAGE("-- Replacing unordered_map/set with map/set (warning: slower!)") + ADD_DEFINITIONS(-DCERES_NO_TR1) +ELSE (${DISABLE_TR1}) + MESSAGE("-- Using normal TR1 unordered_map/set") + # Use the std namespace for the hash<> and related templates. This may vary by + # system. + IF (MSVC) + # This is known to work with Visual Studio 2010 Express. + ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_START=namespace std {\"") + ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_END=}\"") + ELSE (MSVC) + # This is known to work with recent versions of Linux and Mac OS X. + ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_START=namespace std { namespace tr1 {\"") + ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_END=}}\"") + ENDIF (MSVC) +ENDIF (${DISABLE_TR1}) INCLUDE_DIRECTORIES( include
diff --git a/internal/ceres/collections_port.h b/internal/ceres/collections_port.h index 88032a5..a356cc0 100644 --- a/internal/ceres/collections_port.h +++ b/internal/ceres/collections_port.h
@@ -33,17 +33,41 @@ #ifndef CERES_INTERNAL_COLLECTIONS_PORT_H_ #define CERES_INTERNAL_COLLECTIONS_PORT_H_ -#if defined(_MSC_VER) && _MSC_VER <= 1600 -#include <unordered_map> -#include <unordered_set> +#if defined(CERES_NO_TR1) +# include <map> +# include <set> #else -#include <tr1/unordered_map> -#include <tr1/unordered_set> +# if defined(_MSC_VER) && _MSC_VER <= 1600 +# include <unordered_map> +# include <unordered_set> +# else +# include <tr1/unordered_map> +# include <tr1/unordered_set> +# endif #endif #include <utility> #include "ceres/integral_types.h" #include "ceres/internal/port.h" +// Some systems don't have access to TR1. In that case, substitute the hash +// map/set with normal map/set. The price to pay is slightly slower speed for +// some operations. +#if defined(CERES_NO_TR1) + +namespace ceres { +namespace internal { + +template<typename K, typename V> +struct HashMap : map<K, V> {}; + +template<typename K> +struct HashSet : set<K> {}; + +} // namespace internal +} // namespace ceres + +#else + namespace ceres { namespace internal { @@ -138,4 +162,6 @@ CERES_HASH_NAMESPACE_END +#endif // CERES_NO_TR1 + #endif // CERES_INTERNAL_COLLECTIONS_PORT_H_
diff --git a/internal/ceres/schur_ordering.cc b/internal/ceres/schur_ordering.cc index 2fe1080..0654724 100644 --- a/internal/ceres/schur_ordering.cc +++ b/internal/ceres/schur_ordering.cc
@@ -39,6 +39,8 @@ #include "ceres/residual_block.h" #include "glog/logging.h" +#if !defined(CERES_NO_TR1) + CERES_HASH_NAMESPACE_START // Allow us to hash pointers as if they were int's @@ -50,6 +52,8 @@ CERES_HASH_NAMESPACE_END +#endif + namespace ceres { namespace internal {