|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r60470 - trunk/libs/spirit/example/scheme
From: joel_at_[hidden]
Date: 2010-03-11 02:20:11
Author: djowel
Date: 2010-03-11 02:20:10 EST (Thu, 11 Mar 2010)
New Revision: 60470
URL: http://svn.boost.org/trac/boost/changeset/60470
Log:
support for references
Text files modified:
trunk/libs/spirit/example/scheme/simple_print.hpp | 2
trunk/libs/spirit/example/scheme/utree.hpp | 75 ++++++++++++++++++++++++++++++++++++++-
trunk/libs/spirit/example/scheme/utree_test.cpp | 18 +++++++++
3 files changed, 92 insertions(+), 3 deletions(-)
Modified: trunk/libs/spirit/example/scheme/simple_print.hpp
==============================================================================
--- trunk/libs/spirit/example/scheme/simple_print.hpp (original)
+++ trunk/libs/spirit/example/scheme/simple_print.hpp 2010-03-11 02:20:10 EST (Thu, 11 Mar 2010)
@@ -83,7 +83,7 @@
inline std::ostream& println(std::ostream& out, scheme::utree const& val)
{
- out << detail::print(out, val) << std::endl;
+ detail::print(out, val) << std::endl;
return out;
}
}
Modified: trunk/libs/spirit/example/scheme/utree.hpp
==============================================================================
--- trunk/libs/spirit/example/scheme/utree.hpp (original)
+++ trunk/libs/spirit/example/scheme/utree.hpp 2010-03-11 02:20:10 EST (Thu, 11 Mar 2010)
@@ -15,6 +15,7 @@
#include <boost/iterator/iterator_facade.hpp>
#include <boost/range/iterator_range.hpp>
#include <boost/type_traits/is_pointer.hpp>
+#include <boost/ref.hpp>
#if defined(BOOST_MSVC)
# pragma warning(push)
@@ -43,7 +44,8 @@
double_type,
small_string_type,
heap_string_type,
- list_type
+ list_type,
+ reference_type
};
};
@@ -172,9 +174,9 @@
explicit utree(char const* str);
explicit utree(char const* str, std::size_t len);
explicit utree(std::string const& str);
+ explicit utree(boost::reference_wrapper<utree> ref);
utree(utree const& other);
- utree(utree const& other);
~utree();
utree& operator=(utree const& other);
@@ -184,6 +186,7 @@
utree& operator=(double d);
utree& operator=(char const* s);
utree& operator=(std::string const& s);
+ utree& operator=(boost::reference_wrapper<utree> ref);
template <typename F>
typename F::result_type
@@ -276,6 +279,7 @@
bool b;
int i;
double d;
+ utree* p;
};
};
@@ -711,6 +715,8 @@
case type::heap_string_type:
case type::small_string_type:
return f(string_range(x.s.str(), x.s.str() + x.s.size()));
+ case type::reference_type:
+ return apply(*x.p, f);
}
}
@@ -753,6 +759,8 @@
case type::small_string_type:
return visit_impl::apply(y, detail::bind(
f, string_range(x.s.str(), x.s.str() + x.s.size())));
+ case type::reference_type:
+ return apply(*x.p, y, f);
}
}
};
@@ -817,6 +825,12 @@
s.construct(str.begin(), str.end());
}
+ inline utree::utree(boost::reference_wrapper<utree> ref)
+ : p(ref.get_pointer())
+ {
+ set_type(type::reference_type);
+ }
+
inline utree::utree(utree const& other)
{
copy(other);
@@ -883,6 +897,14 @@
return *this;
}
+ inline utree& utree::operator=(boost::reference_wrapper<utree> ref)
+ {
+ free();
+ p = ref.get_pointer();
+ set_type(type::reference_type);
+ return *this;
+ }
+
template <typename F>
typename F::result_type
inline utree::visit(utree const& x, F f)
@@ -927,12 +949,16 @@
inline utree& utree::operator[](std::size_t i)
{
+ if (get_type() == type::reference_type)
+ return (*p)[i];
BOOST_ASSERT(get_type() == type::list_type && size() > i);
return detail::index_impl::apply(l.first, i);
}
inline utree const& utree::operator[](std::size_t i) const
{
+ if (get_type() == type::reference_type)
+ return (*(utree const*)p)[i];
BOOST_ASSERT(get_type() == type::list_type && size() > i);
return detail::index_impl::apply(l.first, i);
}
@@ -970,6 +996,8 @@
template <typename T>
inline void utree::push_front(T const& val)
{
+ if (get_type() == type::reference_type)
+ return p->push_front(val);
ensure_list_type();
l.push_front(val);
}
@@ -977,6 +1005,8 @@
template <typename T>
inline void utree::push_back(T const& val)
{
+ if (get_type() == type::reference_type)
+ return p->push_back(val);
ensure_list_type();
l.push_back(val);
}
@@ -984,6 +1014,8 @@
template <typename T>
inline utree::iterator utree::insert(iterator pos, T const& val)
{
+ if (get_type() == type::reference_type)
+ return p->insert(pos, val);
ensure_list_type();
if (pos.node == l.last)
{
@@ -1001,6 +1033,8 @@
template <typename T>
inline void utree::insert(iterator pos, std::size_t n, T const& val)
{
+ if (get_type() == type::reference_type)
+ return p->insert(pos, n, val);
for (std::size_t i = 0; i != n; ++i)
insert(pos, val);
}
@@ -1008,6 +1042,8 @@
template <typename Iter>
inline void utree::insert(iterator pos, Iter first, Iter last)
{
+ if (get_type() == type::reference_type)
+ return p->insert(pos, first, last);
ensure_list_type();
while (first != last)
insert(pos, *first++);
@@ -1016,6 +1052,8 @@
template <typename Iter>
inline void utree::assign(Iter first, Iter last)
{
+ if (get_type() == type::reference_type)
+ return p->assign(first, last);
ensure_list_type();
clear();
while (first != last)
@@ -1024,6 +1062,8 @@
inline void utree::clear()
{
+ if (get_type() == type::reference_type)
+ return p->clear();
// clear will always make this a nil type
free();
set_type(type::nil_type);
@@ -1031,24 +1071,32 @@
inline void utree::pop_front()
{
+ if (get_type() == type::reference_type)
+ return p->pop_front();
BOOST_ASSERT(get_type() == type::list_type);
l.pop_front();
}
inline void utree::pop_back()
{
+ if (get_type() == type::reference_type)
+ return p->pop_back();
BOOST_ASSERT(get_type() == type::list_type);
l.pop_back();
}
inline utree::iterator utree::erase(iterator pos)
{
+ if (get_type() == type::reference_type)
+ return p->erase(pos);
BOOST_ASSERT(get_type() == type::list_type);
return iterator(l.erase(pos.node));
}
inline utree::iterator utree::erase(iterator first, iterator last)
{
+ if (get_type() == type::reference_type)
+ return p->erase(first, last);
while (first != last)
erase(first++);
return last;
@@ -1056,30 +1104,40 @@
inline utree::iterator utree::begin()
{
+ if (get_type() == type::reference_type)
+ return p->begin();
ensure_list_type();
return iterator(l.first);
}
inline utree::iterator utree::end()
{
+ if (get_type() == type::reference_type)
+ return p->end();
ensure_list_type();
return iterator(l.last);
}
inline utree::const_iterator utree::begin() const
{
+ if (get_type() == type::reference_type)
+ return ((utree const*)p)->begin();
BOOST_ASSERT(get_type() == type::list_type);
return const_iterator(l.first);
}
inline utree::const_iterator utree::end() const
{
+ if (get_type() == type::reference_type)
+ return ((utree const*)p)->end();
BOOST_ASSERT(get_type() == type::list_type);
return const_iterator(l.last);
}
inline bool utree::empty() const
{
+ if (get_type() == type::reference_type)
+ return ((utree const*)p)->empty();
if (get_type() == type::list_type)
return l.size == 0;
BOOST_ASSERT(get_type() == type::nil_type);
@@ -1088,6 +1146,8 @@
inline std::size_t utree::size() const
{
+ if (get_type() == type::reference_type)
+ return ((utree const*)p)->size();
if (get_type() == type::list_type)
return l.size;
BOOST_ASSERT(get_type() == type::nil_type);
@@ -1096,24 +1156,32 @@
inline utree& utree::front()
{
+ if (get_type() == type::reference_type)
+ return p->front();
BOOST_ASSERT(get_type() == type::list_type && l.first != 0);
return l.first->val;
}
inline utree& utree::back()
{
+ if (get_type() == type::reference_type)
+ return p->back();
BOOST_ASSERT(get_type() == type::list_type && l.last != 0);
return l.last->val;
}
inline utree const& utree::front() const
{
+ if (get_type() == type::reference_type)
+ return ((utree const*)p)->front();
BOOST_ASSERT(get_type() == type::list_type && l.first != 0);
return l.first->val;
}
inline utree const& utree::back() const
{
+ if (get_type() == type::reference_type)
+ return ((utree const*)p)->back();
BOOST_ASSERT(get_type() == type::list_type && l.last != 0);
return l.last->val;
}
@@ -1179,6 +1247,9 @@
case type::double_type:
d = other.d;
break;
+ case type::reference_type:
+ p = other.p;
+ break;
case type::small_string_type:
case type::heap_string_type:
s.copy(other.s);
Modified: trunk/libs/spirit/example/scheme/utree_test.cpp
==============================================================================
--- trunk/libs/spirit/example/scheme/utree_test.cpp (original)
+++ trunk/libs/spirit/example/scheme/utree_test.cpp 2010-03-11 02:20:10 EST (Thu, 11 Mar 2010)
@@ -151,5 +151,23 @@
BOOST_ASSERT(a[11] == utree(12));
}
+ { // test references
+ utree val(123);
+ utree ref(boost::ref(val));
+ println(std::cout, ref);
+ BOOST_ASSERT(ref == utree(123));
+
+ val.clear();
+ val.push_back(1);
+ val.push_back(2);
+ val.push_back(3);
+ val.push_back(4);
+ println(std::cout, ref);
+ BOOST_ASSERT(ref[0] == utree(1));
+ BOOST_ASSERT(ref[1] == utree(2));
+ BOOST_ASSERT(ref[2] == utree(3));
+ BOOST_ASSERT(ref[3] == utree(4));
+ }
+
return 0;
}
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk