Hello community,

here is the log from the commit of package mdds for openSUSE:Factory checked in 
at 2015-03-19 20:47:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/mdds (Old)
 and      /work/SRC/openSUSE:Factory/.mdds.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "mdds"

Changes:
--------
--- /work/SRC/openSUSE:Factory/mdds/mdds.changes        2014-12-21 
12:02:35.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.mdds.new/mdds.changes   2015-03-19 
20:47:10.000000000 +0100
@@ -1,0 +2,7 @@
+Mon Mar 16 11:18:07 UTC 2015 - [email protected]
+
+- Version bump to 0.12.0
+  * more types are possible in segment_tree data structures
+    (previously only pointers were possible)
+
+-------------------------------------------------------------------

Old:
----
  mdds_0.11.2.tar.bz2

New:
----
  mdds_0.12.0.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ mdds.spec ++++++
--- /var/tmp/diff_new_pack.9jwUsz/_old  2015-03-19 20:47:11.000000000 +0100
+++ /var/tmp/diff_new_pack.9jwUsz/_new  2015-03-19 20:47:11.000000000 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package mdds
 #
-# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
 
 
 Name:           mdds
-Version:        0.11.2
+Version:        0.12.0
 Release:        0
 Summary:        A collection of multi-dimensional data structure and indexing 
algorithm
 License:        MIT
@@ -49,7 +49,7 @@
 %define _docdir %{_defaultdocdir}/%{name}-devel
 
 %prep
-%setup -n %{name}_%{version}
+%setup -q -n %{name}_%{version}
 
 %build
 %configure --docdir=%{_docdir}
@@ -59,7 +59,7 @@
 make check %{?_smp_mflags} V=1
 
 %install
-make DESTDIR=%buildroot install
+make DESTDIR=%{buildroot} install %{?_smp_mflags}
 
 %files devel
 %defattr(-,root,root)

++++++ mdds_0.11.2.tar.bz2 -> mdds_0.12.0.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdds_0.11.2/NEWS new/mdds_0.12.0/NEWS
--- old/mdds_0.11.2/NEWS        2014-12-18 21:05:56.000000000 +0100
+++ new/mdds_0.12.0/NEWS        2015-02-06 03:32:45.000000000 +0100
@@ -1,3 +1,14 @@
+mdds 0.12.0
+
+* segment_tree
+
+  * remove pointer requirement from value_type to allow non-pointer
+    type to be stored.
+
+* multi_type_vector
+
+  * fixed a bug in the equality operator method.
+
 mdds 0.11.2
 
 * multi_type_vector
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdds_0.11.2/configure new/mdds_0.12.0/configure
--- old/mdds_0.11.2/configure   2014-12-18 21:05:56.000000000 +0100
+++ new/mdds_0.12.0/configure   2015-02-06 03:32:45.000000000 +0100
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for mdds 0.11.2.
+# Generated by GNU Autoconf 2.69 for mdds 0.12.0.
 #
 # Report bugs to <[email protected]>.
 #
@@ -579,8 +579,8 @@
 # Identity of this package.
 PACKAGE_NAME='mdds'
 PACKAGE_TARNAME='mdds'
-PACKAGE_VERSION='0.11.2'
-PACKAGE_STRING='mdds 0.11.2'
+PACKAGE_VERSION='0.12.0'
+PACKAGE_STRING='mdds 0.12.0'
 PACKAGE_BUGREPORT='[email protected]'
 PACKAGE_URL=''
 
@@ -1181,7 +1181,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures mdds 0.11.2 to adapt to many kinds of systems.
+\`configure' configures mdds 0.12.0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1242,7 +1242,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of mdds 0.11.2:";;
+     short | recursive ) echo "Configuration of mdds 0.12.0:";;
    esac
   cat <<\_ACEOF
 
@@ -1335,7 +1335,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-mdds configure 0.11.2
+mdds configure 0.12.0
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1352,7 +1352,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by mdds $as_me 0.11.2, which was
+It was created by mdds $as_me 0.12.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -1701,7 +1701,7 @@
 
 
 
-VERSION=0.11.2
+VERSION=0.12.0
 
 
 PACKAGE_TARNAME=mdds
@@ -2298,7 +2298,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by mdds $as_me 0.11.2, which was
+This file was extended by mdds $as_me 0.12.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -2351,7 +2351,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-mdds config.status 0.11.2
+mdds config.status 0.12.0
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -3455,7 +3455,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by mdds $as_me 0.11.2, which was
+This file was extended by mdds $as_me 0.12.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -3508,7 +3508,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-mdds config.status 0.11.2
+mdds config.status 0.12.0
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -4613,7 +4613,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by mdds $as_me 0.11.2, which was
+This file was extended by mdds $as_me 0.12.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -4666,7 +4666,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-mdds config.status 0.11.2
+mdds config.status 0.12.0
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -5772,7 +5772,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by mdds $as_me 0.11.2, which was
+This file was extended by mdds $as_me 0.12.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -5825,7 +5825,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-mdds config.status 0.11.2
+mdds config.status 0.12.0
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdds_0.11.2/configure.ac new/mdds_0.12.0/configure.ac
--- old/mdds_0.11.2/configure.ac        2014-12-18 21:05:56.000000000 +0100
+++ new/mdds_0.12.0/configure.ac        2015-02-06 03:32:45.000000000 +0100
@@ -1,4 +1,4 @@
-AC_INIT(mdds, 0.11.2, [email protected])
+AC_INIT(mdds, 0.12.0, [email protected])
 
 VERSION=AC_PACKAGE_VERSION
 AC_SUBST(VERSION)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdds_0.11.2/include/mdds/multi_type_vector_def.inl 
new/mdds_0.12.0/include/mdds/multi_type_vector_def.inl
--- old/mdds_0.11.2/include/mdds/multi_type_vector_def.inl      2014-12-18 
21:05:56.000000000 +0100
+++ new/mdds_0.12.0/include/mdds/multi_type_vector_def.inl      2015-02-06 
03:32:45.000000000 +0100
@@ -3736,13 +3736,29 @@
         const block* blk1 = *it;
         const block* blk2 = *it2;
 
-        if (!blk1->mp_data)
-            return blk2->mp_data == NULL;
-
-        if (!blk2->mp_data)
-            // left is non-empty while right is empty.
+        if (blk1->m_size != blk2->m_size)
+            // Block sizes differ.
             return false;
 
+        if (blk1->mp_data)
+        {
+            if (!blk2->mp_data)
+                // left is non-empty while right is empty.
+                return false;
+        }
+        else
+        {
+            if (blk2->mp_data)
+                // left is empty while right is non-empty.
+                return false;
+        }
+
+        if (!blk1->mp_data)
+        {
+            assert(!blk2->mp_data);
+            continue;
+        }
+
         assert(blk1->mp_data && blk2->mp_data);
         if (!element_block_func::equal_block(*blk1->mp_data, *blk2->mp_data))
             return false;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdds_0.11.2/include/mdds/multi_type_vector_types.hpp 
new/mdds_0.12.0/include/mdds/multi_type_vector_types.hpp
--- old/mdds_0.11.2/include/mdds/multi_type_vector_types.hpp    2014-12-18 
21:05:56.000000000 +0100
+++ new/mdds_0.12.0/include/mdds/multi_type_vector_types.hpp    2015-02-06 
03:32:45.000000000 +0100
@@ -32,6 +32,8 @@
 #include "compat/unique_ptr.hpp"
 #include "global.hpp"
 
+#include <algorithm>
+
 #ifdef MDDS_MULTI_TYPE_VECTOR_USE_DEQUE
 #include <deque>
 #else
@@ -40,7 +42,6 @@
 #include <boost/noncopyable.hpp>
 
 #if defined(MDDS_UNIT_TEST) || defined (MDDS_MULTI_TYPE_VECTOR_DEBUG)
-#include <algorithm>
 #include <iostream>
 #include <sstream>
 using std::cout;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdds_0.11.2/include/mdds/node.hpp 
new/mdds_0.12.0/include/mdds/node.hpp
--- old/mdds_0.11.2/include/mdds/node.hpp       2014-12-18 21:05:56.000000000 
+0100
+++ new/mdds_0.12.0/include/mdds/node.hpp       2015-02-06 03:32:45.000000000 
+0100
@@ -277,13 +277,12 @@
             // The left leaf node is empty.  Nothing to build.
             return NULL;
 
-        leaf_node_ptr node1, node2;
-        node1 = left_leaf_node;
+        leaf_node_ptr node1 = left_leaf_node;
 
         std::vector<nonleaf_node*> node_list;
         while (true)
         {
-            node2 = node1->next;
+            leaf_node_ptr node2 = node1->next;
             nonleaf_node* parent_node = make_parent_node(node1.get(), 
node2.get());
             node_list.push_back(parent_node);
 
@@ -329,14 +328,13 @@
 
         std::vector<nonleaf_node*> new_node_list;
         nonleaf_node* node1 = NULL;
-        nonleaf_node* node2 = NULL;
         typename std::vector<nonleaf_node*>::const_iterator it = 
node_list.begin();
         typename std::vector<nonleaf_node*>::const_iterator it_end = 
node_list.end();
         for (bool even_itr = false; it != it_end; ++it, even_itr = !even_itr)
         {
             if (even_itr)
             {
-                node2 = *it;
+                nonleaf_node* node2 = *it;
                 nonleaf_node* parent_node = make_parent_node(node1, node2);
                 new_node_list.push_back(parent_node);
                 node1 = NULL;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdds_0.11.2/include/mdds/rectangle_set.hpp 
new/mdds_0.12.0/include/mdds/rectangle_set.hpp
--- old/mdds_0.11.2/include/mdds/rectangle_set.hpp      2014-12-18 
21:05:56.000000000 +0100
+++ new/mdds_0.12.0/include/mdds/rectangle_set.hpp      2015-02-06 
03:32:45.000000000 +0100
@@ -81,10 +81,10 @@
             return !operator==(r);
         }
     };
-    typedef _mdds_unordered_map_type<data_type*, rectangle>    dataset_type;
+    typedef _mdds_unordered_map_type<data_type, rectangle>    dataset_type;
 private:
     typedef segment_tree<key_type, data_type>   inner_type;
-    typedef segment_tree<key_type, inner_type>  outer_type;
+    typedef segment_tree<key_type, inner_type*>  outer_type;
 
     typedef ::std::pair<key_type, key_type>             interval_type;
     typedef ::boost::ptr_map<interval_type, inner_type> inner_segment_map_type;
@@ -167,7 +167,7 @@
      * 
      * @return true if a rectangle successfully inserted, false otherwise.
      */
-    bool insert(key_type x1, key_type y1, key_type x2, key_type y2, data_type* 
data);
+    bool insert(key_type x1, key_type y1, key_type x2, key_type y2, data_type 
data);
 
     /** 
      * Search and collect all rectangles that contains a given point.
@@ -197,7 +197,7 @@
      * @param data pointer that points to the rectangle instance you wish to 
      *             remove from the set.
      */
-    void remove(data_type* data);
+    void remove(data_type data);
 
     /** 
      * Clear all rectangles stored in the set.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdds_0.11.2/include/mdds/rectangle_set_def.inl 
new/mdds_0.12.0/include/mdds/rectangle_set_def.inl
--- old/mdds_0.11.2/include/mdds/rectangle_set_def.inl  2014-12-18 
21:05:56.000000000 +0100
+++ new/mdds_0.12.0/include/mdds/rectangle_set_def.inl  2015-02-06 
03:32:45.000000000 +0100
@@ -79,7 +79,7 @@
 }
 
 template<typename _Key, typename _Data>
-bool rectangle_set<_Key,_Data>::insert(key_type x1, key_type y1, key_type x2, 
key_type y2, data_type* data)
+bool rectangle_set<_Key,_Data>::insert(key_type x1, key_type y1, key_type x2, 
key_type y2, data_type data)
 {
     if (x1 >= x2 || y1 >= y2)
     {
@@ -170,7 +170,7 @@
 }
 
 template<typename _Key, typename _Data>
-void rectangle_set<_Key,_Data>::remove(data_type* data)
+void rectangle_set<_Key,_Data>::remove(data_type data)
 {
     typename dataset_type::iterator itr_data = m_dataset.find(data);
     if (itr_data == m_dataset.end())
@@ -265,7 +265,7 @@
     typename dataset_type::const_iterator itr_data = m_dataset.begin(), 
itr_data_end = m_dataset.end();
     for (; itr_data != itr_data_end; ++itr_data)
     {
-        const data_type* data = itr_data->first;
+        const data_type data = itr_data->first;
         typename dataset_type::const_iterator itr_test = expected.find(data);
         if (itr_test == expected.end())
             // Pointer in one container but not in the other.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdds_0.11.2/include/mdds/segment_tree.hpp 
new/mdds_0.12.0/include/mdds/segment_tree.hpp
--- old/mdds_0.11.2/include/mdds/segment_tree.hpp       2014-12-18 
21:05:56.000000000 +0100
+++ new/mdds_0.12.0/include/mdds/segment_tree.hpp       2015-02-06 
03:32:45.000000000 +0100
@@ -140,16 +140,16 @@
     typedef _Key        key_type;
     typedef _Data       data_type;
     typedef size_t      size_type;
-    typedef ::std::vector<data_type*> search_result_type;
+    typedef ::std::vector<data_type> search_result_type;
 
 #ifdef MDDS_UNIT_TEST
     struct segment_data
     {
         key_type    begin_key;
         key_type    end_key;
-        data_type*  pdata;
+        data_type   pdata;
 
-        segment_data(key_type _beg, key_type _end, data_type* p) :
+        segment_data(key_type _beg, key_type _end, data_type p) :
             begin_key(_beg), end_key(_end), pdata(p) {}
 
         bool operator==(const segment_data& r) const
@@ -163,9 +163,9 @@
         }
     };
 
-    struct segment_map_printer : public ::std::unary_function< 
::std::pair<data_type*, ::std::pair<key_type, key_type> >, void>
+    struct segment_map_printer : public ::std::unary_function< 
::std::pair<data_type, ::std::pair<key_type, key_type> >, void>
     {
-        void operator() (const ::std::pair<data_type*, ::std::pair<key_type, 
key_type> >& r) const
+        void operator() (const ::std::pair<data_type, ::std::pair<key_type, 
key_type> >& r) const
         {
             using namespace std;
             cout << r.second.first << "-" << r.second.second << ": " << 
r.first->name << endl;
@@ -174,9 +174,9 @@
 #endif
 
 public:
-    typedef ::std::vector<data_type*> data_chain_type;
-    typedef _mdds_unordered_map_type<data_type*, ::std::pair<key_type, 
key_type> > segment_map_type;
-    typedef ::std::map<data_type*, ::std::pair<key_type, key_type> >           
    sorted_segment_map_type;
+    typedef ::std::vector<data_type> data_chain_type;
+    typedef _mdds_unordered_map_type<data_type, ::std::pair<key_type, 
key_type> > segment_map_type;
+    typedef ::std::map<data_type, ::std::pair<key_type, key_type> >            
   sorted_segment_map_type;
 
     struct nonleaf_value_type
     {
@@ -634,7 +634,7 @@
      *               Note that <i>the caller must manage the life cycle of the
      *               data instance</i>.
      */
-    bool insert(key_type begin_key, key_type end_key, data_type* pdata);
+    bool insert(key_type begin_key, key_type end_key, data_type pdata);
 
     /**
      * Search the tree and collect all segments that include a specified
@@ -670,7 +670,7 @@
      * the tree; however, if you have removed lots of segments, you might want
      * to re-build the tree to shrink its size.
      */
-    void remove(data_type* pdata);
+    void remove(data_type pdata);
 
     /**
      * Remove all segments data.
@@ -724,7 +724,7 @@
     void search(key_type point, search_result_base& result) const;
 
     typedef ::std::vector<__st::node_base*> node_list_type;
-    typedef ::boost::ptr_map<data_type*, node_list_type> data_node_map_type;
+    typedef ::boost::ptr_map<data_type, node_list_type> data_node_map_type;
 
     static void create_leaf_node_instances(const ::std::vector<key_type>& 
keys, node_ptr& left, node_ptr& right);
 
@@ -734,7 +734,7 @@
      * record their positions as a list of node pointers.
      */
     void descend_tree_and_mark(
-        __st::node_base* pnode, data_type* pdata, key_type begin_key, key_type 
end_key, node_list_type* plist);
+        __st::node_base* pnode, data_type pdata, key_type begin_key, key_type 
end_key, node_list_type* plist);
 
     void build_leaf_nodes();
 
@@ -742,13 +742,13 @@
      * Go through the list of nodes, and remove the specified data pointer
      * value from the nodes.
      */
-    void remove_data_from_nodes(node_list_type* plist, const data_type* pdata);
-    void remove_data_from_chain(data_chain_type& chain, const data_type* 
pdata);
+    void remove_data_from_nodes(node_list_type* plist, const data_type pdata);
+    void remove_data_from_chain(data_chain_type& chain, const data_type pdata);
 
     void clear_all_nodes();
 
 #ifdef MDDS_UNIT_TEST
-    static bool has_data_pointer(const node_list_type& node_list, const 
data_type* pdata);
+    static bool has_data_pointer(const node_list_type& node_list, const 
data_type pdata);
     static void print_leaf_value(const leaf_value_type& v);
 #endif
 
@@ -810,10 +810,7 @@
         if (itr2 == itr2_end)
             return false;
 
-        if (itr1->first != itr2->first)
-            return false;
-
-        if (itr1->second != itr2->second)
+        if (*itr1 != *itr2)
             return false;
     }
     if (itr2 != itr2_end)
@@ -846,7 +843,7 @@
     data_node_map_type tagged_node_map;
     for (itr = itr_beg; itr != itr_end; ++itr)
     {
-        data_type* pdata = itr->first;
+        data_type pdata = itr->first;
         ::std::pair<typename data_node_map_type::iterator, bool> r =
             tagged_node_map.insert(pdata, new node_list_type);
         node_list_type* plist = r.first->second;
@@ -861,7 +858,7 @@
 
 template<typename _Key, typename _Data>
 void segment_tree<_Key, _Data>::descend_tree_and_mark(
-    __st::node_base* pnode, data_type* pdata, key_type begin_key, key_type 
end_key, node_list_type* plist)
+    __st::node_base* pnode, data_type pdata, key_type begin_key, key_type 
end_key, node_list_type* plist)
 {
     if (!pnode)
         return;
@@ -960,7 +957,7 @@
 }
 
 template<typename _Key, typename _Data>
-bool segment_tree<_Key, _Data>::insert(key_type begin_key, key_type end_key, 
data_type* pdata)
+bool segment_tree<_Key, _Data>::insert(key_type begin_key, key_type end_key, 
data_type pdata)
 {
     if (begin_key >= end_key)
         return false;
@@ -1025,7 +1022,7 @@
 }
 
 template<typename _Key, typename _Data>
-void segment_tree<_Key, _Data>::remove(data_type* pdata)
+void segment_tree<_Key, _Data>::remove(data_type pdata)
 {
     using namespace std;
 
@@ -1075,7 +1072,7 @@
 }
 
 template<typename _Key, typename _Data>
-void segment_tree<_Key, _Data>::remove_data_from_nodes(node_list_type* plist, 
const data_type* pdata)
+void segment_tree<_Key, _Data>::remove_data_from_nodes(node_list_type* plist, 
const data_type pdata)
 {
     typename node_list_type::iterator itr = plist->begin(), itr_end = 
plist->end();
     for (; itr != itr_end; ++itr)
@@ -1095,7 +1092,7 @@
 }
 
 template<typename _Key, typename _Data>
-void segment_tree<_Key, _Data>::remove_data_from_chain(data_chain_type& chain, 
const data_type* pdata)
+void segment_tree<_Key, _Data>::remove_data_from_chain(data_chain_type& chain, 
const data_type pdata)
 {
     typename data_chain_type::iterator itr = ::std::find(chain.begin(), 
chain.end(), pdata);
     if (itr != chain.end())
@@ -1218,7 +1215,7 @@
             if (chain1.size() != chain2.size())
                 return false;
 
-            ::std::vector<const data_type*> test1, test2;
+            ::std::vector<data_type> test1, test2;
             test1.reserve(chain1.size());
             test2.reserve(chain2.size());
             copy(chain1.begin(), chain1.end(), back_inserter(test1));
@@ -1267,7 +1264,7 @@
 }
 
 template<typename _Key, typename _Data>
-bool segment_tree<_Key, _Data>::has_data_pointer(const node_list_type& 
node_list, const data_type* pdata)
+bool segment_tree<_Key, _Data>::has_data_pointer(const node_list_type& 
node_list, const data_type pdata)
 {
     using namespace std;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdds_0.11.2/src/multi_type_vector_test_default.cpp 
new/mdds_0.12.0/src/multi_type_vector_test_default.cpp
--- old/mdds_0.11.2/src/multi_type_vector_test_default.cpp      2014-12-18 
21:05:56.000000000 +0100
+++ new/mdds_0.12.0/src/multi_type_vector_test_default.cpp      2015-02-06 
03:32:45.000000000 +0100
@@ -1275,6 +1275,38 @@
         assert(db1 == db1);
         assert(db2 == db2);
     }
+
+    {
+        // Two containers both consisting of numeric - empty - numeric blocks,
+        // and the last numeric blocks differ.
+
+        mtv_type db1(5), db2(5);
+        db1.set(0, 1.1);
+        db1.set(3, 2.1);
+        db1.set(4, 2.2);
+
+        db2.set(0, 1.1);
+        db2.set(3, 2.1);
+        db2.set(4, 2.3); // different value
+
+        assert(db1 != db2);
+    }
+
+    {
+        mtv_type db1(2), db2(2);
+        db1.set(1, 10.1);
+        db2.set(1, 10.1);
+        assert(db1 == db2);
+
+        db2.set(0, string("foo"));
+        assert(db1 != db2);
+
+        db1.set(0, string("foo"));
+        assert(db1 == db2);
+
+        db2.set_empty(0, 0);
+        assert(db1 != db2);
+    }
 }
 
 void mtv_test_clone()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdds_0.11.2/src/rectangle_set_test.cpp 
new/mdds_0.12.0/src/rectangle_set_test.cpp
--- old/mdds_0.11.2/src/rectangle_set_test.cpp  2014-12-18 21:05:56.000000000 
+0100
+++ new/mdds_0.12.0/src/rectangle_set_test.cpp  2015-02-06 03:32:45.000000000 
+0100
@@ -36,6 +36,18 @@
 using namespace mdds;
 using ::boost::ptr_vector;
 
+template<typename T>
+struct rm_pointer
+{
+    typedef T type;
+};
+
+template<typename T>
+struct rm_pointer<T*>
+{
+    typedef typename rm_pointer<T>::type type;
+};
+
 template<typename _ValueType>
 struct range
 {
@@ -75,11 +87,11 @@
 }
 
 template<typename _SetType>
-bool check_rectangles(const _SetType& db, const typename _SetType::data_type** 
expected)
+bool check_rectangles(const _SetType& db, const typename _SetType::data_type* 
expected)
 {
     typename _SetType::dataset_type test;
     size_t i = 0;
-    const typename _SetType::data_type* data = expected[i++];
+    typename _SetType::data_type data = expected[i++];
     while (data)
     {
         typename _SetType::rectangle rect(data->x1, data->y1, data->x2, 
data->y2);
@@ -107,13 +119,14 @@
 {
     cout << "search result --------------------------------------------------" 
<< endl;
     cout << "(x,y) = (" << x << "," << y << ")" << endl;
-    for_each(result.begin(), result.end(), typename 
_SetType::data_type::printer());
+    typedef typename rm_pointer<typename _SetType::data_type>::type type;
+    for_each(result.begin(), result.end(), typename type::printer());
 }
 
 template<typename _SetType>
 bool check_search_result(_SetType& db,
                          typename _SetType::key_type x, typename 
_SetType::key_type y,
-                         const typename _SetType::data_type** expected)
+                         const typename _SetType::data_type* expected)
 {
     typename _SetType::search_result_type result, test;
     bool success = db.search(x, y, result);
@@ -123,17 +136,18 @@
         return false;
     }
 
-    sort(result.begin(), result.end(), typename 
_SetType::data_type::sort_by_name());
+    typedef typename rm_pointer<typename _SetType::data_type>::type type;
+    sort(result.begin(), result.end(), typename type::sort_by_name());
     print_search_result<_SetType>(x, y, result);
 
     size_t i = 0;
-    const typename _SetType::data_type* data = expected[i++];
+    typename _SetType::data_type data = expected[i++];
     while (data)
     {
         test.push_back(data);
         data = expected[i++];
     }
-    sort(test.begin(), test.end(), typename 
_SetType::data_type::sort_by_name());
+    sort(test.begin(), test.end(), typename type::sort_by_name());
     return result == test;
 }
 
@@ -143,7 +157,7 @@
 
     typedef uint32_t value_type;
     typedef range<value_type> range_type;
-    typedef rectangle_set<value_type, const range_type> set_type;
+    typedef rectangle_set<value_type, const range_type*> set_type;
 
     set_type db;
     assert(check_size(db, 0));
@@ -160,7 +174,7 @@
     insert_range(db, C);
     db.dump_rectangles();
     {
-        const set_type::data_type* expected[] = {&A, &B, &C, 0};
+        const set_type::data_type expected[] = {&A, &B, &C, 0};
         assert(check_rectangles(db, expected));
         assert(check_size(db, 3));
     }
@@ -170,7 +184,7 @@
     insert_range(db, F);
     db.dump_rectangles();
     {
-        const set_type::data_type* expected[] = {&A, &B, &C, &D, &E, &F, 0};
+        const set_type::data_type expected[] = {&A, &B, &C, &D, &E, &F, 0};
         assert(check_rectangles(db, expected));
         assert(check_size(db, 6));
     }
@@ -181,7 +195,7 @@
     insert_range(db, E);
     db.dump_rectangles();
     {
-        const set_type::data_type* expected[] = {&A, &B, &C, &D, &E, &F, 0};
+        const set_type::data_type expected[] = {&A, &B, &C, &D, &E, &F, 0};
         assert(check_rectangles(db, expected));
         assert(check_size(db, 6));
     }
@@ -191,7 +205,7 @@
     db.remove(&E);
     db.dump_rectangles();
     {
-        const set_type::data_type* expected[] = {&A, &B, &C, &D, &F, 0};
+        const set_type::data_type expected[] = {&A, &B, &C, &D, &F, 0};
         assert(check_rectangles(db, expected));
         assert(check_size(db, 5));
     }
@@ -199,7 +213,7 @@
     db.remove(&E);
     db.dump_rectangles();
     {
-        const set_type::data_type* expected[] = {&A, &B, &C, &D, &F, 0};
+        const set_type::data_type expected[] = {&A, &B, &C, &D, &F, 0};
         assert(check_rectangles(db, expected));
         assert(check_size(db, 5));
     }
@@ -208,7 +222,7 @@
     db.remove(&C);
     db.dump_rectangles();
     {
-        const set_type::data_type* expected[] = {&D, &F, 0};
+        const set_type::data_type expected[] = {&D, &F, 0};
         assert(check_rectangles(db, expected));
         assert(check_size(db, 2));
     }
@@ -217,7 +231,7 @@
     db.remove(&F);
     db.dump_rectangles();
     {
-        const set_type::data_type* expected[] = {0};
+        const set_type::data_type expected[] = {0};
         assert(check_rectangles(db, expected));
         assert(check_size(db, 0));
     }
@@ -228,7 +242,7 @@
     stack_printer __stack_printer__("::rect_test_search");
     typedef uint32_t value_type;
     typedef range<value_type> range_type;
-    typedef rectangle_set<value_type, const range_type> set_type;
+    typedef rectangle_set<value_type, const range_type*> set_type;
 
     range_type A(0, 0, 1, 1, "A");
     range_type B(0, 0, 2, 2, "B");
@@ -241,7 +255,7 @@
     set_type db;
     {
         // Search before any data is inserted.
-        const set_type::data_type* expected[] = {0};
+        const set_type::data_type expected[] = {0};
         assert(check_search_result<set_type>(db, 0, 0, expected));
     }
     insert_range(db, A);
@@ -256,47 +270,47 @@
 
     {
         // Hits all rectangles.
-        const set_type::data_type* expected[] = {&A, &B, &C, &D, &E, &F, &G, 
0};
+        const set_type::data_type expected[] = {&A, &B, &C, &D, &E, &F, &G, 0};
         assert(check_search_result<set_type>(db, 0, 0, expected));
     }
     {
-        const set_type::data_type* expected[] = {&B, &C, &D, &E, &F, &G, 0};
+        const set_type::data_type expected[] = {&B, &C, &D, &E, &F, &G, 0};
         assert(check_search_result<set_type>(db, 0, 1, expected));
         assert(check_search_result<set_type>(db, 1, 0, expected));
         assert(check_search_result<set_type>(db, 1, 1, expected));
     }
     {
-        const set_type::data_type* expected[] = {&C, &D, &E, &F, &G, 0};
+        const set_type::data_type expected[] = {&C, &D, &E, &F, &G, 0};
         assert(check_search_result<set_type>(db, 0, 2, expected));
         assert(check_search_result<set_type>(db, 2, 0, expected));
         assert(check_search_result<set_type>(db, 2, 2, expected));
     }
     {
-        const set_type::data_type* expected[] = {&D, &E, &F, &G, 0};
+        const set_type::data_type expected[] = {&D, &E, &F, &G, 0};
         assert(check_search_result<set_type>(db, 0, 3, expected));
         assert(check_search_result<set_type>(db, 3, 0, expected));
         assert(check_search_result<set_type>(db, 3, 3, expected));
     }
     {
-        const set_type::data_type* expected[] = {&E, &F, &G, 0};
+        const set_type::data_type expected[] = {&E, &F, &G, 0};
         assert(check_search_result<set_type>(db, 0, 4, expected));
         assert(check_search_result<set_type>(db, 4, 0, expected));
         assert(check_search_result<set_type>(db, 4, 4, expected));
     }
     {
-        const set_type::data_type* expected[] = {&F, &G, 0};
+        const set_type::data_type expected[] = {&F, &G, 0};
         assert(check_search_result<set_type>(db, 0, 5, expected));
         assert(check_search_result<set_type>(db, 5, 0, expected));
         assert(check_search_result<set_type>(db, 5, 5, expected));
     }
     {
-        const set_type::data_type* expected[] = {&G, 0};
+        const set_type::data_type expected[] = {&G, 0};
         assert(check_search_result<set_type>(db, 0, 6, expected));
         assert(check_search_result<set_type>(db, 6, 0, expected));
         assert(check_search_result<set_type>(db, 6, 6, expected));
     }
     {
-        const set_type::data_type* expected[] = {0};
+        const set_type::data_type expected[] = {0};
         assert(check_search_result<set_type>(db, 0, 7, expected));
         assert(check_search_result<set_type>(db, 7, 0, expected));
         assert(check_search_result<set_type>(db, 7, 7, expected));
@@ -311,47 +325,47 @@
 
     {
         // Hits all rectangles.
-        const set_type::data_type* expected[] = {&A, &C, &E, &G, 0};
+        const set_type::data_type expected[] = {&A, &C, &E, &G, 0};
         assert(check_search_result<set_type>(db, 0, 0, expected));
     }
     {
-        const set_type::data_type* expected[] = {&C, &E, &G, 0};
+        const set_type::data_type expected[] = {&C, &E, &G, 0};
         assert(check_search_result<set_type>(db, 0, 1, expected));
         assert(check_search_result<set_type>(db, 1, 0, expected));
         assert(check_search_result<set_type>(db, 1, 1, expected));
     }
     {
-        const set_type::data_type* expected[] = {&C, &E, &G, 0};
+        const set_type::data_type expected[] = {&C, &E, &G, 0};
         assert(check_search_result<set_type>(db, 0, 2, expected));
         assert(check_search_result<set_type>(db, 2, 0, expected));
         assert(check_search_result<set_type>(db, 2, 2, expected));
     }
     {
-        const set_type::data_type* expected[] = {&E, &G, 0};
+        const set_type::data_type expected[] = {&E, &G, 0};
         assert(check_search_result<set_type>(db, 0, 3, expected));
         assert(check_search_result<set_type>(db, 3, 0, expected));
         assert(check_search_result<set_type>(db, 3, 3, expected));
     }
     {
-        const set_type::data_type* expected[] = {&E, &G, 0};
+        const set_type::data_type expected[] = {&E, &G, 0};
         assert(check_search_result<set_type>(db, 0, 4, expected));
         assert(check_search_result<set_type>(db, 4, 0, expected));
         assert(check_search_result<set_type>(db, 4, 4, expected));
     }
     {
-        const set_type::data_type* expected[] = {&G, 0};
+        const set_type::data_type expected[] = {&G, 0};
         assert(check_search_result<set_type>(db, 0, 5, expected));
         assert(check_search_result<set_type>(db, 5, 0, expected));
         assert(check_search_result<set_type>(db, 5, 5, expected));
     }
     {
-        const set_type::data_type* expected[] = {&G, 0};
+        const set_type::data_type expected[] = {&G, 0};
         assert(check_search_result<set_type>(db, 0, 6, expected));
         assert(check_search_result<set_type>(db, 6, 0, expected));
         assert(check_search_result<set_type>(db, 6, 6, expected));
     }
     {
-        const set_type::data_type* expected[] = {0};
+        const set_type::data_type expected[] = {0};
         assert(check_search_result<set_type>(db, 0, 7, expected));
         assert(check_search_result<set_type>(db, 7, 0, expected));
         assert(check_search_result<set_type>(db, 7, 7, expected));
@@ -363,7 +377,7 @@
     stack_printer __stack_printer__("::rect_test_copy_constructor");
     typedef int16_t value_type;
     typedef range<value_type> range_type;
-    typedef rectangle_set<value_type, const range_type> set_type;
+    typedef rectangle_set<value_type, const range_type*> set_type;
 
     range_type A(0, 0, 1, 1, "A");
     range_type B(0, 0, 2, 2, "B");
@@ -388,47 +402,47 @@
 
     {
         // Hits all rectangles.
-        const set_type::data_type* expected[] = {&A, &B, &C, &D, &E, &F, &G, 
0};
+        const set_type::data_type expected[] = {&A, &B, &C, &D, &E, &F, &G, 0};
         assert(check_search_result<set_type>(db_copied, 0, 0, expected));
     }
     {
-        const set_type::data_type* expected[] = {&B, &C, &D, &E, &F, &G, 0};
+        const set_type::data_type expected[] = {&B, &C, &D, &E, &F, &G, 0};
         assert(check_search_result<set_type>(db_copied, 0, 1, expected));
         assert(check_search_result<set_type>(db_copied, 1, 0, expected));
         assert(check_search_result<set_type>(db_copied, 1, 1, expected));
     }
     {
-        const set_type::data_type* expected[] = {&C, &D, &E, &F, &G, 0};
+        const set_type::data_type expected[] = {&C, &D, &E, &F, &G, 0};
         assert(check_search_result<set_type>(db_copied, 0, 2, expected));
         assert(check_search_result<set_type>(db_copied, 2, 0, expected));
         assert(check_search_result<set_type>(db_copied, 2, 2, expected));
     }
     {
-        const set_type::data_type* expected[] = {&D, &E, &F, &G, 0};
+        const set_type::data_type expected[] = {&D, &E, &F, &G, 0};
         assert(check_search_result<set_type>(db_copied, 0, 3, expected));
         assert(check_search_result<set_type>(db_copied, 3, 0, expected));
         assert(check_search_result<set_type>(db_copied, 3, 3, expected));
     }
     {
-        const set_type::data_type* expected[] = {&E, &F, &G, 0};
+        const set_type::data_type expected[] = {&E, &F, &G, 0};
         assert(check_search_result<set_type>(db_copied, 0, 4, expected));
         assert(check_search_result<set_type>(db_copied, 4, 0, expected));
         assert(check_search_result<set_type>(db_copied, 4, 4, expected));
     }
     {
-        const set_type::data_type* expected[] = {&F, &G, 0};
+        const set_type::data_type expected[] = {&F, &G, 0};
         assert(check_search_result<set_type>(db_copied, 0, 5, expected));
         assert(check_search_result<set_type>(db_copied, 5, 0, expected));
         assert(check_search_result<set_type>(db_copied, 5, 5, expected));
     }
     {
-        const set_type::data_type* expected[] = {&G, 0};
+        const set_type::data_type expected[] = {&G, 0};
         assert(check_search_result<set_type>(db_copied, 0, 6, expected));
         assert(check_search_result<set_type>(db_copied, 6, 0, expected));
         assert(check_search_result<set_type>(db_copied, 6, 6, expected));
     }
     {
-        const set_type::data_type* expected[] = {0};
+        const set_type::data_type expected[] = {0};
         assert(check_search_result<set_type>(db_copied, 0, 7, expected));
         assert(check_search_result<set_type>(db_copied, 7, 0, expected));
         assert(check_search_result<set_type>(db_copied, 7, 7, expected));
@@ -437,7 +451,7 @@
     check_size(db_copied, 0);
     {
         // There is no rectangle left, hence the search result should be empty.
-        const set_type::data_type* expected[] = {0};
+        const set_type::data_type expected[] = {0};
         assert(check_search_result<set_type>(db_copied, 0, 0, expected));
     }
 
@@ -458,14 +472,14 @@
     insert_range(db_copied, G1);
     db_copied.dump_rectangles();
     {
-        const set_type::data_type* expected[] = {&A1, &B1, &C1, &D1, &E1, &F1, 
&G1, 0};
+        const set_type::data_type expected[] = {&A1, &B1, &C1, &D1, &E1, &F1, 
&G1, 0};
         assert(check_search_result<set_type>(db_copied, 0, 0, expected));
     }
 
     {
         // Check against the origintal dataset, to ensure modification of the
         // copy does not modify the original.
-        const set_type::data_type* expected[] = {&A, &B, &C, &D, &E, &F, &G, 
0};
+        const set_type::data_type expected[] = {&A, &B, &C, &D, &E, &F, &G, 0};
         assert(check_search_result<set_type>(db, 0, 0, expected));
     }
 }
@@ -474,7 +488,7 @@
 {
     typedef int16_t value_type;
     typedef range<value_type> range_type;
-    typedef rectangle_set<value_type, const range_type> set_type;
+    typedef rectangle_set<value_type, const range_type*> set_type;
 
     range_type A(0, 0, 1, 1, "A");
     range_type B(0, 0, 2, 2, "B");
@@ -499,47 +513,47 @@
 
     {
         // Hits all rectangles.
-        const set_type::data_type* expected[] = {&A, &B, &C, &D, &E, &F, &G, 
0};
+        const set_type::data_type expected[] = {&A, &B, &C, &D, &E, &F, &G, 0};
         assert(check_search_result<set_type>(db_assigned, 0, 0, expected));
     }
     {
-        const set_type::data_type* expected[] = {&B, &C, &D, &E, &F, &G, 0};
+        const set_type::data_type expected[] = {&B, &C, &D, &E, &F, &G, 0};
         assert(check_search_result<set_type>(db_assigned, 0, 1, expected));
         assert(check_search_result<set_type>(db_assigned, 1, 0, expected));
         assert(check_search_result<set_type>(db_assigned, 1, 1, expected));
     }
     {
-        const set_type::data_type* expected[] = {&C, &D, &E, &F, &G, 0};
+        const set_type::data_type expected[] = {&C, &D, &E, &F, &G, 0};
         assert(check_search_result<set_type>(db_assigned, 0, 2, expected));
         assert(check_search_result<set_type>(db_assigned, 2, 0, expected));
         assert(check_search_result<set_type>(db_assigned, 2, 2, expected));
     }
     {
-        const set_type::data_type* expected[] = {&D, &E, &F, &G, 0};
+        const set_type::data_type expected[] = {&D, &E, &F, &G, 0};
         assert(check_search_result<set_type>(db_assigned, 0, 3, expected));
         assert(check_search_result<set_type>(db_assigned, 3, 0, expected));
         assert(check_search_result<set_type>(db_assigned, 3, 3, expected));
     }
     {
-        const set_type::data_type* expected[] = {&E, &F, &G, 0};
+        const set_type::data_type expected[] = {&E, &F, &G, 0};
         assert(check_search_result<set_type>(db_assigned, 0, 4, expected));
         assert(check_search_result<set_type>(db_assigned, 4, 0, expected));
         assert(check_search_result<set_type>(db_assigned, 4, 4, expected));
     }
     {
-        const set_type::data_type* expected[] = {&F, &G, 0};
+        const set_type::data_type expected[] = {&F, &G, 0};
         assert(check_search_result<set_type>(db_assigned, 0, 5, expected));
         assert(check_search_result<set_type>(db_assigned, 5, 0, expected));
         assert(check_search_result<set_type>(db_assigned, 5, 5, expected));
     }
     {
-        const set_type::data_type* expected[] = {&G, 0};
+        const set_type::data_type expected[] = {&G, 0};
         assert(check_search_result<set_type>(db_assigned, 0, 6, expected));
         assert(check_search_result<set_type>(db_assigned, 6, 0, expected));
         assert(check_search_result<set_type>(db_assigned, 6, 6, expected));
     }
     {
-        const set_type::data_type* expected[] = {0};
+        const set_type::data_type expected[] = {0};
         assert(check_search_result<set_type>(db_assigned, 0, 7, expected));
         assert(check_search_result<set_type>(db_assigned, 7, 0, expected));
         assert(check_search_result<set_type>(db_assigned, 7, 7, expected));
@@ -548,7 +562,7 @@
     check_size(db_assigned, 0);
     {
         // There is no rectangle left, hence the search result should be empty.
-        const set_type::data_type* expected[] = {0};
+        const set_type::data_type expected[] = {0};
         assert(check_search_result<set_type>(db_assigned, 0, 0, expected));
     }
 
@@ -569,21 +583,21 @@
     insert_range(db_assigned, G1);
     db_assigned.dump_rectangles();
     {
-        const set_type::data_type* expected[] = {&A1, &B1, &C1, &D1, &E1, &F1, 
&G1, 0};
+        const set_type::data_type expected[] = {&A1, &B1, &C1, &D1, &E1, &F1, 
&G1, 0};
         assert(check_search_result<set_type>(db_assigned, 0, 0, expected));
     }
 
     {
         // Check against the origintal dataset, to ensure modification of the
         // copy does not modify the original.
-        const set_type::data_type* expected[] = {&A, &B, &C, &D, &E, &F, &G, 
0};
+        const set_type::data_type expected[] = {&A, &B, &C, &D, &E, &F, &G, 0};
         assert(check_search_result<set_type>(db, 0, 0, expected));
     }
 
     db_assigned = db;
     {
         // Hits all rectangles once again after reverting to the original data 
set.
-        const set_type::data_type* expected[] = {&A, &B, &C, &D, &E, &F, &G, 
0};
+        const set_type::data_type expected[] = {&A, &B, &C, &D, &E, &F, &G, 0};
         assert(check_search_result<set_type>(db_assigned, 0, 0, expected));
     }
 }
@@ -594,7 +608,7 @@
 
     typedef int16_t value_type;
     typedef range<value_type> range_type;
-    typedef rectangle_set<value_type, const range_type> set_type;
+    typedef rectangle_set<value_type, const range_type*> set_type;
 
     range_type A(0, 0, 1, 1, "A");
     range_type B(0, 0, 2, 2, "B");
@@ -634,7 +648,7 @@
     stack_printer __stack_printer__("::rect_test_perf_insertion_fixed_x");
     typedef size_t value_type;
     typedef range<value_type> range_type;
-    typedef rectangle_set<value_type, const range_type> set_type;
+    typedef rectangle_set<value_type, const range_type*> set_type;
 
     size_t data_count = 1000000;
     cout << "data count: " << data_count << endl;
@@ -758,7 +772,7 @@
     stack_printer __stack_printer__("::rect_test_perf_insertion_fixed_y");
     typedef size_t value_type;
     typedef range<value_type> range_type;
-    typedef rectangle_set<value_type, const range_type> set_type;
+    typedef rectangle_set<value_type, const range_type*> set_type;
 
     size_t data_count = 100000;
     cout << "data count: " << data_count << endl;
@@ -883,7 +897,7 @@
 
     typedef uint32_t value_type;
     typedef range<value_type> range_type;
-    typedef rectangle_set<value_type, const range_type> set_type;
+    typedef rectangle_set<value_type, const range_type*> set_type;
 
     range_type A(0, 0, 1, 1, "A");
     range_type B(0, 0, 2, 2, "B");
@@ -912,7 +926,7 @@
 void rect_test_invalid_range()
 {
     stack_printer __stack_printer__("::rect_test_invalid_range");
-    typedef rectangle_set<int, string> set_type;
+    typedef rectangle_set<int, string*> set_type;
     string A("A");
 
     int ranges[][4] = {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdds_0.11.2/src/segment_tree_test.cpp 
new/mdds_0.12.0/src/segment_tree_test.cpp
--- old/mdds_0.11.2/src/segment_tree_test.cpp   2014-12-18 21:05:56.000000000 
+0100
+++ new/mdds_0.12.0/src/segment_tree_test.cpp   2015-02-06 03:32:45.000000000 
+0100
@@ -90,7 +90,7 @@
 template<typename key_type, typename data_type>
 bool check_leaf_nodes(
     const segment_tree<key_type, data_type>& db,
-    const key_type* keys, data_type** data_chain, size_t key_size)
+    const key_type* keys, data_type* data_chain, size_t key_size)
 {
     typedef segment_tree<key_type, data_type> st_type;
     vector<typename st_type::leaf_node_check> checks;
@@ -100,7 +100,7 @@
     {
         typename st_type::leaf_node_check c;
         c.key = keys[i];
-        data_type* p = data_chain[dcid];
+        data_type p = data_chain[dcid];
         while (p)
         {
             c.data_chain.push_back(p);
@@ -114,11 +114,11 @@
 }
 
 template<typename data_type>
-bool check_against_expected(const list<const data_type*>& test, data_type** 
expected)
+bool check_against_expected(const list<data_type>& test, data_type* expected)
 {
     size_t i = 0;
-    data_type* p = expected[i++];
-    typename list<const data_type*>::const_iterator itr = test.begin(), 
itr_end = test.end();
+    data_type p = expected[i++];
+    typename list<data_type>::const_iterator itr = test.begin(), itr_end = 
test.end();
     while (p)
     {
         if (itr == itr_end)
@@ -147,12 +147,12 @@
 bool check_search_result_only(
     const segment_tree<key_type, data_type>& db,
     const typename segment_tree<key_type, data_type>::search_result_type& 
result,
-    key_type key, data_type** expected)
+    key_type key, data_type* expected)
 {
     cout << "search key: " << key << " ";
 
     typedef typename segment_tree<key_type, data_type>::search_result_type 
search_result_type;
-    list<const data_type*> test;
+    list<data_type> test;
     copy(result.begin(), result.end(), back_inserter(test));
     test.sort(test_data::sort_by_name());
 
@@ -169,7 +169,7 @@
 template<typename key_type, typename data_type>
 bool check_search_result(
     const segment_tree<key_type, data_type>& db,
-    key_type key, data_type** expected)
+    key_type key, data_type* expected)
 {
     cout << "search key: " << key << " ";
 
@@ -182,13 +182,13 @@
 template<typename key_type, typename data_type>
 bool check_search_result_iterator(
     const segment_tree<key_type, data_type>& db,
-    key_type key, data_type** expected)
+    key_type key, data_type* expected)
 {
     cout << "search key: " << key << " ";
 
     typedef segment_tree<key_type, data_type> db_type;
     typename db_type::search_result result = db.search(key);
-    list<const data_type*> test;
+    list<data_type> test;
     copy(result.begin(), result.end(), back_inserter(test));
     test.sort(test_data::sort_by_name());
 
@@ -205,7 +205,7 @@
 
     typedef long key_type;
     typedef test_data data_type;
-    typedef segment_tree<key_type, data_type> db_type;
+    typedef segment_tree<key_type, data_type*> db_type;
 
     db_type db;
     data_type A("A"), B("B"), C("C"), D("D"), E("E"), F("F"), G("G");
@@ -481,7 +481,7 @@
 
     typedef long key_type;
     typedef test_data data_type;
-    typedef segment_tree<key_type, data_type> db_type;
+    typedef segment_tree<key_type, data_type*> db_type;
 
     db_type db;
     data_type A("A"), B("B"), C("C"), D("D"), E("E"), F("F"), G("G");
@@ -532,7 +532,7 @@
 
     typedef uint32_t key_type;
     typedef test_data data_type;
-    typedef segment_tree<key_type, data_type> db_type;
+    typedef segment_tree<key_type, data_type*> db_type;
 
     data_type A("A"), B("B"), C("C"), D("D"), E("E"), F("F"), G("G");
     {
@@ -562,7 +562,7 @@
 
     typedef uint8_t key_type;
     typedef test_data data_type;
-    typedef segment_tree<key_type, data_type> db_type;
+    typedef segment_tree<key_type, data_type*> db_type;
 
     data_type A("A"), B("B"), C("C"), D("D"), E("E"), F("F"), G("G");
 
@@ -607,7 +607,7 @@
 
     typedef short key_type;
     typedef test_data data_type;
-    typedef segment_tree<key_type, data_type> db_type;
+    typedef segment_tree<key_type, data_type*> db_type;
 
     data_type A("A"), B("B"), C("C"), D("D"), E("E"), F("F"), G("G");
 
@@ -632,7 +632,7 @@
 
     typedef int16_t key_type;
     typedef test_data data_type;
-    typedef segment_tree<key_type, data_type> db_type;
+    typedef segment_tree<key_type, data_type*> db_type;
 
     for (key_type data_count = 10; data_count < 20; ++data_count)
     {
@@ -674,7 +674,7 @@
 
     typedef uint32_t key_type;
     typedef test_data data_type;
-    typedef segment_tree<key_type, data_type> db_type;
+    typedef segment_tree<key_type, data_type*> db_type;
 
     key_type data_count = 1000000;
 
@@ -819,7 +819,7 @@
 
     typedef uint16_t key_type;
     typedef test_data data_type;
-    typedef segment_tree<key_type, data_type> db_type;
+    typedef segment_tree<key_type, data_type*> db_type;
 
     data_type A("A"), B("B"), C("C"), D("D"), E("E"), F("F"), G("G");
 
@@ -878,7 +878,7 @@
 
     typedef uint16_t key_type;
     typedef test_data data_type;
-    typedef segment_tree<key_type, data_type> db_type;
+    typedef segment_tree<key_type, data_type*> db_type;
 
     data_type A("A"), B("B"), C("C"), D("D"), E("E"), F("F"), G("G");
     db_type db;
@@ -894,43 +894,43 @@
     db.dump_leaf_nodes();
 
     {
-        db_type::data_type* expected[] = {&A, &B, &C, &D, &E, &F, &G, 0};
-        bool success = check_search_result<key_type, data_type>(db, 0, 
expected);
+        db_type::data_type expected[] = {&A, &B, &C, &D, &E, &F, &G, 0};
+        bool success = check_search_result<key_type, data_type*>(db, 0, 
expected);
         assert(success);
     }
     {
-        db_type::data_type* expected[] = {&B, &C, &D, &E, &F, &G, 0};
-        bool success = check_search_result<key_type, data_type>(db, 1, 
expected);
+        db_type::data_type expected[] = {&B, &C, &D, &E, &F, &G, 0};
+        bool success = check_search_result<key_type, data_type*>(db, 1, 
expected);
         assert(success);
     }
     {
-        db_type::data_type* expected[] = {&C, &D, &E, &F, &G, 0};
-        bool success = check_search_result<key_type, data_type>(db, 2, 
expected);
+        db_type::data_type expected[] = {&C, &D, &E, &F, &G, 0};
+        bool success = check_search_result<key_type, data_type*>(db, 2, 
expected);
         assert(success);
     }
     {
-        db_type::data_type* expected[] = {&D, &E, &F, &G, 0};
-        bool success = check_search_result<key_type, data_type>(db, 3, 
expected);
+        db_type::data_type expected[] = {&D, &E, &F, &G, 0};
+        bool success = check_search_result<key_type, data_type*>(db, 3, 
expected);
         assert(success);
     }
     {
-        db_type::data_type* expected[] = {&E, &F, &G, 0};
-        bool success = check_search_result<key_type, data_type>(db, 4, 
expected);
+        db_type::data_type expected[] = {&E, &F, &G, 0};
+        bool success = check_search_result<key_type, data_type*>(db, 4, 
expected);
         assert(success);
     }
     {
-        db_type::data_type* expected[] = {&F, &G, 0};
-        bool success = check_search_result<key_type, data_type>(db, 5, 
expected);
+        db_type::data_type expected[] = {&F, &G, 0};
+        bool success = check_search_result<key_type, data_type*>(db, 5, 
expected);
         assert(success);
     }
     {
-        db_type::data_type* expected[] = {&G, 0};
-        bool success = check_search_result<key_type, data_type>(db, 6, 
expected);
+        db_type::data_type expected[] = {&G, 0};
+        bool success = check_search_result<key_type, data_type*>(db, 6, 
expected);
         assert(success);
     }
     {
-        db_type::data_type* expected[] = {0};
-        bool success = check_search_result<key_type, data_type>(db, 7, 
expected);
+        db_type::data_type expected[] = {0};
+        bool success = check_search_result<key_type, data_type*>(db, 7, 
expected);
         assert(success);
     }
 }
@@ -941,7 +941,7 @@
 
     typedef uint16_t key_type;
     typedef test_data data_type;
-    typedef segment_tree<key_type, data_type> db_type;
+    typedef segment_tree<key_type, data_type*> db_type;
 
     db_type db;
     db.build_tree();
@@ -959,7 +959,7 @@
     stack_printer __stack_printer__("::st_test_search_iterator");
     typedef uint16_t key_type;
     typedef test_data data_type;
-    typedef segment_tree<key_type, data_type> db_type;
+    typedef segment_tree<key_type, data_type*> db_type;
 
     data_type A("A"), B("B"), C("C"), D("D"), E("E"), F("F"), G("G");
     db_type db;
@@ -1013,7 +1013,7 @@
 
     typedef uint16_t key_type;
     typedef test_data data_type;
-    typedef segment_tree<key_type, data_type> db_type;
+    typedef segment_tree<key_type, data_type*> db_type;
 
     data_type A("A"), B("B"), C("C"), D("D"), E("E"), F("F"), G("G");
     db_type db;
@@ -1028,42 +1028,42 @@
 
     {
         data_type* expected[] = {&A, &B, &C, &D, &E, &F, &G, 0};
-        bool success = check_search_result_iterator<key_type, data_type>(db, 
0, expected);
+        bool success = check_search_result_iterator<key_type, data_type*>(db, 
0, expected);
         assert(success);
     }
     {
         data_type* expected[] = {&B, &C, &D, &E, &F, &G, 0};
-        bool success = check_search_result_iterator<key_type, data_type>(db, 
1, expected);
+        bool success = check_search_result_iterator<key_type, data_type*>(db, 
1, expected);
         assert(success);
     }
     {
         data_type* expected[] = {&C, &D, &E, &F, &G, 0};
-        bool success = check_search_result_iterator<key_type, data_type>(db, 
2, expected);
+        bool success = check_search_result_iterator<key_type, data_type*>(db, 
2, expected);
         assert(success);
     }
     {
         data_type* expected[] = {&D, &E, &F, &G, 0};
-        bool success = check_search_result_iterator<key_type, data_type>(db, 
3, expected);
+        bool success = check_search_result_iterator<key_type, data_type*>(db, 
3, expected);
         assert(success);
     }
     {
         data_type* expected[] = {&E, &F, &G, 0};
-        bool success = check_search_result_iterator<key_type, data_type>(db, 
4, expected);
+        bool success = check_search_result_iterator<key_type, data_type*>(db, 
4, expected);
         assert(success);
     }
     {
         data_type* expected[] = {&F, &G, 0};
-        bool success = check_search_result_iterator<key_type, data_type>(db, 
5, expected);
+        bool success = check_search_result_iterator<key_type, data_type*>(db, 
5, expected);
         assert(success);
     }
     {
         data_type* expected[] = {&G, 0};
-        bool success = check_search_result_iterator<key_type, data_type>(db, 
6, expected);
+        bool success = check_search_result_iterator<key_type, data_type*>(db, 
6, expected);
         assert(success);
     }
     {
         data_type* expected[] = {0};
-        bool success = check_search_result_iterator<key_type, data_type>(db, 
7, expected);
+        bool success = check_search_result_iterator<key_type, data_type*>(db, 
7, expected);
         assert(success);
     }
 }
@@ -1075,13 +1075,30 @@
 void st_test_empty_result_set()
 {
     stack_printer __stack_printer__("::st_test_empty_result_set");
-    typedef segment_tree<long, string> db_type;
+    typedef segment_tree<long, string*> db_type;
     db_type db;
     db_type::search_result result = db.search(0);
     cout << "size of empty result set: " << result.size() << endl;
     assert(result.size() == 0);
 }
 
+void st_test_non_pointer_data()
+{
+    stack_printer __stack_printer__("::st_test_non_pointer_data");
+
+    typedef uint16_t key_type;
+    typedef size_t data_type;
+    typedef segment_tree<key_type, data_type> db_type;
+
+    db_type db;
+    db.insert(0, 1, 10);
+    db.build_tree();
+
+    db_type::search_result result = db.search(0);
+    assert(result.size() == 1);
+    assert(*result.begin() == 10);
+}
+
 int main(int argc, char** argv)
 {
     try
@@ -1104,6 +1121,7 @@
             st_test_search_iterator_basic();
             st_test_search_iterator_result_check();
             st_test_empty_result_set();
+            st_test_non_pointer_data();
         }
 
         if (opt.test_perf)
@@ -1113,7 +1131,7 @@
 
         // At this point, all of the nodes created during the test run should 
have
         // been destroyed.  If not, we are leaking memory.
-        typedef segment_tree<uint32_t, void> db_type;
+        typedef segment_tree<uint32_t, void*> db_type;
         assert(db_type::node::get_instance_count() == 0);
     }
     catch (const std::exception& e)

-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to