$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r60282 - trunk/libs/spirit/example/qi/scheme
From: joel_at_[hidden]
Date: 2010-03-07 05:06:55
Author: djowel
Date: 2010-03-07 05:06:54 EST (Sun, 07 Mar 2010)
New Revision: 60282
URL: http://svn.boost.org/trac/boost/changeset/60282
Log:
updates tweaks
Text files modified: 
   trunk/libs/spirit/example/qi/scheme/utree.hpp      |    51 ++++++++++++++++++--------------------- 
   trunk/libs/spirit/example/qi/scheme/utree_test.cpp |     7 +++++                                   
   2 files changed, 31 insertions(+), 27 deletions(-)
Modified: trunk/libs/spirit/example/qi/scheme/utree.hpp
==============================================================================
--- trunk/libs/spirit/example/qi/scheme/utree.hpp	(original)
+++ trunk/libs/spirit/example/qi/scheme/utree.hpp	2010-03-07 05:06:54 EST (Sun, 07 Mar 2010)
@@ -14,6 +14,7 @@
 #include <boost/noncopyable.hpp>
 #include <boost/iterator/iterator_facade.hpp>
 #include <boost/range/iterator_range.hpp>
+#include <boost/type_traits/is_pointer.hpp>
 
 #if defined(BOOST_MSVC)
 # pragma warning(push)
@@ -111,7 +112,7 @@
         template <typename Iterator>
         void construct(Iterator f, Iterator l)
         {
-            unsigned const size = (l-f)+1;
+            unsigned const size = l-f;
             char* str;
             if (size <= small_string_size)
             {
@@ -129,7 +130,7 @@
                 this->heap.size = size;
                 set_type(utree_type::heap_string_type);
             }
-            for (int i = 0; i != size; ++i)
+            for (std::size_t i = 0; i != size; ++i)
                 *str++ = *f++;
         }
 
@@ -343,7 +344,6 @@
     };
 
     std::ostream& operator<<(std::ostream& out, utree const& val);
-
     bool operator==(utree const& a, utree const& b);
     bool operator<(utree const& a, utree const& b);
     std::ostream& operator<<(std::ostream& out, utree const& val);
@@ -412,7 +412,7 @@
     private:
 
         friend class boost::iterator_core_access;
-        friend class utree;
+        friend class scheme::utree;
 
         void increment() { node = node->next; }
         void decrement() { node = node->prev; }
@@ -595,23 +595,26 @@
             out << (b?"true":"false");
         }
 
-        void operator()(char const* s) const
-        {
-            out << '"' << s << '"';
-        }
-
         template <typename Iterator>
         void operator()(boost::iterator_range<Iterator> const& range) const
         {
-            out << '[';
+            // This code works for both strings and lists
+            bool const is_string = boost::is_pointer<Iterator>::value;
+            char const start = is_string ? '"' : '[';
+            char const end = is_string ? '"' : ']';
+
+            out << start;
             for (typename boost::iterator_range<Iterator>::const_iterator
                 i = range.begin(); i != range.end(); ++i)
             {
-                if (i != range.begin())
-                    out << ',';
+                if (!is_string)
+                {
+                    if (i != range.begin())
+                        out << ',';
+                }
                 out << *i;
             }
-            out << ']';
+            out << end;
         }
     };
 
@@ -641,6 +644,7 @@
         template <typename T>
         bool operator()(const T& a, const T& b) const
         {
+            // This code works for lists and strings as well
             return a == b;
         }
 
@@ -648,11 +652,6 @@
         {
             return true;
         }
-
-        bool operator()(char const* a, char const* b) const
-        {
-            return strcmp(a, b) == 0; // $$$ use utf8 comparison here! $$$
-        }
     };
 
     struct utree_is_less_than
@@ -681,6 +680,7 @@
         template <typename T>
         bool operator()(const T& a, const T& b) const
         {
+            // This code works for lists and strings as well
             return a < b;
         }
 
@@ -689,11 +689,6 @@
             BOOST_ASSERT(false);
             return false; // no less than comparison for nil
         }
-
-        bool operator()(char const* a, char const* b) const
-        {
-            return strcmp(a, b) < 0; // $$$ use utf8 comparison here! $$$
-        }
     };
 
     template <typename UTreeX, typename UTreeY = UTreeX>
@@ -714,6 +709,7 @@
             iterator;
 
             typedef boost::iterator_range<iterator> list_range;
+            typedef boost::iterator_range<string_type> string_range;
             typedef detail::utree_type type;
 
             switch (x.get_type())
@@ -730,7 +726,7 @@
                 case type::list_type:
                     return f(list_range(iterator(x.l.first), iterator(0)));
                 default:
-                    return f(string_type(x.s.str()));
+                    return f(string_range(x.s.str(), x.s.str() + x.s.size()));
             }
         }
 
@@ -749,6 +745,7 @@
             iterator;
 
             typedef boost::iterator_range<iterator> list_range;
+            typedef boost::iterator_range<string_type> string_range;
             typedef detail::utree_type type;
 
             switch (x.get_type())
@@ -767,7 +764,8 @@
                         y, detail::bind<F, list_range>(f,
                         list_range(iterator(x.l.first), iterator(0))));
                 default:
-                    return visit_impl::apply(y, detail::bind(f, string_type(x.s.str())));
+                    return visit_impl::apply(y, detail::bind(
+                        f, string_range(x.s.str(), x.s.str() + x.s.size())));
             }
         }
     };
@@ -923,8 +921,7 @@
         if (this->get_type() == type::nil_type)
         {
             this->set_type(type::list_type);
-            this->l.first = this->l.last = 0;
-            this->l.size = 0;
+            this->l.default_construct();
         }
         else
         {
Modified: trunk/libs/spirit/example/qi/scheme/utree_test.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/scheme/utree_test.cpp	(original)
+++ trunk/libs/spirit/example/qi/scheme/utree_test.cpp	2010-03-07 05:06:54 EST (Sun, 07 Mar 2010)
@@ -40,6 +40,13 @@
         utree val3("Hello, World. Chuckie is back!!!");
         val = val3;
         std::cout << val << std::endl;
+
+        utree val4("Apple");
+        utree val5("Apple");
+        BOOST_ASSERT(val4 == val5);
+
+        utree val6("ApplePie");
+        BOOST_ASSERT(val4 < val6);
     }
 
     {