- Updated doc to point out that Edition::match is not transitive.
authorMichael Andres <ma@suse.de>
Mon, 30 Jan 2006 22:34:20 +0000 (22:34 +0000)
committerMichael Andres <ma@suse.de>
Mon, 30 Jan 2006 22:34:20 +0000 (22:34 +0000)
  Thus not suitable for ordering associative std::continers.
- Added common CompareBy functor to RelCompare.h.

zypp/Edition.h
zypp/RelCompare.h

index 8e02af1b197e327376a79846db5f34c3ac45b73c..ce160750366839f0ea650370677df10004678158 100644 (file)
@@ -53,9 +53,11 @@ namespace zypp
    * in the example.<BR>
    * If Edition is used as key in a std::container, per default
    * <em>plain string comparison</em> is used. If you want to compare by
-   * version, let the container use Edition::ComareLess to compare.
+   * version, let the container use \ref CompareByLT<Edition> to compare.
    *
-   * \attention
+   * \attention Edition::match compares two editions, treating empty
+   * version or release strings as wildcard. Thus match is not transitive,
+   * and you don't want to use it to order keys in a a std::container.
    *
    * \ingroup g_BackendSpecific
    * \todo Define exceptions.
index ba58ff19318cf9055cc663c74556a132d4caa165..e059e7abacaac5c77d9df7ac76c9f1ca5c026f87 100644 (file)
@@ -59,11 +59,11 @@ namespace zypp
    * // Editions sets use lexicographical order per default:
    * std::set<Edition>
    *
-   * // An Edition set using Edition::comapre as order:
+   * // An Edition set using Edition::compare as order:
    * std::set<Edition,CompareByLT<Edition> >;
    *
-   * // An Edition set using Edition::match as order:
-   * std::set<Edition,CompareByLT<Edition,Edition::Match> >;
+   * // Edition::match is not transitive, thus not an appropriate
+   * // order relation for std::set or std::map.
    * \endcode
    *
    * Classes like zypp:Range are templated by  by type and general
@@ -155,6 +155,19 @@ namespace zypp
    * Expects \a _Compare to be suitable for use in \ref compareByRel.
    * Defaults to Compare\<_Tp\>.
   */
+  template<class _Tp, class _Compare = Compare<_Tp> >
+    struct CompareBy : public std::binary_function<_Tp,_Tp,bool>
+    {
+      CompareBy( Rel op_r )
+      : _op( op_r )
+      {}
+
+      bool operator()( const _Tp & lhs, const _Tp & rhs ) const
+      { return compareByRel( _op, lhs, rhs, _Compare() ); }
+
+      Rel _op;
+    };
+
   template<class _Tp, class _Compare = Compare<_Tp> >
     struct CompareByEQ : public std::binary_function<_Tp,_Tp,bool>
     {