Fix iterator storage traits implementation and add unit-test
g0dil [Fri, 8 Jun 2007 11:00:24 +0000 (11:00 +0000)]
git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@253 270642c3-0616-0410-b53a-bc976706d245

Utils/IteratorTraits.cti
Utils/IteratorTraits.hh
Utils/IteratorTraits.ih [new file with mode: 0644]
Utils/IteratorTraits.test.cc [new file with mode: 0644]

index 9dcf070..eb5d812 100644 (file)
@@ -21,7 +21,7 @@
 /** \file
     \brief IteratorTraits inline template implementation */
 
-//#include "IteratorTraits.ih"
+#include "IteratorTraits.ih"
 
 // Custom includes
 #include <boost/utility.hpp>
@@ -30,7 +30,7 @@
 ///////////////////////////////cti.p///////////////////////////////////////
 
 template <class Iterator>
-prefix_ std::iterator_traits<Iterator>::pointer senf::storage_iterator(Iterator i)
+prefix_ typename std::iterator_traits<Iterator>::pointer senf::storage_iterator(Iterator i)
 {
     return boost::addressof(*i);
 }
index 6bc00bf..ebf2855 100644 (file)
@@ -25,6 +25,7 @@
 #define HH_IteratorTraits_ 1
 
 // Custom includes
+#include <boost/type_traits/integral_constant.hpp>
 #include <vector>
 #include <string>
 
@@ -36,26 +37,19 @@ namespace senf {
 // The following is *not* standard mandated but it *is* mandated by TR1 and I know of no
 // implementation for which this is not correct
 
-#define SENF_VECTOR_IS_CONTIGUOUS 1
-#define SENF_STRING_IS_CONTIGUOUS 1
-    
     /** \brief Check for contiguous mutable storage
 
         This type trait returns \c true, if \a RandomAccessIterator is an iterator into a contiguous
         storage area which may be written to. If this is the case, some algorithms may be optimized
         by directly modifying the underlying storage instead of relying on the STL interface.
         
-        This trait is predefined to return \c true for pointers and for the iterators of \c
-        std::vector and \c std::basic_string (and so for \c std::string and \c std::wstring). This
-        is \e not required by the current standard. It is however required for \c std::vector in the
-        first corrigendum to the standard, TR1. Furthermore almost all implementations for \c
-        std::vector do follow this approach. 
+        This trait will return \c true for pointers. Additonally it should be configured to return
+        true for all standard containers which obey above implementation restrictions. This
+        typically includes \c std::vector and \c std::basic_string.
 
-        For \c std::string the case is different, there are libraries which use reference counting
-        and shared ownership for strings, however no library with which SENF has been tested to date
-        has strings of this variety. If SENF is used with such a standard library implementation,
-        this header has to be adjysted to define the preprocessor symbol \c
-        SENF_STRING_IS_CONTIGUOUS accordingly.
+        To do so, the template must be specialized for those containers \c iterator type. If
+        compiling with g++, this is implemented in \ref IteratorTraits.ih. This file should be
+        extended for further compilers if necessary.
      */
     template <class RandomAccessIterator>
     struct contiguous_storage_iterator
@@ -67,20 +61,6 @@ namespace senf {
         : public boost::true_type
     {};
 
-#if defined(SENF_VECTOR_IS_CONTIGUOUS)
-    template <class T, class Alloc>
-    struct contiguous_storage_iterator< typename std::vector<T,Alloc>::iterator >
-        : public boost::true_type
-    {};
-#endif
-
-#if defined(SENF_STRING_IS_CONTIGUOUS)
-    template <class CharT, class Traits, class Alloc>
-    struct contiguous_storage_iterator< typename std::basic_string<CharT, Traits, Alloc>::iterator >
-        : public boost::true_type
-    {};
-#endif
-
     /** \brief Convert contiguous storage iterator to pointer
         
         storage_iterator will convert a contiguous storage iterator into a pointer to the same
@@ -94,7 +74,8 @@ namespace senf {
 ///////////////////////////////hh.e////////////////////////////////////////
 //#include "IteratorTraits.cci"
 //#include "IteratorTraits.ct"
-//#include "IteratorTraits.cti"
+#include "IteratorTraits.cti"
+#include "IteratorTraits.ih"
 #endif
 
 \f
diff --git a/Utils/IteratorTraits.ih b/Utils/IteratorTraits.ih
new file mode 100644 (file)
index 0000000..8fbafa7
--- /dev/null
@@ -0,0 +1,64 @@
+// Copyright (C) 2007 
+// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
+// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+//     Stefan Bund <g0dil@berlios.de>
+//
+// 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-1307, USA.
+
+/** \file
+    \brief IteratorTraits internal header */
+
+#ifndef IH_IteratorTraits_
+#define IH_IteratorTraits_ 1
+
+// Custom includes
+
+///////////////////////////////ih.p////////////////////////////////////////
+
+namespace senf {
+
+    // It is not very nice that we need to specialize on the exact iterator names.
+    // The preprocessor guard will need to be expanded by also giving the correct
+    // version numbers. We need to disable it when using stlport and so on ... 
+    // The problem is, that typedefs are not expanded when specializing ...
+
+#if defined(__GNUG__)
+    template <class T, class Alloc>
+    struct contiguous_storage_iterator<
+        __gnu_cxx::__normal_iterator<T*, std::vector<T,Alloc> > >
+        : public boost::true_type
+    {};
+
+    template <class CharT, class Traits, class Alloc>
+    struct contiguous_storage_iterator< 
+        __gnu_cxx::__normal_iterator<CharT*, std::basic_string<CharT, Traits, Alloc> > >
+        : public boost::true_type
+    {};
+#endif
+
+}
+
+///////////////////////////////ih.e////////////////////////////////////////
+#endif
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// End:
diff --git a/Utils/IteratorTraits.test.cc b/Utils/IteratorTraits.test.cc
new file mode 100644 (file)
index 0000000..6687d8e
--- /dev/null
@@ -0,0 +1,57 @@
+// Copyright (C) 2007 
+// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
+// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+//     Stefan Bund <g0dil@berlios.de>
+//
+// 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-1307, USA.
+
+/** \file
+    \brief IteratorTraits.test unit tests */
+
+//#include "IteratorTraits.test.hh"
+//#include "IteratorTraits.test.ih"
+
+// Custom includes
+#include "IteratorTraits.hh"
+#include <vector>
+#include <string>
+
+#include <boost/test/auto_unit_test.hpp>
+#include <boost/test/test_tools.hpp>
+
+#define prefix_
+///////////////////////////////cc.p////////////////////////////////////////
+
+BOOST_AUTO_UNIT_TEST(iteratorTraits)
+{
+    BOOST_CHECK_EQUAL( senf::contiguous_storage_iterator<int*>::value, true );
+#ifdef __GNUG__
+    BOOST_CHECK_EQUAL( senf::contiguous_storage_iterator<std::vector<int>::iterator>::value, true);
+    BOOST_CHECK_EQUAL( senf::contiguous_storage_iterator<std::string::iterator>::value, true);
+#endif
+}
+
+///////////////////////////////cc.e////////////////////////////////////////
+#undef prefix_
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// End: