]> git.ipfire.org Git - thirdparty/squid.git/blobdiff - lib/libTrie/TrieNode.h
SourceFormat Enforcement
[thirdparty/squid.git] / lib / libTrie / TrieNode.h
index dc978d25f5c40838ab83d7a8f1188f209997c2df..b5b72f29c36f3f8511ee6dc18f5b103fa41037c6 100644 (file)
@@ -1,51 +1,23 @@
 /*
- * Copyright (c) 2002,2003 Robert Collins <rbtcollins@hotmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+ * Copyright (C) 1996-2017 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.
  */
 
 #ifndef   LIBTRIE_TRIENODE_H
 #define   LIBTRIE_TRIENODE_H
 
-/* This is an internal header for libTrie.
- * libTrie provides both C and C++
- * bindings.
- * libTrie itself is written in C++.
- * For C bindings see Trei.h
- */
-
-/* C bindings */
-#ifndef   __cplusplus
+#include "TrieCharTransform.h"
 
-/* C++ bindings */
-#else
 #include <sys/types.h>
 #include <utility>
 
-/* MinGW needs NULL definition */
-#ifndef NULL
-#define NULL 0
-#endif
-
 /* TODO: parameterize this to be more generic -
 * i.e. M-ary internal node sizes etc
 */
 
-class TrieCharTransform;
-
 class TrieNode
 {
 
@@ -59,15 +31,14 @@ public:
     * If found, return the private data.
     * If not found, return NULL.
     */
-    _SQUID_INLINE_ void *find (char const *, size_t, TrieCharTransform *, bool const prefix) const;
+    inline void *find (char const *, size_t, TrieCharTransform *, bool const prefix) const;
 
     /* Add a string.
     * returns false if the string is already
     * present or can't be added.
     */
 
-    bool add
-    (char const *, size_t, void *, TrieCharTransform *);
+    bool add (char const *, size_t, void *, TrieCharTransform *);
 
 private:
     /* 256-way Trie */
@@ -82,10 +53,33 @@ private:
     void *_privateData;
 };
 
-#endif /* __cplusplus */
-
-#if _USE_INLINE_
-#include "TrieNode.cci"
-#endif
-
+/* recursive. TODO? make iterative */
+void *
+TrieNode::find (char const *aString, size_t theLength, TrieCharTransform *transform, bool const prefix) const
+{
+    if (theLength) {
+        int index = -1;
+        unsigned char pos = transform ? (*transform) (*aString) : *aString;
+
+        if (internal[pos])
+            index = pos;
+
+        if (index > -1) {
+            void *result;
+            result = internal[index]->find(aString + 1, theLength - 1, transform, prefix);
+
+            if (result)
+                return result;
+        }
+
+        if (prefix)
+            return _privateData;
+
+        return NULL;
+    } else {
+        /* terminal node */
+        return _privateData;
+    }
+}
 #endif /* LIBTRIE_TRIENODE_H */
+