Fix for pre-C++11 is_sorted().
authorMorgan Deters <mdeters@cs.nyu.edu>
Wed, 18 Jun 2014 00:21:12 +0000 (20:21 -0400)
committerMorgan Deters <mdeters@cs.nyu.edu>
Wed, 18 Jun 2014 00:26:01 +0000 (20:26 -0400)
config/is_sorted.m4 [new file with mode: 0644]
configure.ac
src/theory/arith/normal_form.cpp
src/theory/arith/normal_form.h

diff --git a/config/is_sorted.m4 b/config/is_sorted.m4
new file mode 100644 (file)
index 0000000..52b062d
--- /dev/null
@@ -0,0 +1,20 @@
+# CHECK_FOR_IS_SORTED
+# -------------------
+# Look for is_sorted in std:: and __gnu_cxx:: and define
+# some things to make it easy to find later.
+AC_DEFUN([CHECK_FOR_IS_SORTED], [
+AC_MSG_CHECKING([where we can find is_sorted])
+AC_LANG_PUSH([C++])
+is_sorted_result=
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <algorithm>],
+                                   [std::is_sorted((int*)0L, (int*)0L);])],
+  [is_sorted_result=std],
+  [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <ext/algorithm>],
+                                      [__gnu_cxx::is_sorted((int*)0L, (int*)0L);])],
+    [is_sorted_result=__gnu_cxx],
+    [AC_MSG_FAILURE([cannot find std::is_sorted() or __gnu_cxx::is_sorted()])])])
+AC_LANG_POP([C++])
+AC_MSG_RESULT($is_sorted_result)
+if test "$is_sorted_result" = __gnu_cxx; then is_sorted_result=1; else is_sorted_result=0; fi
+AC_DEFINE_UNQUOTED([IS_SORTED_IN_GNUCXX_NAMESPACE], $is_sorted_result, [Define to 1 if __gnu_cxx::is_sorted() exists])
+])# CHECK_FOR_IS_SORTED
index e30c12a6f11e40dbed6ee2041f544c81093fd280..629e1625b13bd461f1b12ed88dc7b10617d4e58b 100644 (file)
@@ -1002,6 +1002,9 @@ AC_CHECK_DECLS([optreset], [], [], [#include <getopt.h>])
 # check with which standard strerror_r() complies
 AC_FUNC_STRERROR_R
 
+# is is_sorted() in std or __gnu_cxx?
+CHECK_FOR_IS_SORTED
+
 # require boost library
 BOOST_REQUIRE()
 
index ce0bd9d30dbfe9bc8db19fe6afd2ee7e8f037641..5334abbbf8f6dfab1334c685d3778ef78960f842 100644 (file)
@@ -90,7 +90,11 @@ bool Variable::isDivMember(Node n){
 
 
 bool VarList::isSorted(iterator start, iterator end) {
+#if IS_SORTED_IN_GNUCXX_NAMESPACE
+  return __gnu_cxx::is_sorted(start, end);
+#else /* IS_SORTED_IN_GNUCXX_NAMESPACE */
   return std::is_sorted(start, end);
+#endif /* IS_SORTED_IN_GNUCXX_NAMESPACE */
 }
 
 bool VarList::isMember(Node n) {
index 8d37bed2374a5ca82908856ed8fabf8ac511d1f9..1a3327e8ff1d73e537faa5d7b82f0fed7dc6d363 100644 (file)
 #include <list>
 #include <algorithm>
 
+#if IS_SORTED_IN_GNUCXX_NAMESPACE
+#  include <ext/algorithm>
+#endif /* IS_SORTED_IN_GNUCXX_NAMESPACE */
+
 namespace CVC4 {
 namespace theory {
 namespace arith {
@@ -731,7 +735,11 @@ public:
   }
 
   static bool isSorted(const std::vector<Monomial>& m) {
+#if IS_SORTED_IN_GNUCXX_NAMESPACE
+    return __gnu_cxx::is_sorted(m.begin(), m.end());
+#else /* IS_SORTED_IN_GNUCXX_NAMESPACE */
     return std::is_sorted(m.begin(), m.end());
+#endif /* IS_SORTED_IN_GNUCXX_NAMESPACE */
   }
 
   static bool isStrictlySorted(const std::vector<Monomial>& m) {