Code

Clean up the unordered containers fix.
authorKrzysztof Kosiński <tweenk.pl@gmail.com>
Thu, 4 Mar 2010 21:54:38 +0000 (22:54 +0100)
committerKrzysztof Kosiński <tweenk.pl@gmail.com>
Thu, 4 Mar 2010 21:54:38 +0000 (22:54 +0100)
configure.ac
src/libnrtype/FontFactory.cpp
src/libnrtype/FontInstance.cpp
src/ui/tool/control-point-selection.h
src/ui/tool/multi-path-manipulator.cpp
src/util/Makefile_insert
src/util/set-types.h [deleted file]
src/util/unordered-containers.h [new file with mode: 0644]

index 8a8a5a702fb9543f5f9f554a3d72f35a0c53cd86..00b0e91cb3eab42bc90c4ff887baf9d44cc92449 100644 (file)
@@ -125,29 +125,24 @@ if test "x$GXX" = "xyes"; then
        fi
 fi
 
-# Test for various hash_set/unordered_set issues:
-# This is a system header so we check it as soon as possible
-AC_CHECK_HEADER(tr1/unordered_set,
-       AC_MSG_CHECKING([TR1 unordered_set usability])
-       AC_COMPILE_IFELSE([
+# Detect a working version of unordered containers.
+AC_MSG_CHECKING([TR1 unordered_set usability])
+AC_COMPILE_IFELSE([
 #include <tr1/unordered_set>
 int main() {
   std::tr1::unordered_set<int> i, j;
   i = j;
   return 0;
 }
-], [unordered_set_broken=no], [unordered_set_broken=yet])
-if test "x$unordered_set_broken" = "xyes"; then
-       AC_MSG_RESULT([broken])
-else
+], [unordered_set_works=yes], [unordered_set_works=no])
+if test "x$unordered_set_works" = "xyes"; then
        AC_MSG_RESULT([ok])
-       AC_DEFINE(HAVE_TR1_UNORDERED_SET, 1, [Has the standard TR1 unordered_set])
+       AC_DEFINE(HAVE_TR1_UNORDERED_SET, 1, [Has working standard TR1 unordered_set])
+else
+       AC_MSG_RESULT([not working])
 fi
-, [])
-
-AC_CHECK_HEADER(ext/hash_set, AC_DEFINE(HAVE_EXT_HASH_SET, 1, [Legacy ext/hash_set]), [])
-AC_CHECK_HEADER(unordered_set, AC_DEFINE(HAVE_UNORDERED_SET, 1, [Legacy unordered_set]), [])
-
+AC_CHECK_HEADER([boost/unordered_set.hpp], [AC_DEFINE(HAVE_BOOST_UNORDERED_SET, 1, [Boost unordered_set (Boost >= 1.36)])], [])
+AC_CHECK_HEADER([ext/hash_set], [AC_DEFINE(HAVE_EXT_HASH_SET, 1, [Legacy GNU ext/hash_set])], [])
 
 # Test whether GCC emits a spurious warning when using boost::optional
 # If yes, turn off strict aliasing warnings to reduce noise
index 8ab2ee6962f69b900e6645b43c71fec75ce90271..06fb93f2da2ed888f959cf66c3cd9efbff81a59f 100644 (file)
 
 #define PANGO_ENABLE_ENGINE
 
-#include "FontFactory.h"
-#include <libnrtype/font-instance.h>
-
-#include <glibmm.h>
-
-
 #ifdef HAVE_CONFIG_H
 # include "config.h"
 #endif
 
+#include <glibmm.h>
 #include <glib/gmem.h>
 #include <glibmm/i18n.h> // _()
+#include <pango/pangoft2.h>
+#include "libnrtype/FontFactory.h"
+#include "libnrtype/font-instance.h"
+#include "util/unordered-containers.h"
 
-/* Freetype2 */
-# include <pango/pangoft2.h>
-
-#include "util/set-types.h"
-
-typedef optim_map<PangoFontDescription*, font_instance*, font_descr_hash, font_descr_equal> FaceMapType;
+typedef INK_UNORDERED_MAP<PangoFontDescription*, font_instance*, font_descr_hash, font_descr_equal> FaceMapType;
 
 // need to avoid using the size field
 size_t font_descr_hash::operator()( PangoFontDescription *const &x) const {
index 61cd281901e00b75f0190a44ef0b2b862076ad0c..be5eb86c893cc6d7a38d162f32122167bb3adca5 100644 (file)
 #define PANGO_ENABLE_ENGINE
 
 #ifdef HAVE_CONFIG_H
-# include <config.h>
+# include "config.h"
 #endif
-#include <libnr/nr-rect.h>
-#include <libnrtype/font-glyph.h>
-#include <libnrtype/font-instance.h>
-#include <2geom/pathvector.h>
-#include <livarot/Path.h>
-
-#include "RasterFont.h"
 
-/* Freetype 2 */
-# include <ft2build.h>
-# include FT_OUTLINE_H
-# include FT_BBOX_H
-# include FT_TRUETYPE_TAGS_H
-# include FT_TRUETYPE_TABLES_H
-# include <pango/pangoft2.h>
-
-#include "util/set-types.h"
+#include <ft2build.h>
+#include FT_OUTLINE_H
+#include FT_BBOX_H
+#include FT_TRUETYPE_TAGS_H
+#include FT_TRUETYPE_TABLES_H
+#include <pango/pangoft2.h>
+#include <2geom/pathvector.h>
+#include "libnr/nr-rect.h"
+#include "libnrtype/font-glyph.h"
+#include "libnrtype/font-instance.h"
+#include "libnrtype/RasterFont.h"
+#include "livarot/Path.h"
+#include "util/unordered-containers.h"
 
 
 struct font_style_hash : public std::unary_function<font_style, size_t> {
@@ -40,7 +37,7 @@ struct font_style_equal : public std::binary_function<font_style, font_style, bo
     bool operator()(font_style const &a, font_style const &b) const;
 };
 
-typedef optim_map<font_style, raster_font*, font_style_hash, font_style_equal> StyleMap;
+typedef INK_UNORDERED_MAP<font_style, raster_font*, font_style_hash, font_style_equal> StyleMap;
 
 
 
index 6efb63b67573e1aebfa02651c3f7282b51b28026..514ecb2e3df13d6eb1940f16ae39def34cde88e2 100644 (file)
 
 #include <memory>
 #include <boost/optional.hpp>
-#include "util/set-types.h"
 #include <sigc++/sigc++.h>
 #include <2geom/forward.h>
 #include <2geom/point.h>
 #include <2geom/rect.h>
 #include "display/display-forward.h"
 #include "util/accumulators.h"
+#include "util/unordered-containers.h"
 #include "ui/tool/commit-events.h"
 #include "ui/tool/manipulator.h"
 
@@ -33,17 +33,6 @@ class SelectableControlPoint;
 }
 }
 
-#ifdef USE_GNU_HASHES
-namespace __gnu_cxx {
-template<>
-struct hash<Inkscape::UI::SelectableControlPoint*> {
-    size_t operator()(Inkscape::UI::SelectableControlPoint *p) const {
-        return reinterpret_cast<size_t>(p);
-    }
-};
-} // namespace __gnu_cxx
-#endif // USE_GNU_HASHES
-
 namespace Inkscape {
 namespace UI {
 
@@ -51,7 +40,7 @@ class ControlPointSelection : public Manipulator, public sigc::trackable {
 public:
     ControlPointSelection(SPDesktop *d, SPCanvasGroup *th_group);
     ~ControlPointSelection();
-    typedef optim_set< SelectableControlPoint * > set_type;
+    typedef INK_UNORDERED_SET<SelectableControlPoint *> set_type;
     typedef set_type Set; // convenience alias
 
     typedef set_type::iterator iterator;
@@ -142,7 +131,7 @@ private:
 
     set_type _points;
     set_type _all_points;
-    optim_map<SelectableControlPoint *, Geom::Point> _original_positions;
+    INK_UNORDERED_MAP<SelectableControlPoint *, Geom::Point> _original_positions;
     boost::optional<double> _rot_radius;
     boost::optional<double> _mouseover_rot_radius;
     Geom::OptRect _bounds;
index d86a7e9e08cd8eee6906b0aa288a765ab5a5c797..b79a29437dc20d731571c58e92b6ab24236abca8 100644 (file)
@@ -8,7 +8,6 @@
  * Released under GNU GPL, read the file 'COPYING' for more information
  */
 
-#include "util/set-types.h"
 #include <boost/shared_ptr.hpp>
 #include <glib.h>
 #include <glibmm/i18n.h>
@@ -24,6 +23,7 @@
 #include "ui/tool/node.h"
 #include "ui/tool/multi-path-manipulator.h"
 #include "ui/tool/path-manipulator.h"
+#include "util/unordered-containers.h"
 
 #ifdef USE_GNU_HASHES
 namespace __gnu_cxx {
@@ -40,9 +40,18 @@ namespace Inkscape {
 namespace UI {
 
 namespace {
+
+struct hash_nodelist_iterator
+    : public std::unary_function<NodeList::iterator, std::size_t>
+{
+    std::size_t operator()(NodeList::iterator i) const {
+        return INK_HASH<NodeList::iterator::pointer>()(&*i);
+    }
+};
+
 typedef std::pair<NodeList::iterator, NodeList::iterator> IterPair;
 typedef std::vector<IterPair> IterPairList;
-typedef optim_set<NodeList::iterator> IterSet;
+typedef INK_UNORDERED_SET<NodeList::iterator, hash_nodelist_iterator> IterSet;
 typedef std::multimap<double, IterPair> DistanceMap;
 typedef std::pair<double, IterPair> DistanceMapItem;
 
index 3d3c88940e97cd53dcd1a083610ad261f6a2420b..1908aea1913f22d8338777f2951323c87e87439f 100644 (file)
@@ -16,12 +16,12 @@ ink_common_sources += \
        util/map-list.h \
        util/mathfns.h \
        util/reverse-list.h \
-       util/set-types.h \
        util/share.h \
        util/share.cpp \
        util/tuple.h \
        util/units.cpp \
-       util/units.h
+       util/units.h \
+       util/unordered-containers.h
 
 # ######################
 # ### CxxTest stuff ####
diff --git a/src/util/set-types.h b/src/util/set-types.h
deleted file mode 100644 (file)
index f6752fb..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef SEEN_SET_TYPES_H
-#define SEEN_SET_TYPES_H
-
-
-/** @file
- * Simple wrapper to disambiguate hash/unordered lists & sets.
- */
-/* Authors:
- *   Jon A. Cruz <jon@joncruz.org>
- *
- * Copyright (C) 2010 Authors
- * Released under GNU GPL, read the file 'COPYING' for more information
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#if defined(HAVE_TR1_UNORDERED_SET)
-
-# include <tr1/unordered_set>
-# include <tr1/unordered_map>
-# define optim_set std::tr1::unordered_set
-# define optim_map std::tr1::unordered_map
-
-// TODO test on platform with this detected:
-//#elif defined(HAVE_UNORDERED_SET)
-//
-//# include <unordered_set>
-//# include <unordered_map>
-//#define optim_set std::unordered_set
-//#define optim_map std::unordered_map
-
-#elif defined(HAVE_EXT_HASH_SET)
-
-# include <ext/hash_set>
-# include <ext/hash_map>
-# define optim_set __gnu_cxx::hash_set
-# define optim_map __gnu_cxx::hash_map
-# define USE_GNU_HASHES 1
-
-#endif
-
-
-#endif // SEEN_SET_TYPES_H
-/*
-  Local Variables:
-  mode:c++
-  c-file-style:"stroustrup"
-  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
-  indent-tabs-mode:nil
-  fill-column:99
-  End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
diff --git a/src/util/unordered-containers.h b/src/util/unordered-containers.h
new file mode 100644 (file)
index 0000000..aaf7719
--- /dev/null
@@ -0,0 +1,78 @@
+/** @file
+ * @brief Compatibility wrapper for unordered containers.
+ */
+/* Authors:
+ *   Jon A. Cruz <jon@joncruz.org>
+ *   Krzysztof Kosiński <tweenk.pl@gmail.com>
+ *
+ * Copyright (C) 2010 Authors
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifndef SEEN_INK_UTIL_UNORDERED_CONTAINERS_H
+#define SEEN_INK_UTIL_UNORDERED_CONTAINERS_H
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+#if defined(HAVE_TR1_UNORDERED_SET)
+
+# include <tr1/unordered_set>
+# include <tr1/unordered_map>
+# define INK_UNORDERED_SET std::tr1::unordered_set
+# define INK_UNORDERED_MAP std::tr1::unordered_map
+# define INK_HASH std::tr1::hash
+
+#elif defined(HAVE_BOOST_UNORDERED_SET)
+# include <boost/unordered_set.hpp>
+# include <boost/unordered_map.hpp>
+# define INK_UNORDERED_SET boost::unordered_set
+# define INK_UNORDERED_MAP boost::unordered_map
+# define INK_HASH boost::hash
+
+#elif defined(HAVE_EXT_HASH_SET)
+
+# include <functional>
+# include <ext/hash_set>
+# include <ext/hash_map>
+# define INK_UNORDERED_SET __gnu_cxx::hash_set
+# define INK_UNORDERED_MAP __gnu_cxx::hash_map
+# define INK_HASH __gnu_cxx::hash
+
+namespace __gnu_cxx {
+// hash function for pointers
+// TR1 and Boost have this defined by default, __gnu_cxx doesn't
+template<typename T>
+struct hash<T *> : public std::unary_function<T *, std::size_t> {
+    std::size_t operator()(T *p) const {
+        // Taken from Boost
+        std::size_t x = static_cast<std::size_t>(reinterpret_cast<std::ptrdiff_t>(p));
+        return x + (x >> 3);
+    }
+};
+} // namespace __gnu_cxx
+#endif
+
+#else
+/// Name (with namespace) of the unordered set template.
+#define INK_UNORDERED_SET
+/// Name (with namespace) of the unordered map template.
+#define INK_UNORDERED_MAP
+/// Name (with namespace) of the hash template.
+#define INK_HASH
+
+#endif
+
+#endif // SEEN_SET_TYPES_H
+/*
+  Local Variables:
+  mode:c++
+  c-file-style:"stroustrup"
+  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+  indent-tabs-mode:nil
+  fill-column:99
+  End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :