summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openscad.pro2
-rw-r--r--src/CGALCache.h5
-rw-r--r--src/CGALEvaluator.h1
-rw-r--r--src/PolySetCache.h5
-rw-r--r--src/cache.h183
-rw-r--r--src/dxfdata.cc1
-rw-r--r--src/handle_dep.cc12
-rw-r--r--src/myqhash.h16
-rw-r--r--src/openscad.cc1
-rw-r--r--src/qhash.cc19
-rw-r--r--tests/CMakeLists.txt4
11 files changed, 195 insertions, 54 deletions
diff --git a/openscad.pro b/openscad.pro
index 2e77d9d..4a1c0f3 100644
--- a/openscad.pro
+++ b/openscad.pro
@@ -205,7 +205,6 @@ HEADERS += src/renderer.h \
src/PolySetCache.h \
src/PolySetEvaluator.h \
src/CSGTermEvaluator.h \
- src/myqhash.h \
src/Tree.h \
src/mathc99.h \
src/memory.h \
@@ -253,7 +252,6 @@ SOURCES += src/openscad.cc \
src/traverser.cc \
src/nodedumper.cc \
src/CSGTermEvaluator.cc \
- src/qhash.cc \
src/Tree.cc \
src/mathc99.cc \
src/PolySetCache.cc \
diff --git a/src/CGALCache.h b/src/CGALCache.h
index 7d3a2d9..87e3343 100644
--- a/src/CGALCache.h
+++ b/src/CGALCache.h
@@ -1,8 +1,7 @@
#ifndef CGALCACHE_H_
#define CGALCACHE_H_
-#include "myqhash.h"
-#include <QCache>
+#include "cache.h"
/*!
*/
@@ -22,7 +21,7 @@ public:
private:
static CGALCache *inst;
- QCache<std::string, CGAL_Nef_polyhedron> cache;
+ Cache<std::string, CGAL_Nef_polyhedron> cache;
};
#endif
diff --git a/src/CGALEvaluator.h b/src/CGALEvaluator.h
index 1dce4d9..7330796 100644
--- a/src/CGALEvaluator.h
+++ b/src/CGALEvaluator.h
@@ -1,7 +1,6 @@
#ifndef CGALEVALUATOR_H_
#define CGALEVALUATOR_H_
-#include "myqhash.h"
#include "visitor.h"
#include "CGAL_Nef_polyhedron.h"
#include "PolySetCGALEvaluator.h"
diff --git a/src/PolySetCache.h b/src/PolySetCache.h
index d1efeb7..d241fad 100644
--- a/src/PolySetCache.h
+++ b/src/PolySetCache.h
@@ -1,8 +1,7 @@
#ifndef POLYSETCACHE_H_
#define POLYSETCACHE_H_
-#include "myqhash.h"
-#include <QCache>
+#include "cache.h"
#include "memory.h"
class PolySetCache
@@ -28,7 +27,7 @@ private:
~cache_entry() { }
};
- QCache<std::string, cache_entry> cache;
+ Cache<std::string, cache_entry> cache;
};
#endif
diff --git a/src/cache.h b/src/cache.h
new file mode 100644
index 0000000..284c6da
--- /dev/null
+++ b/src/cache.h
@@ -0,0 +1,183 @@
+/****************************************************************************
+**
+** OpenSCAD (www.openscad.org)
+** Copyright (C) 2009-2011 Clifford Wolf <clifford@clifford.at> and
+** Marius Kintel <marius@kintel.net>
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial Usage
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CACHE_H
+#define CACHE_H
+
+#include <boost/unordered_map.hpp>
+
+template <class Key, class T>
+class Cache
+{
+ struct Node {
+ inline Node() : keyPtr(0) {}
+ inline Node(T *data, int cost)
+ : keyPtr(0), t(data), c(cost), p(0), n(0) {}
+ const Key *keyPtr; T *t; int c; Node *p,*n;
+ };
+ typedef typename boost::unordered_map<Key, Node> map_type;
+ typedef typename map_type::iterator iterator_type;
+ typedef typename map_type::value_type value_type;
+
+ boost::unordered_map<Key, Node> hash;
+ Node *f, *l;
+ void *unused;
+ int mx, total;
+
+ inline void unlink(Node &n) {
+ if (n.p) n.p->n = n.n;
+ if (n.n) n.n->p = n.p;
+ if (l == &n) l = n.p;
+ if (f == &n) f = n.n;
+ total -= n.c;
+ T *obj = n.t;
+ hash.erase(*n.keyPtr);
+ delete obj;
+ }
+ inline T *relink(const Key &key) {
+ iterator_type i = hash.find(key);
+ if (i == hash.end()) return 0;
+
+ Node &n = i->second;
+ if (f != &n) {
+ if (n.p) n.p->n = n.n;
+ if (n.n) n.n->p = n.p;
+ if (l == &n) l = n.p;
+ n.p = 0;
+ n.n = f;
+ f->p = &n;
+ f = &n;
+ }
+ return n.t;
+ }
+
+public:
+ inline explicit Cache(int maxCost = 100)
+ : f(0), l(0), unused(0), mx(maxCost), total(0) { }
+ inline ~Cache() { clear(); }
+
+ inline int maxCost() const { return mx; }
+ void setMaxCost(int m) { mx = m; trim(mx); }
+ inline int totalCost() const { return total; }
+
+ inline int size() const { return hash.size(); }
+ inline bool empty() const { return hash.empty(); }
+
+ void clear() {
+ while (f) { delete f->t; f = f->n; }
+ hash.clear(); l = 0; total = 0;
+ }
+
+ bool insert(const Key &key, T *object, int cost = 1);
+ T *object(const Key &key) const { return const_cast<Cache<Key,T>*>(this)->relink(key); }
+ inline bool contains(const Key &key) const { return hash.find(key) != hash.end(); }
+ T *operator[](const Key &key) const { return object(key); }
+
+ bool remove(const Key &key);
+ T *take(const Key &key);
+
+private:
+ void trim(int m);
+};
+
+template <class Key, class T>
+inline bool Cache<Key,T>::remove(const Key &key)
+{
+ iterator_type i = hash.find(key);
+ if (i == hash.end()) {
+ return false;
+ } else {
+ unlink(i->second);
+ return true;
+ }
+}
+
+template <class Key, class T>
+inline T *Cache<Key,T>::take(const Key &key)
+{
+ iterator_type i = hash.find(key);
+ if (i == hash.end()) return 0;
+
+ Node &n = *i;
+ T *t = n.t;
+ n.t = 0;
+ unlink(n);
+ return t;
+}
+
+template <class Key, class T>
+bool Cache<Key,T>::insert(const Key &akey, T *aobject, int acost)
+{
+ remove(akey);
+ if (acost > mx) {
+ delete aobject;
+ return false;
+ }
+ trim(mx - acost);
+ Node node(aobject, acost);
+ hash[akey] = node;
+ iterator_type i = hash.find(akey);
+ total += acost;
+ Node *n = &i->second;
+ n->keyPtr = &i->first;
+ if (f) f->p = n;
+ n->n = f;
+ f = n;
+ if (!l) l = f;
+ return true;
+}
+
+template <class Key, class T>
+void Cache<Key,T>::trim(int m)
+{
+ Node *n = l;
+ while (n && total > m) {
+ Node *u = n;
+ n = n->p;
+ unlink(*u);
+ }
+}
+
+#endif
+
diff --git a/src/dxfdata.cc b/src/dxfdata.cc
index 10f3b0c..7b5e7d3 100644
--- a/src/dxfdata.cc
+++ b/src/dxfdata.cc
@@ -24,7 +24,6 @@
*
*/
-#include "myqhash.h"
#include "dxfdata.h"
#include "grid.h"
#include "printutils.h"
diff --git a/src/handle_dep.cc b/src/handle_dep.cc
index 2a05b4a..d4380f5 100644
--- a/src/handle_dep.cc
+++ b/src/handle_dep.cc
@@ -1,13 +1,14 @@
#include "handle_dep.h"
-#include "myqhash.h"
#include <string>
#include <sstream>
#include <QString>
#include <QDir>
#include <QSet>
#include <stdlib.h> // for system()
+#include <boost/unordered_set.hpp>
+#include <boost/foreach.hpp>
-QSet<std::string> dependencies;
+boost::unordered_set<std::string> dependencies;
const char *make_command = NULL;
void handle_dep(const std::string &filename)
@@ -33,9 +34,10 @@ bool write_deps(const std::string &filename, const std::string &output_file)
return false;
}
fprintf(fp, "%s:", output_file.c_str());
- QSetIterator<std::string> i(dependencies);
- while (i.hasNext())
- fprintf(fp, " \\\n\t%s", i.next().c_str());
+
+ BOOST_FOREACH(const std::string &str, dependencies) {
+ fprintf(fp, " \\\n\t%s", str.c_str());
+ }
fprintf(fp, "\n");
fclose(fp);
return true;
diff --git a/src/myqhash.h b/src/myqhash.h
deleted file mode 100644
index 9156ec2..0000000
--- a/src/myqhash.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef OPENSCAD_QHASH_H_
-#define OPENSCAD_QHASH_H_
-
-/*!
- Defines a qHash for std::string.
-
- Note that this header must be included before Qt headers (at least
- before qhash.h) to take effect.
- */
-
-#include <qglobal.h>
-#include <string>
-extern uint qHash(const std::string &);
-#include <QHash>
-
-#endif
diff --git a/src/openscad.cc b/src/openscad.cc
index d708a8e..67112d8 100644
--- a/src/openscad.cc
+++ b/src/openscad.cc
@@ -24,7 +24,6 @@
*
*/
-#include "myqhash.h"
#include "openscad.h"
#include "MainWindow.h"
#include "node.h"
diff --git a/src/qhash.cc b/src/qhash.cc
deleted file mode 100644
index cec9adf..0000000
--- a/src/qhash.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-#include "myqhash.h"
-
-static uint hash(const uchar *p, int n)
-{
- uint h = 0;
- uint g;
-
- while (n--) {
- h = (h << 4) + *p++;
- if ((g = (h & 0xf0000000)) != 0)
- h ^= g >> 23;
- h &= ~g;
- }
- return h;
-}
-
-uint qHash(const std::string &str) {
- return hash(reinterpret_cast<const uchar *>(str.c_str()), str.length());
-}
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 6966436..4693a0b 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -201,7 +201,6 @@ set(CORE_SOURCES
tests-common.cc
../src/mathc99.cc
../src/handle_dep.cc
- ../src/qhash.cc
../src/value.cc
../src/expr.cc
../src/func.cc
@@ -242,7 +241,6 @@ set(CGAL_SOURCES
../src/CGALEvaluator.cc
../src/CGALCache.cc
../src/PolySetCGALEvaluator.cc
- ../src/qhash.cc
../src/CGAL_Nef_polyhedron_DxfData.cc
../src/cgaladv_minkowski2.cc
../src/cgaladv_convexhull2.cc)
@@ -307,7 +305,7 @@ target_link_libraries(dumptest tests-common tests-nocgal ${QT_LIBRARIES} ${OPENG
#
# csgtexttest
#
-add_executable(csgtexttest csgtexttest.cc CSGTextRenderer.cc CSGTextCache.cc ../src/qhash.cc)
+add_executable(csgtexttest csgtexttest.cc CSGTextRenderer.cc CSGTextCache.cc)
target_link_libraries(csgtexttest tests-common tests-nocgal ${QT_LIBRARIES} ${OPENGL_LIBRARY} ${Boost_LIBRARIES})
#
contact: Jan Huwald // Impressum