]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Refactor ACLIntRange to use ListContainer rather than mucking around
authorhno <>
Mon, 9 May 2005 05:31:06 +0000 (05:31 +0000)
committerhno <>
Mon, 9 May 2005 05:31:06 +0000 (05:31 +0000)
directly with List memers.

If these lists grows large then ACLIntRange is a candidate for splay
implementation.

src/ACLIntRange.cc
src/ACLIntRange.h

index 4ff97466ba4f165005c4f0766c55cdf156c8b633..ee8ac169886c3e1838f81b56f9c4dbee957cb2a6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: ACLIntRange.cc,v 1.5 2005/05/08 09:15:39 serassio Exp $
+ * $Id: ACLIntRange.cc,v 1.6 2005/05/08 23:31:06 hno Exp $
  *
  * DEBUG: section 28    Access Control
  * AUTHOR: Robert Collins
@@ -45,15 +45,10 @@ template cbdata_type List<Range<int> >
 void
 ACLIntRange::parse()
 {
-    RangeType **Tail;
-    RangeType *q = NULL;
     char *t = NULL;
 
-    for (Tail = &ranges; *Tail; Tail = &((*Tail)->next))
-
-        ;
     while ((t = strtokFile())) {
-        Range<int> temp (0,0);
+        RangeType temp (0,0);
         temp.start = atoi(t);
         t = strchr(t, '-');
 
@@ -62,47 +57,28 @@ ACLIntRange::parse()
         else
             temp.end = temp.start+1;
 
-        q = new RangeType (temp);
-
-        *(Tail) = q;
-
-        Tail = &q->next;
+        ranges.push_back(temp);
     }
 }
 
 bool
 ACLIntRange::empty() const
 {
-    return ranges == NULL;
+    return ranges.empty();
 }
 
 bool
 ACLIntRange::match(int i)
 {
-    Range<int> const toFind (i, i+1);
-    RangeType *prev;
-    RangeType *data = ranges;
-    prev = NULL;
-
-    while (data) {
-        Range<int> result = data->element.intersection (toFind);
-
-        if (result.size()) {
-            /* matched */
+    RangeType const toFind (i, i+1);
+    ListIterator<RangeType> iter(ranges);
 
-            if (prev != NULL) {
-                /* shift the element just found to the second position
-                 * in the list */
-                prev->next = data->next;
-                data->next = ranges->next;
-                ranges->next = data;
-            }
+    while (!iter.end()) {
+        const RangeType & element = iter.next();
+        RangeType result = element.intersection (toFind);
 
+        if (result.size())
             return true;
-        }
-
-        prev = data;
-        data = data->next;
     }
 
     return false;
@@ -111,34 +87,31 @@ ACLIntRange::match(int i)
 ACLData<int> *
 ACLIntRange::clone() const
 {
-    if (ranges)
+    if (!ranges.empty())
         fatal("ACLIntRange::clone: attempt to clone used ACL");
 
     return new ACLIntRange (*this);
 }
 
 ACLIntRange::~ACLIntRange ()
-{
-    if (ranges)
-        delete ranges;
-}
+{}
 
 wordlist *
 ACLIntRange::dump ()
 {
     wordlist *W = NULL;
     char buf[32];
-    RangeType *data = ranges;
+    ListIterator<RangeType> iter(ranges);
 
-    while (data != NULL) {
-        if (data->element.size() == 1)
-            snprintf(buf, sizeof(buf), "%d", data->element.start);
+    while (!iter.end()) {
+        const RangeType & element = iter.next();
+
+        if (element.size() == 1)
+            snprintf(buf, sizeof(buf), "%d", element.start);
         else
-            snprintf(buf, sizeof(buf), "%d-%d", data->element.start, data->element.end);
+            snprintf(buf, sizeof(buf), "%d-%d", element.start, element.end);
 
         wordlistAdd(&W, buf);
-
-        data = data->next;
     }
 
     return W;
index 9065006bede200ba8a66f292d358695993137bbc..ac04a2810d11ae39b1d6fce73cd14c7e1345cff9 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: ACLIntRange.h,v 1.3 2005/05/08 06:36:45 hno Exp $
+ * $Id: ACLIntRange.h,v 1.4 2005/05/08 23:31:06 hno Exp $
  *
  *
  * SQUID Web Proxy Cache          http://www.squid-cache.org/
@@ -43,7 +43,7 @@ class ACLIntRange : public ACLData<int>
 {
 
 public:
-    ACLIntRange() : ranges(NULL) {}
+    ACLIntRange() {};
 
     virtual ~ACLIntRange();
     virtual bool match(int);
@@ -53,8 +53,8 @@ public:
     virtual ACLData<int> *clone() const;
 
 private:
-    typedef List<Range<int> > RangeType;
-    RangeType *ranges;
+    typedef Range<int> RangeType;
+    ListContainer <RangeType> ranges;
 };
 
 #endif /* SQUID_ACLINTRANGE_H */