]> git.ipfire.org Git - thirdparty/squid.git/blobdiff - test-suite/splay.cc
SourceFormat Enforcement
[thirdparty/squid.git] / test-suite / splay.cc
index 509d49bb0392a7e1ec29b62d26edd92fa9cf1e0b..4bed13bb0ede60c789f7018e26c4f8959356290a 100644 (file)
@@ -1,18 +1,19 @@
 /*
- * $Id: splay.cc,v 1.3 2003/04/22 01:37:44 robertc Exp $
+ * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
  *
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
+ */
+
+/*
  * based on ftp://ftp.cs.cmu.edu/user/sleator/splaying/top-down-splay.c
  * http://bobo.link.cs.cmu.edu/cgi-bin/splay/splay-cgi.pl
  */
 
-#include "config.h"
+#include "squid.h"
 
-#if HAVE_STDIO_H
-#include <stdio.h>
-#endif
-#if HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
+#include <cstdlib>
 #if HAVE_UNISTD_H
 #include <unistd.h>
 #endif
 #include "splay.h"
 #include "util.h"
 
-typedef struct {
+class intnode
+{
+
+public:
+    intnode() : i(0) {}
+
+    intnode (int anInt) : i (anInt) {}
+
     int i;
-} intnode;
+};
 
 int
 compareintvoid(void * const &a, void * const &n)
@@ -40,7 +48,8 @@ compareint(intnode * const &a, intnode * const &b)
 
 class SplayCheck
 {
-  public:
+
+public:
     static void BeginWalk();
     static int LastValue;
     static bool ExpectedFail;
@@ -70,13 +79,15 @@ void
 SplayCheck::CheckNode(intnode const &A)
 {
     if (LastValue > A.i) {
-       /* failure */
-       if (!ExpectedFail)
-           exit (1);
+        /* failure */
+
+        if (!ExpectedFail)
+            exit (1);
     } else
-       /* success */
-       if (ExpectedFail)
-           exit (1);
+        /* success */
+        if (ExpectedFail)
+            exit (1);
+
     LastValue = A.i;
 }
 
@@ -113,76 +124,149 @@ compareintref(intnode const &a, intnode const &b)
 
 void
 destintref (intnode &)
-{
-}
+{}
 
 int
 main(int argc, char *argv[])
 {
-      {
-    int i;
-    intnode *I;
-    /* test void * splay containers */
-    splayNode *top = NULL;
-    srandom(time(NULL));
-    for (i = 0; i < 100; i++) {
-       I = (intnode *)xcalloc(sizeof(intnode), 1);
-       I->i = random();
-       top = splay_insert(I, top, compareintvoid);
+    {
+        int i;
+        intnode *I;
+        /* test void * splay containers */
+        splayNode *top = NULL;
+        squid_srandom(time(NULL));
+
+        for (i = 0; i < 100; ++i) {
+            I = (intnode *)xcalloc(sizeof(intnode), 1);
+            I->i = squid_random();
+            if (top)
+                top = top->insert(I, compareintvoid);
+            else
+                top = new splayNode(static_cast<void*>(new intnode(101)));
+        }
+
+        SplayCheck::BeginWalk();
+        top->walk(SplayCheck::WalkVoid, NULL);
+
+        SplayCheck::BeginWalk();
+        top->walk(SplayCheck::WalkVoid, NULL);
+        top->destroy(destintvoid);
     }
-    SplayCheck::BeginWalk();
-    splay_walk(top, SplayCheck::WalkVoid, NULL);
-    
-    SplayCheck::BeginWalk();
-    top->walk(SplayCheck::WalkVoid, NULL);
-    top->destroy(destintvoid);
-    /* check we don't segfault on NULL splay calls */
-    top = NULL;
-    top->splay(NULL, compareintvoid);
-      }
+
     /* test typesafe splay containers */
-      {
-    /* intnode* */
-    SplayNode<intnode *> *safeTop = NULL;
-    for ( int i = 0; i < 100; i++) {
-       intnode *I;
-       I = new intnode;
-       I->i = random();
-       safeTop = safeTop->insert(I, compareint);
+    {
+        /* intnode* */
+        SplayNode<intnode *> *safeTop = new SplayNode<intnode *>(new intnode(101));
+
+        for ( int i = 0; i < 100; ++i) {
+            intnode *I;
+            I = new intnode;
+            I->i = squid_random();
+            safeTop = safeTop->insert(I, compareint);
+        }
+
+        SplayCheck::BeginWalk();
+        safeTop->walk(SplayCheck::WalkNode, NULL);
+
+        safeTop->destroy(destint);
     }
-    SplayCheck::BeginWalk();
-    safeTop->walk(SplayCheck::WalkNode, NULL);
-    
-    safeTop->destroy(destint);
-    /* check we don't segfault on NULL splay calls */
-    safeTop = NULL;
-    safeTop->splay(NULL, compareint);
-      }
-      {
-    /* intnode */
-    SplayNode<intnode> *safeTop = NULL;
-    for (int i = 0; i < 100; i++) {
-       intnode I;
-       I.i = random();
-       safeTop = safeTop->insert(I, compareintref);
+    {
+        /* intnode */
+        SplayNode<intnode> *safeTop = new SplayNode<intnode>(101);
+
+        for (int i = 0; i < 100; ++i) {
+            intnode I;
+            I.i = squid_random();
+            safeTop = safeTop->insert(I, compareintref);
+        }
+
+        SplayCheck::BeginWalk();
+        safeTop->walk(SplayCheck::WalkNodeRef, NULL);
+
+        safeTop->destroy(destintref);
     }
-    SplayCheck::BeginWalk();
-    safeTop->walk(SplayCheck::WalkNodeRef, NULL);
-    
-    safeTop->destroy(destintref);
-    /* check we don't segfault on NULL splay calls */
-    safeTop = NULL;
-    safeTop->splay(intnode(), compareintref);
-    SplayCheck::BeginWalk();
-    safeTop->walk(SplayCheck::WalkNodeRef, NULL);
-}
+
     /* check the check routine */
-    SplayCheck::BeginWalk();
-    intnode I;
-    I.i = 1;
-    SplayCheck::WalkNodeRef(I, NULL);
-    I.i = 0;
-    SplayCheck::ExpectedFail = true;
-    SplayCheck::WalkNodeRef(I, NULL);
+    {
+        SplayCheck::BeginWalk();
+        intnode I;
+        I.i = 1;
+        /* check we don't segfault on NULL splay calls */
+        SplayCheck::WalkNodeRef(I, NULL);
+        I.i = 0;
+        SplayCheck::ExpectedFail = true;
+        SplayCheck::WalkNodeRef(I, NULL);
+    }
+
+    {
+        /* check for begin() */
+        Splay<intnode> *safeTop = new Splay<intnode>();
+
+        if (safeTop->start() != NULL)
+            exit (1);
+
+        if (safeTop->finish() != NULL)
+            exit (1);
+
+        for (int i = 0; i < 100; ++i) {
+            intnode I;
+            I.i = squid_random();
+
+            if (I.i > 50 && I.i < 10000000)
+                safeTop->insert(I, compareintref);
+        }
+
+        {
+            intnode I;
+            I.i = 50;
+            safeTop->insert (I, compareintref);
+            I.i = 10000000;
+            safeTop->insert (I, compareintref);
+        }
+
+        if (!safeTop->start())
+            exit (1);
+
+        if (safeTop->start()->data.i != 50)
+            exit (1);
+
+        if (!safeTop->finish())
+            exit (1);
+
+        if (safeTop->finish()->data.i != 10000000)
+            exit (1);
+
+        safeTop->destroy(destintref);
+    }
+
+    {
+        Splay<intnode *> aSplay;
+
+        if (aSplay.start() != NULL)
+            exit (1);
+
+        if (aSplay.size() != 0)
+            exit (1);
+
+        aSplay.insert (new intnode(5), compareint);
+
+        if (aSplay.start() == NULL)
+            exit (1);
+
+        if (aSplay.size() != 1)
+            exit (1);
+
+        aSplay.destroy(destint);
+
+        if (aSplay.start() != NULL)
+            exit (1);
+
+        if (aSplay.size() != 0)
+            exit (1);
+    }
+
+    /* TODO: also test the other Splay API */
+
     return 0;
 }
+