Paul J. Lucas has proposed merging lp:~paul-lucas/zorba/pjl-misc into lp:zorba.

Requested reviews:
  Paul J. Lucas (paul-lucas)

For more details, see:
https://code.launchpad.net/~paul-lucas/zorba/pjl-misc/+merge/119730

Miscellaneous changes, some a prerequisite for LLVM that should be done anyway 
and not have to wait for the far-in-the-future LLVM branch merge.
-- 
https://code.launchpad.net/~paul-lucas/zorba/pjl-misc/+merge/119730
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'include/zorba/internal/unique_ptr.h'
--- include/zorba/internal/unique_ptr.h	2012-08-14 11:13:50 +0000
+++ include/zorba/internal/unique_ptr.h	2012-08-15 15:14:25 +0000
@@ -26,6 +26,7 @@
 
 #include <algorithm>                    /* for swap() */
 #include "type_traits.h"
+#include "ztd.h"
 
 namespace std {
 
@@ -205,9 +206,7 @@
   typedef typename ZORBA_TR1_NS::add_reference<D const>::type
           deleter_const_reference;
 
-  // see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2333.html
-  struct pointer_conversion { int valid; };
-  typedef int pointer_conversion::*explicit_bool;
+  typedef zorba::internal::ztd::explicit_bool explicit_bool;
 
 public:
   typedef T element_type;
@@ -408,8 +407,8 @@
    * @return Returns \c true only if the pointer is not null; \c false only if
    * the pointer is null.
    */
-  operator explicit_bool() const throw() {
-    return get() ? &pointer_conversion::valid : 0;
+  operator explicit_bool::type() const throw() {
+    return explicit_bool::value_of( get() );
   }
 
 private:

=== modified file 'include/zorba/internal/ztd.h'
--- include/zorba/internal/ztd.h	2012-08-14 11:13:50 +0000
+++ include/zorba/internal/ztd.h	2012-08-15 15:14:25 +0000
@@ -370,6 +370,56 @@
   return s ? s : "<null>";
 }
 
+////////// misc ///////////////////////////////////////////////////////////////
+
+/**
+ * Helper class for implementing a solution to the "explicit bool conversion"
+ * problem.  The canonical use is of the form:
+ * \code
+ *  class your_class {
+ *    // ...
+ *    operator explicit_bool::type() const {
+ *      return explicit_bool::value_of( some_expression );
+ *    }
+ *  };
+ * \endcode
+ *
+ * See: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2333.html
+ */
+class explicit_bool {
+  struct pointer_conversion { int valid; };
+public:
+  typedef int pointer_conversion::*type;
+
+  /**
+   * Gets the explicit \c bool value for \c false.
+   *
+   * @return Returns said value.
+   */
+  static type false_value() {
+    return 0;
+  }
+
+  /**
+   * Gets the explicit \c bool value for \c true.
+   *
+   * @return Returns said value.
+   */
+  static type true_value() {
+    return &pointer_conversion::valid;
+  }
+
+  /**
+   * Converts the the built-in \c bool value to an explicit \c bool value.
+   *
+   * @param value The \c bool value to convert.
+   * @return Return said value.
+   */
+  static type value_of( bool value ) {
+    return value ? true_value() : false_value();
+  }
+};
+
 ///////////////////////////////////////////////////////////////////////////////
 
 } // namespace ztd

=== modified file 'src/util/stl_util.h'
--- src/util/stl_util.h	2012-08-14 11:13:50 +0000
+++ src/util/stl_util.h	2012-08-15 15:14:25 +0000
@@ -155,11 +155,13 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 /**
- * A less-verbose way to determine whether the given set<T> contains a
+ * A less-verbose way to determine whether the given map or set contains a
  * particular element.
  */
-template<typename T> inline
-bool contains( std::set<T> const &s, typename call_traits<T>::arg_type v ) {
+template<class ContainerType> inline
+bool contains(
+    ContainerType const &s,
+    typename call_traits<typename ContainerType::key_type>::arg_type v ) {
   return s.find( v ) != s.end();
 }
 
@@ -200,8 +202,32 @@
 }
 
 /**
- * Erases the first element in the given sequence for which the given predicate
- * is \c true.
+ * Erases all elements in the given container for which the given predicate is
+ * \c true.
+ *
+ * @tparam SequenceType The sequence type.
+ * @tparam PredicateType The predicate type.
+ * @param seq The sequence to modify.
+ * @param pred The predicate to use.
+ * @return Returns the number of elements erased.
+ */
+template<class SequenceType,class PredicateType> inline
+typename SequenceType::size_type erase_if( SequenceType &seq,
+                                           PredicateType pred ) {
+  typename SequenceType::size_type erased = 0;
+  for ( typename SequenceType::iterator i = seq.begin(); i != seq.end(); ) {
+    if ( pred( *i ) ) {
+      i = seq.erase( i );
+      ++erased;
+    } else
+      ++i;
+  }
+  return erased;
+}
+
+/**
+ * Erases only the first element in the given sequence for which the given
+ * predicate is \c true.
  *
  * @tparam SequenceType The sequence type.
  * @tparam PredicateType The predicate type.

=== modified file 'src/zorbaserialization/serialize_zorba_types.cpp'
--- src/zorbaserialization/serialize_zorba_types.cpp	2012-08-14 11:13:50 +0000
+++ src/zorbaserialization/serialize_zorba_types.cpp	2012-08-15 15:14:25 +0000
@@ -92,12 +92,12 @@
 
 void operator&(serialization::Archiver& ar, IntegerImpl<long long>& obj)
 {
-  ar & obj.get_value();
+  ar & obj.value();
 }
 
 void operator&(serialization::Archiver& ar, IntegerImpl<unsigned long long>& obj)
 {
-  ar & obj.get_value();
+  ar & obj.value();
 }
 
 #endif

=== modified file 'src/zorbatypes/integer.h'
--- src/zorbatypes/integer.h	2012-08-14 11:13:50 +0000
+++ src/zorbatypes/integer.h	2012-08-15 15:14:25 +0000
@@ -32,11 +32,13 @@
 #include "zstring.h"
 
 #ifdef ZORBA_WITH_BIG_INTEGER
-# define TEMPLATE_DECL(I) /* nothing */
-# define INTEGER_IMPL(I)  IntegerImpl
+# define TEMPLATE_DECL(I)   /* nothing */
+# define INTEGER_IMPL(I)    IntegerImpl
+# define TEMPLATE_TYPENAME  /* nothing */
 #else
-# define TEMPLATE_DECL(I) template<typename I> /* spacer */
-# define INTEGER_IMPL(I)  IntegerImpl<I> /* spacer */
+# define TEMPLATE_DECL(I)   template<typename I> /* spacer */
+# define INTEGER_IMPL(I)    IntegerImpl<I> /* spacer */
+# define TEMPLATE_TYPENAME  typename
 #endif /* ZORBA_WITH_BIG_INTEGER */
 #define INTEGER_IMPL_LL   INTEGER_IMPL(long long)
 #define INTEGER_IMPL_ULL  INTEGER_IMPL(unsigned long long)
@@ -58,6 +60,11 @@
 class IntegerImpl 
 {
 public:
+#ifdef ZORBA_WITH_BIG_INTEGER
+  typedef MAPM value_type;
+#else
+  typedef IntType value_type;
+#endif /* ZORBA_WITH_BIG_INTEGER */
 
   ////////// constructors /////////////////////////////////////////////////////
 
@@ -114,12 +121,6 @@
   TEMPLATE_DECL(IntType2)
   IntegerImpl( INTEGER_IMPL(IntType2) const &i );
 
-  /////////////////////////////////////////////////////////////////////////////
-
-  #ifndef ZORBA_WITH_BIG_INTEGER
-  IntType& get_value() { return value_; }
-  #endif
-
   ////////// assignment operators /////////////////////////////////////////////
 
   /**
@@ -458,6 +459,8 @@
   bool is_xs_unsignedShort() const;
   int sign() const;
   zstring toString() const;
+  value_type& value();
+  value_type const& value() const;
   static IntegerImpl const& one();
   static IntegerImpl const& zero();
 
@@ -465,10 +468,8 @@
 
 private:
 #ifdef ZORBA_WITH_BIG_INTEGER
-  typedef MAPM value_type;
   typedef long int_cast_type;
 #else
-  typedef IntType value_type;
   typedef IntType int_cast_type;
 #endif /* ZORBA_WITH_BIG_INTEGER */
 
@@ -1121,6 +1122,17 @@
 
 #endif /* ZORBA_WITH_BIG_INTEGER */
 
+TEMPLATE_DECL(I) inline
+TEMPLATE_TYPENAME INTEGER_IMPL(I)::value_type& INTEGER_IMPL(I)::value() {
+  return value_;
+}
+
+TEMPLATE_DECL(I) inline
+TEMPLATE_TYPENAME INTEGER_IMPL(I)::value_type const&
+INTEGER_IMPL(I)::value() const {
+  return value_;
+}
+
 TEMPLATE_DECL(I)
 inline std::ostream& operator<<( std::ostream &os, INTEGER_IMPL(I) const &i ) {
   return os << i.toString();

-- 
Mailing list: https://launchpad.net/~zorba-coders
Post to     : zorba-coders@lists.launchpad.net
Unsubscribe : https://launchpad.net/~zorba-coders
More help   : https://help.launchpad.net/ListHelp

Reply via email to