[PATCH setup 10/15] Change PackageSpecification::_operator to an enum

Jon Turney jon.turney@dronecode.org.uk
Tue May 16 11:58:00 GMT 2017


---
 PackageSpecification.cc | 71 ++++++++++++++++++++++---------------------------
 PackageSpecification.h  | 46 +++++++++++---------------------
 2 files changed, 48 insertions(+), 69 deletions(-)

diff --git a/PackageSpecification.cc b/PackageSpecification.cc
index a0818b3..f59b11b 100644
--- a/PackageSpecification.cc
+++ b/PackageSpecification.cc
@@ -18,7 +18,7 @@
 #include "package_version.h"
 
 PackageSpecification::PackageSpecification (const std::string& packageName)
-  : _packageName (packageName) , _operator (0), _version ()
+  : _packageName (packageName) , _operator (Equals), _version ()
 {
 }
 
@@ -29,9 +29,9 @@ PackageSpecification::packageName () const
 }
 
 void
-PackageSpecification::setOperator (_operators const &anOperator)
+PackageSpecification::setOperator (_operators anOperator)
 {
-  _operator = &anOperator;
+  _operator = anOperator;
 }
 
 void
@@ -45,9 +45,28 @@ PackageSpecification::satisfies (packageversion const &aPackage) const
 {
   if (casecompare(_packageName, aPackage.Name()) != 0)
     return false;
-  if (_operator && _version.size() 
-      && !_operator->satisfies (aPackage.Canonical_version (), _version))
-    return false;
+
+  // The default values of _operator = Equals and _version is an empty-string
+  // match any version
+  if (_version.size())
+    {
+      int comparison = casecompare(aPackage.Canonical_version (), _version);
+      switch (_operator)
+        {
+        case Equals:
+          return (comparison == 0);
+        case LessThan:
+          return (comparison < 0);
+        case MoreThan:
+          return (comparison > 0);
+        case LessThanEquals:
+          return (comparison <= 0);
+        case MoreThanEquals:
+          return (comparison >= 0);
+        default:
+          return false;
+        }
+    }
   return true;
 }
 
@@ -69,52 +88,26 @@ operator << (std::ostream &os, PackageSpecification const &spec)
 {
   os << spec._packageName;
   if (spec._operator)
-    os << " " << spec._operator->caption() << " " << spec._version;
+    os << " " << PackageSpecification::caption(spec._operator) << " " << spec._version;
   return os;
 }
 
-const PackageSpecification::_operators PackageSpecification::Equals(0);
-const PackageSpecification::_operators PackageSpecification::LessThan(1);
-const PackageSpecification::_operators PackageSpecification::MoreThan(2);
-const PackageSpecification::_operators PackageSpecification::LessThanEquals(3);
-const PackageSpecification::_operators PackageSpecification::MoreThanEquals(4);
-
 char const *
-PackageSpecification::_operators::caption () const
+PackageSpecification::caption (_operators _value)
 {
   switch (_value)
     {
-    case 0:
+    case Equals:
     return "==";
-    case 1:
+    case LessThan:
     return "<";
-    case 2:
+    case MoreThan:
     return ">";
-    case 3:
+    case LessThanEquals:
     return "<=";
-    case 4:
+    case MoreThanEquals:
     return ">=";
     }
   // Pacify GCC: (all case options are checked above)
   return "Unknown operator";
 }
-
-bool
-PackageSpecification::_operators::satisfies (const std::string& lhs,
-                                             const std::string& rhs) const
-{
-  switch (_value)
-    {
-    case 0:
-      return casecompare(lhs, rhs) == 0;
-    case 1:
-      return casecompare(lhs, rhs) < 0;
-    case 2:
-      return casecompare(lhs, rhs) > 0;
-    case 3:
-      return casecompare(lhs, rhs) <= 0;
-    case 4:
-      return casecompare(lhs, rhs) >= 0;
-    }
-  return false;
-}
diff --git a/PackageSpecification.h b/PackageSpecification.h
index 8d622f3..a26431a 100644
--- a/PackageSpecification.h
+++ b/PackageSpecification.h
@@ -25,14 +25,21 @@ class packageversion;
 class PackageSpecification
 {
 public:
-  PackageSpecification () : _packageName (), _operator(0) {}
+  PackageSpecification () : _packageName (), _operator(Equals) {}
   PackageSpecification (const std::string& packageName);
   ~PackageSpecification () {}
 
-  class _operators;
- 
-  const std::string& packageName() const; 
-  void setOperator (_operators const &);
+  enum _operators
+  {
+    Equals,
+    LessThan,
+    MoreThan,
+    LessThanEquals,
+    MoreThanEquals,
+  };
+
+  const std::string& packageName() const;
+  void setOperator (_operators);
   void setVersion (const std::string& );
 
   bool satisfies (packageversion const &) const;
@@ -42,33 +49,12 @@ public:
 
   friend std::ostream &operator << (std::ostream &, PackageSpecification const &);
 
-  class _operators
-    {
-    public:
-      _operators ():_value (0) {};
-      _operators (int aInt) {
-	_value = aInt;
-	if (_value < 0 ||  _value > 4)
-	  _value = 0;
-      }
-      _operators & operator ++ ();
-      bool operator == (_operators const &rhs) { return _value == rhs._value; }
-      bool operator != (_operators const &rhs) { return _value != rhs._value; }
-      const char *caption () const;
-      bool satisfies (const std::string& lhs, const std::string& rhs) const;
-    private:
-      int _value;
-    };
-  static const _operators Equals;
-  static const _operators LessThan;
-  static const _operators MoreThan;
-  static const _operators LessThanEquals;
-  static const _operators MoreThanEquals;
-
 private:
+  static char const * caption (_operators _value);
+
   std::string _packageName; /* foobar */
-  _operators const * _operator; /* >= */
-  std::string _version;       /* 1.20 */
+  _operators  _operator;    /* >= */
+  std::string _version;     /* 1.20 */
 };
 
 std::ostream &
-- 
2.12.3



More information about the Cygwin-apps mailing list