]> git.lyx.org Git - features.git/commitdiff
add spirit
authorLars Gullik Bjønnes <larsbj@gullik.org>
Wed, 24 Nov 2004 21:11:03 +0000 (21:11 +0000)
committerLars Gullik Bjønnes <larsbj@gullik.org>
Wed, 24 Nov 2004 21:11:03 +0000 (21:11 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@9299 a592a061-630c-0410-9148-cb99ea01b6c8

73 files changed:
boost/ChangeLog
boost/boost/spirit/actor/assign_actor.hpp [new file with mode: 0644]
boost/boost/spirit/actor/push_back_actor.hpp [new file with mode: 0644]
boost/boost/spirit/actor/ref_const_ref_actor.hpp [new file with mode: 0644]
boost/boost/spirit/actor/ref_value_actor.hpp [new file with mode: 0644]
boost/boost/spirit/attribute.hpp [new file with mode: 0644]
boost/boost/spirit/attribute/closure.hpp [new file with mode: 0644]
boost/boost/spirit/attribute/closure_context.hpp [new file with mode: 0644]
boost/boost/spirit/attribute/parametric.hpp [new file with mode: 0644]
boost/boost/spirit/core.hpp [new file with mode: 0644]
boost/boost/spirit/debug.hpp [new file with mode: 0644]
boost/boost/spirit/debug/minimal.hpp [new file with mode: 0644]
boost/boost/spirit/dynamic/if.hpp [new file with mode: 0644]
boost/boost/spirit/dynamic/impl/conditions.ipp [new file with mode: 0644]
boost/boost/spirit/error_handling.hpp [new file with mode: 0644]
boost/boost/spirit/error_handling/exceptions.hpp [new file with mode: 0644]
boost/boost/spirit/error_handling/impl/exceptions.ipp [new file with mode: 0644]
boost/boost/spirit/iterator.hpp [new file with mode: 0644]
boost/boost/spirit/iterator/file_iterator.hpp [new file with mode: 0644]
boost/boost/spirit/iterator/fixed_size_queue.hpp [new file with mode: 0644]
boost/boost/spirit/iterator/impl/file_iterator.ipp [new file with mode: 0644]
boost/boost/spirit/iterator/impl/position_iterator.ipp [new file with mode: 0644]
boost/boost/spirit/iterator/multi_pass.hpp [new file with mode: 0644]
boost/boost/spirit/iterator/position_iterator.hpp [new file with mode: 0644]
boost/boost/spirit/meta.hpp [new file with mode: 0644]
boost/boost/spirit/meta/as_parser.hpp [new file with mode: 0644]
boost/boost/spirit/meta/fundamental.hpp [new file with mode: 0644]
boost/boost/spirit/meta/impl/fundamental.ipp [new file with mode: 0644]
boost/boost/spirit/meta/impl/parser_traits.ipp [new file with mode: 0644]
boost/boost/spirit/meta/impl/refactoring.ipp [new file with mode: 0644]
boost/boost/spirit/meta/impl/traverse.ipp [new file with mode: 0644]
boost/boost/spirit/meta/parser_traits.hpp [new file with mode: 0644]
boost/boost/spirit/meta/refactoring.hpp [new file with mode: 0644]
boost/boost/spirit/meta/traverse.hpp [new file with mode: 0644]
boost/boost/spirit/phoenix.hpp [new file with mode: 0644]
boost/boost/spirit/phoenix/actor.hpp [new file with mode: 0644]
boost/boost/spirit/phoenix/binders.hpp [new file with mode: 0644]
boost/boost/spirit/phoenix/casts.hpp [new file with mode: 0644]
boost/boost/spirit/phoenix/closures.hpp [new file with mode: 0644]
boost/boost/spirit/phoenix/composite.hpp [new file with mode: 0644]
boost/boost/spirit/phoenix/functions.hpp [new file with mode: 0644]
boost/boost/spirit/phoenix/new.hpp [new file with mode: 0644]
boost/boost/spirit/phoenix/operators.hpp [new file with mode: 0644]
boost/boost/spirit/phoenix/primitives.hpp [new file with mode: 0644]
boost/boost/spirit/phoenix/special_ops.hpp [new file with mode: 0644]
boost/boost/spirit/phoenix/statements.hpp [new file with mode: 0644]
boost/boost/spirit/phoenix/tuple_helpers.hpp [new file with mode: 0644]
boost/boost/spirit/phoenix/tuples.hpp [new file with mode: 0644]
boost/boost/spirit/symbols.hpp [new file with mode: 0644]
boost/boost/spirit/symbols/impl/symbols.ipp [new file with mode: 0644]
boost/boost/spirit/symbols/impl/tst.ipp [new file with mode: 0644]
boost/boost/spirit/symbols/symbols.hpp [new file with mode: 0644]
boost/boost/spirit/utility.hpp [new file with mode: 0644]
boost/boost/spirit/utility/chset.hpp [new file with mode: 0644]
boost/boost/spirit/utility/chset_operators.hpp [new file with mode: 0644]
boost/boost/spirit/utility/confix.hpp [new file with mode: 0644]
boost/boost/spirit/utility/distinct.hpp [new file with mode: 0644]
boost/boost/spirit/utility/escape_char.hpp [new file with mode: 0644]
boost/boost/spirit/utility/flush_multi_pass.hpp [new file with mode: 0644]
boost/boost/spirit/utility/functor_parser.hpp [new file with mode: 0644]
boost/boost/spirit/utility/impl/chset.ipp [new file with mode: 0644]
boost/boost/spirit/utility/impl/chset/basic_chset.hpp [new file with mode: 0644]
boost/boost/spirit/utility/impl/chset/basic_chset.ipp [new file with mode: 0644]
boost/boost/spirit/utility/impl/chset/range_run.hpp [new file with mode: 0644]
boost/boost/spirit/utility/impl/chset/range_run.ipp [new file with mode: 0644]
boost/boost/spirit/utility/impl/chset_operators.ipp [new file with mode: 0644]
boost/boost/spirit/utility/impl/confix.ipp [new file with mode: 0644]
boost/boost/spirit/utility/impl/escape_char.ipp [new file with mode: 0644]
boost/boost/spirit/utility/impl/lists.ipp [new file with mode: 0644]
boost/boost/spirit/utility/lists.hpp [new file with mode: 0644]
boost/boost/spirit/utility/loops.hpp [new file with mode: 0644]
boost/boost/spirit/utility/scoped_lock.hpp [new file with mode: 0644]
boost/boost/spirit/version.hpp [new file with mode: 0644]

index 5937455900db64863cc3c411f15dd4e40c348532..01711ce0c16cbe2f1b1968ca8ab30752162142d4 100644 (file)
@@ -1,3 +1,7 @@
+2004-11-24  Lars Gullik Bjønnes  <larsbj@gullik.net>
+
+       * add spirit to the collection
+
 2004-11-20  Lars Gullik Bjonnes  <larsbj@gullik.net>
 
        * update boost to version 1.32.0
diff --git a/boost/boost/spirit/actor/assign_actor.hpp b/boost/boost/spirit/actor/assign_actor.hpp
new file mode 100644 (file)
index 0000000..6eb58c9
--- /dev/null
@@ -0,0 +1,96 @@
+/*=============================================================================
+    Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_ACTOR_ASSIGN_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_ASSIGN_ACTOR_HPP
+
+#include <boost/spirit/actor/ref_value_actor.hpp>
+#include <boost/spirit/actor/ref_const_ref_actor.hpp>
+
+namespace boost { namespace spirit {
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Summary:
+    //  A semantic action policy that applies the assignement operator.
+    //  (This doc uses convention available in actors.hpp)
+    //
+    //  Actions (what it does):
+    //      ref = value;
+    //      ref = T(first,last);
+    //      ref = value_ref;
+    //
+    //  Policy name:
+    //      assign_action
+    //
+    //  Policy holder, corresponding helper method:
+    //      ref_value_actor, assign_a( ref );
+    //      ref_const_ref_actor, assign_a( ref, value_ref );
+    //
+    //  () operators: both
+    //
+    //  See also ref_value_actor and ref_const_ref_actor for more details.
+    ///////////////////////////////////////////////////////////////////////////
+    struct assign_action
+    {
+        template<
+            typename T,
+            typename ValueT
+        >
+        void act(T& ref_, ValueT const& value_) const
+        {
+            ref_ = value_;
+        }
+        template<
+            typename T,
+            typename IteratorT
+        >
+        void act(
+            T& ref_,
+            IteratorT const& first_,
+            IteratorT const& last_
+            ) const
+        {
+            typedef T value_type;
+#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
+            value_type value(first_,last_);
+#else
+            value_type value;
+            std::copy(first_, last_, std::inserter(value, value.end()));
+#endif
+            ref_ = value;
+        }
+    };
+
+    // Deprecated. Please use assign_a
+    template<typename T>
+    inline ref_value_actor<T,assign_action> assign(T& ref_)
+    {
+        return ref_value_actor<T,assign_action>(ref_);
+    }
+
+    template<typename T>
+    inline ref_value_actor<T,assign_action> assign_a(T& ref_)
+    {
+        return ref_value_actor<T,assign_action>(ref_);
+    }
+
+    template<
+        typename T,
+        typename ValueT
+    >
+    inline ref_const_ref_actor<T,ValueT,assign_action> assign_a(
+        T& ref_,
+        ValueT const& value_
+    )
+    {
+        return ref_const_ref_actor<T,ValueT,assign_action>(ref_,value_);
+    }
+
+}}
+
+#endif
diff --git a/boost/boost/spirit/actor/push_back_actor.hpp b/boost/boost/spirit/actor/push_back_actor.hpp
new file mode 100644 (file)
index 0000000..6fbd24f
--- /dev/null
@@ -0,0 +1,97 @@
+/*=============================================================================
+    Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_ACTOR_PUSH_BACK_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_PUSH_BACK_ACTOR_HPP
+
+#include <boost/spirit/actor/ref_value_actor.hpp>
+#include <boost/spirit/actor/ref_const_ref_actor.hpp>
+
+namespace boost { namespace spirit {
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Summary:
+    //
+    //  A semantic action policy that appends a value to the back of a
+    //  container.
+    //  (This doc uses convention available in actors.hpp)
+    //
+    //  Actions (what it does and what ref, value_ref must support):
+    //      ref.push_back( value );
+    //      ref.push_back( T::value_type(first,last) );
+    //      ref.push_back( value_ref );
+    //
+    //  Policy name:
+    //      push_back_action
+    //
+    //  Policy holder, corresponding helper method:
+    //      ref_value_actor, push_back_a( ref );
+    //      ref_const_ref_actor, push_back_a( ref, value_ref );
+    //
+    //  () operators: both
+    //
+    //  See also ref_value_actor and ref_const_ref_actor for more details.
+    ///////////////////////////////////////////////////////////////////////////
+    struct push_back_action
+    {
+        template<
+            typename T,
+            typename ValueT
+        >
+        void act(T& ref_, ValueT const& value_) const
+        {
+            ref_.push_back( value_ );
+        }
+        template<
+            typename T,
+            typename IteratorT
+        >
+        void act(
+            T& ref_,
+            IteratorT const& first_,
+            IteratorT const& last_
+            ) const
+        {
+            typedef typename T::value_type value_type;
+            value_type value(first_,last_);
+
+            ref_.push_back( value );
+        }
+    };
+
+//  Deprecated interface. Use push_back_a
+    template<typename T>
+    inline ref_value_actor<T,push_back_action> 
+    append(T& ref_)
+    {
+        return ref_value_actor<T,push_back_action>(ref_);
+    }
+
+    template<typename T>
+    inline ref_value_actor<T,push_back_action> 
+    push_back_a(T& ref_)
+    {
+        return ref_value_actor<T,push_back_action>(ref_);
+    }
+
+    template<
+        typename T,
+        typename ValueT
+    >
+    inline ref_const_ref_actor<T,ValueT,push_back_action> 
+    push_back_a(
+        T& ref_,
+        ValueT const& value_
+    )
+    {
+        return ref_const_ref_actor<T,ValueT,push_back_action>(ref_,value_);
+    }
+
+}}
+
+#endif
diff --git a/boost/boost/spirit/actor/ref_const_ref_actor.hpp b/boost/boost/spirit/actor/ref_const_ref_actor.hpp
new file mode 100644 (file)
index 0000000..3691606
--- /dev/null
@@ -0,0 +1,73 @@
+/*=============================================================================
+    Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_ACTOR_REF_CONST_REF_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_REF_CONST_REF_ACTOR_HPP
+
+namespace boost { namespace spirit {
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Summary:
+    //  A semantic action policy holder. This holder stores a reference to ref
+    //  and a const reference to value_ref.
+    //  act methods are feed with ref and value_ref. The parse result is
+    //  not used by this holder.
+    //
+    //  (This doc uses convention available in actors.hpp)
+    //
+    //  Constructor:
+    //      ...(T& ref_, ValueT const& value_ref_);
+    //      where ref_ and value_ref_ are stored in the holder.
+    //
+    //  Action calls:
+    //      act(ref, value_ref);
+    //
+    //  () operators: both
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template<
+        typename T,
+        typename ValueT,
+        typename ActionT
+    >
+    class ref_const_ref_actor : public ActionT
+    {
+    private:
+        T& ref;
+        ValueT const& value_ref;
+    public:
+        ref_const_ref_actor(
+            T& ref_,
+            ValueT const& value_ref_
+            )
+        :
+            ref(ref_),
+            value_ref(value_ref_)
+        {}
+
+
+        template<typename T2>
+        void operator()(T2 const& /*val*/) const
+        {
+            this->act(ref,value_ref); // defined in ActionT
+        }
+
+
+        template<typename IteratorT>
+            void operator()(
+            IteratorT const& /*first*/,
+            IteratorT const& /*last*/
+            ) const
+        {
+            this->act(ref,value_ref); // defined in ActionT
+        }
+    };
+
+}}
+
+#endif
diff --git a/boost/boost/spirit/actor/ref_value_actor.hpp b/boost/boost/spirit/actor/ref_value_actor.hpp
new file mode 100644 (file)
index 0000000..cd21ab8
--- /dev/null
@@ -0,0 +1,65 @@
+/*=============================================================================
+    Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_ACTOR_REF_VALUE_ACTOR_HPP
+#define BOOST_SPIRIT_ACTOR_REF_VALUE_ACTOR_HPP
+
+namespace boost { namespace spirit {
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Summary:
+    //  A semantic action policy holder. This holder stores a reference to ref.
+    //  act methods are feed with ref and the parse result.
+    //
+    //  (This doc uses convention available in actors.hpp)
+    //
+    //  Constructor:
+    //      ...(T& ref_);
+    //      where ref_ is stored.
+    //
+    //  Action calls:
+    //      act(ref, value);
+    //      act(ref, first,last);
+    //
+    //  () operators: both
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template<
+        typename T,
+        typename ActionT
+    >
+    class ref_value_actor : public ActionT
+    {
+    private:
+        T& ref;
+    public:
+        explicit
+        ref_value_actor(T& ref_)
+        : ref(ref_){}
+
+
+        template<typename T2>
+        void operator()(T2 const& val_) const
+        {
+            this->act(ref,val_); // defined in ActionT
+        }
+
+
+        template<typename IteratorT>
+        void operator()(
+            IteratorT const& first_,
+            IteratorT const& last_
+            ) const
+        {
+            this->act(ref,first_,last_); // defined in ActionT
+        }
+    };
+
+}}
+
+#endif
diff --git a/boost/boost/spirit/attribute.hpp b/boost/boost/spirit/attribute.hpp
new file mode 100644 (file)
index 0000000..48e9a5d
--- /dev/null
@@ -0,0 +1,38 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_ATTRIBUTE_MAIN_HPP)
+#define BOOST_SPIRIT_ATTRIBUTE_MAIN_HPP
+
+#include <boost/spirit/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Master header for Spirit.Attributes
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Phoenix predefined maximum limit. This limit defines the maximum
+//  number of elements a tuple can hold. This number defaults to 3. The
+//  actual maximum is rounded up in multiples of 3. Thus, if this value
+//  is 4, the actual limit is 6. The ultimate maximum limit in this
+//  implementation is 15.
+//
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(PHOENIX_LIMIT)
+#define PHOENIX_LIMIT 3
+#endif // !defined(PHOENIX_LIMIT)
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/attribute/parametric.hpp>
+#include <boost/spirit/attribute/closure.hpp>
+
+#endif // !defined(BOOST_SPIRIT_ATTRIBUTE_MAIN_HPP)
diff --git a/boost/boost/spirit/attribute/closure.hpp b/boost/boost/spirit/attribute/closure.hpp
new file mode 100644 (file)
index 0000000..60886b8
--- /dev/null
@@ -0,0 +1,1078 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_CLOSURE_HPP
+#define BOOST_SPIRIT_CLOSURE_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/core/parser.hpp>
+#include <boost/spirit/core/composite/composite.hpp>
+#include <boost/spirit/attribute/parametric.hpp>
+#include <boost/spirit/attribute/closure_context.hpp>
+
+#include <boost/spirit/phoenix/closures.hpp>
+#include <boost/spirit/phoenix/primitives.hpp>
+#include <boost/spirit/phoenix/casts.hpp>
+#include <boost/spirit/phoenix/operators.hpp>
+#include <boost/spirit/phoenix/tuple_helpers.hpp>
+
+#include <boost/static_assert.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Spirit predefined maximum closure limit. This limit defines the maximum
+//  number of elements a closure can hold. This number defaults to 3. The
+//  actual maximum is rounded up in multiples of 3. Thus, if this value
+//  is 4, the actual limit is 6. The ultimate maximum limit in this
+//  implementation is 15.
+//
+//  It should NOT be greater than PHOENIX_LIMIT!
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#if !defined(BOOST_SPIRIT_CLOSURE_LIMIT)
+#define BOOST_SPIRIT_CLOSURE_LIMIT PHOENIX_LIMIT
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// ensure BOOST_SPIRIT_CLOSURE_LIMIT <= PHOENIX_LIMIT and SPIRIT_CLOSURE_LIMIT <= 15
+//
+///////////////////////////////////////////////////////////////////////////////
+BOOST_STATIC_ASSERT(BOOST_SPIRIT_CLOSURE_LIMIT <= PHOENIX_LIMIT);
+BOOST_STATIC_ASSERT(BOOST_SPIRIT_CLOSURE_LIMIT <= 15);
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  closure_context class
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename ClosureT>
+    class closure_context : public parser_context_base
+    {
+    public:
+
+        typedef typename phoenix::tuple_element<0,
+            typename ClosureT::tuple_t>::type attr_t;
+        typedef ClosureT base_t;
+        typedef closure_context_linker<closure_context<ClosureT> >
+        context_linker_t;
+
+        closure_context(ClosureT const& clos)
+        : frame(clos) {}
+
+        ~closure_context() {}
+
+        template <typename ParserT, typename ScannerT>
+        void pre_parse(ParserT const&, ScannerT const&) {}
+
+        template <typename ResultT, typename ParserT, typename ScannerT>
+        ResultT& post_parse(ResultT& hit, ParserT const&, ScannerT const&)
+        { hit.value(frame[phoenix::tuple_index<0>()]); return hit; }
+
+    private:
+
+        phoenix::closure_frame<typename ClosureT::phoenix_closure_t> frame;
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  init_closure_context class
+    //
+    //      The init_closure_context class is a special parser context type
+    //      which additionally initializes a closure contained in the derived
+    //      parser with values from a given tuple. Please note, that this
+    //      given tuple does not contain the required values directly, it
+    //      contains phoenix::actor objects. These actors have to be
+    //      dereferenced to gain the values to be used for initialization
+    //      (this is done by the help of the phoenix::convert_actors<>
+    //      template).
+    //
+    ///////////////////////////////////////////////////////////////////////////
+
+    template <typename ClosureT>
+    class init_closure_context : public parser_context_base
+    {
+        typedef typename ClosureT::tuple_t      tuple_t;
+        typedef typename ClosureT::closure_t    closure_t;
+
+    public:
+
+        init_closure_context(ClosureT const& clos)
+        : frame(clos.subject(), phoenix::convert_actors<tuple_t>(clos.init)) {}
+
+        ~init_closure_context() {}
+
+        template <typename ParserT, typename ScannerT>
+        void pre_parse(ParserT const& /*p*/, ScannerT const&) {}
+
+        template <typename ResultT, typename ParserT, typename ScannerT>
+        ResultT& post_parse(ResultT& hit, ParserT const&, ScannerT const&)
+        { hit.value(frame[phoenix::tuple_index<0>()]); return hit; }
+
+    private:
+
+        phoenix::closure_frame<closure_t> frame;
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  init_closure_parser class
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename ParserT, typename ActorTupleT>
+    struct init_closure_parser
+    : public unary<ParserT, parser<init_closure_parser<ParserT, ActorTupleT> > >
+    {
+        typedef init_closure_parser<ParserT, ActorTupleT>           self_t;
+        typedef unary<ParserT, parser<self_t> >                     base_t;
+        typedef typename ParserT::phoenix_closure_t                 closure_t;
+        typedef typename ParserT::tuple_t                           tuple_t;
+        typedef typename phoenix::tuple_element<0, tuple_t>::type   attr_t;
+
+        template <typename ScannerT>
+        struct result
+        {
+            typedef typename match_result<ScannerT, attr_t>::type type;
+        };
+
+        init_closure_parser(ParserT const& p, ActorTupleT const& init_)
+        : base_t(p), init(init_) {}
+
+        template <typename ScannerT>
+        typename parser_result<self_t, ScannerT>::type
+        parse_main(ScannerT const& scan) const
+        {
+            return this->subject().parse_main(scan);
+        }
+
+        template <typename ScannerT>
+        typename parser_result<self_t, ScannerT>::type
+        parse(ScannerT const& scan) const
+        {
+            typedef init_closure_context<self_t> init_context_t;
+            typedef parser_scanner_linker<ScannerT> scanner_t;
+            typedef closure_context_linker<init_context_t> context_t;
+            typedef typename parser_result<self_t, ScannerT>::type result_t;
+            BOOST_SPIRIT_CONTEXT_PARSE(
+                scan, *this, scanner_t, context_t, result_t);
+        }
+
+        ActorTupleT init;
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  closure class
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <
+            typename DerivedT
+        ,   typename T0 = phoenix::nil_t
+        ,   typename T1 = phoenix::nil_t
+        ,   typename T2 = phoenix::nil_t
+
+    #if BOOST_SPIRIT_CLOSURE_LIMIT > 3
+        ,   typename T3 = phoenix::nil_t
+        ,   typename T4 = phoenix::nil_t
+        ,   typename T5 = phoenix::nil_t
+
+    #if BOOST_SPIRIT_CLOSURE_LIMIT > 6
+        ,   typename T6 = phoenix::nil_t
+        ,   typename T7 = phoenix::nil_t
+        ,   typename T8 = phoenix::nil_t
+
+    #if BOOST_SPIRIT_CLOSURE_LIMIT > 9
+        ,   typename T9 = phoenix::nil_t
+        ,   typename T10 = phoenix::nil_t
+        ,   typename T11 = phoenix::nil_t
+
+    #if BOOST_SPIRIT_CLOSURE_LIMIT > 12
+        ,   typename T12 = phoenix::nil_t
+        ,   typename T13 = phoenix::nil_t
+        ,   typename T14 = phoenix::nil_t
+
+    #endif
+    #endif
+    #endif
+    #endif
+    >
+    struct closure :
+        public phoenix::closure<
+            T0, T1, T2
+    #if BOOST_SPIRIT_CLOSURE_LIMIT > 3
+        ,   T3, T4, T5
+    #if BOOST_SPIRIT_CLOSURE_LIMIT > 6
+        ,   T6, T7, T8
+    #if BOOST_SPIRIT_CLOSURE_LIMIT > 9
+        ,   T9, T10, T11
+    #if BOOST_SPIRIT_CLOSURE_LIMIT > 12
+        ,   T12, T13, T14
+    #endif
+    #endif
+    #endif
+    #endif
+        >
+    {
+        typedef phoenix::closure<
+                T0, T1, T2
+    #if BOOST_SPIRIT_CLOSURE_LIMIT > 3
+            ,   T3, T4, T5
+    #if BOOST_SPIRIT_CLOSURE_LIMIT > 6
+            ,   T6, T7, T8
+    #if BOOST_SPIRIT_CLOSURE_LIMIT > 9
+            ,   T9, T10, T11
+    #if BOOST_SPIRIT_CLOSURE_LIMIT > 12
+            ,   T12, T13, T14
+    #endif
+    #endif
+    #endif
+    #endif
+            > phoenix_closure_t;
+
+        typedef closure_context<DerivedT> context_t;
+
+        template <typename DerivedT2>
+        struct aux
+        {
+            DerivedT2& aux_derived()
+            { return *static_cast<DerivedT2*>(this); }
+
+            DerivedT2 const& aux_derived() const
+            { return *static_cast<DerivedT2 const*>(this); }
+
+        // initialization functions
+            template <typename A>
+            init_closure_parser<
+                DerivedT2,
+                phoenix::tuple<
+                    typename phoenix::as_actor<A>::type
+                >
+            >
+            operator()(A const &a) const
+            {
+                typedef typename phoenix::as_actor<A>::type a_t;
+                typedef phoenix::tuple<a_t> actor_tuple_t;
+
+                return init_closure_parser<DerivedT2, actor_tuple_t>(
+                        aux_derived(),
+                        actor_tuple_t(
+                            phoenix::as_actor<A>::convert(a)
+                        )
+                    );
+            }
+
+            template <typename A, typename B>
+            init_closure_parser<
+                DerivedT2,
+                phoenix::tuple<
+                    typename phoenix::as_actor<A>::type,
+                    typename phoenix::as_actor<B>::type
+                >
+            >
+            operator()(A const &a, B const &b) const
+            {
+                typedef typename phoenix::as_actor<A>::type a_t;
+                typedef typename phoenix::as_actor<B>::type b_t;
+                typedef phoenix::tuple<a_t, b_t> actor_tuple_t;
+
+                return init_closure_parser<DerivedT2, actor_tuple_t>(
+                        aux_derived(),
+                        actor_tuple_t(
+                            phoenix::as_actor<A>::convert(a),
+                            phoenix::as_actor<B>::convert(b)
+                        )
+                    );
+            }
+
+            template <typename A, typename B, typename C>
+            init_closure_parser<
+                DerivedT2,
+                phoenix::tuple<
+                    typename phoenix::as_actor<A>::type,
+                    typename phoenix::as_actor<B>::type,
+                    typename phoenix::as_actor<C>::type
+                >
+            >
+            operator()(A const &a, B const &b, C const &c) const
+            {
+                typedef typename phoenix::as_actor<A>::type a_t;
+                typedef typename phoenix::as_actor<B>::type b_t;
+                typedef typename phoenix::as_actor<C>::type c_t;
+                typedef phoenix::tuple<a_t, b_t, c_t> actor_tuple_t;
+
+                return init_closure_parser<DerivedT2, actor_tuple_t>(
+                        aux_derived(),
+                        actor_tuple_t(
+                            phoenix::as_actor<A>::convert(a),
+                            phoenix::as_actor<B>::convert(b),
+                            phoenix::as_actor<C>::convert(c)
+                        )
+                    );
+            }
+
+    #if BOOST_SPIRIT_CLOSURE_LIMIT > 3
+
+            template <
+                typename A, typename B, typename C, typename D
+            >
+            init_closure_parser<
+                DerivedT2,
+                phoenix::tuple<
+                    typename phoenix::as_actor<A>::type,
+                    typename phoenix::as_actor<B>::type,
+                    typename phoenix::as_actor<C>::type,
+                    typename phoenix::as_actor<D>::type
+                >
+            >
+            operator()(
+                A const &a, B const &b, C const &c, D const &d
+            ) const
+            {
+                typedef typename phoenix::as_actor<A>::type a_t;
+                typedef typename phoenix::as_actor<B>::type b_t;
+                typedef typename phoenix::as_actor<C>::type c_t;
+                typedef typename phoenix::as_actor<D>::type d_t;
+                typedef phoenix::tuple<
+                            a_t, b_t, c_t, d_t
+                        > actor_tuple_t;
+
+                return init_closure_parser<DerivedT2, actor_tuple_t>(
+                        aux_derived(),
+                        actor_tuple_t(
+                            phoenix::as_actor<A>::convert(a),
+                            phoenix::as_actor<B>::convert(b),
+                            phoenix::as_actor<C>::convert(c),
+                            phoenix::as_actor<D>::convert(d)
+                        )
+                    );
+            }
+
+            template <
+                typename A, typename B, typename C, typename D, typename E
+            >
+            init_closure_parser<
+                DerivedT2,
+                phoenix::tuple<
+                    typename phoenix::as_actor<A>::type,
+                    typename phoenix::as_actor<B>::type,
+                    typename phoenix::as_actor<C>::type,
+                    typename phoenix::as_actor<D>::type,
+                    typename phoenix::as_actor<E>::type
+                >
+            >
+            operator()(
+                A const &a, B const &b, C const &c, D const &d, E const &e
+            ) const
+            {
+                typedef typename phoenix::as_actor<A>::type a_t;
+                typedef typename phoenix::as_actor<B>::type b_t;
+                typedef typename phoenix::as_actor<C>::type c_t;
+                typedef typename phoenix::as_actor<D>::type d_t;
+                typedef typename phoenix::as_actor<E>::type e_t;
+                typedef phoenix::tuple<
+                            a_t, b_t, c_t, d_t, e_t
+                        > actor_tuple_t;
+
+                return init_closure_parser<DerivedT2, actor_tuple_t>(
+                        aux_derived(),
+                        actor_tuple_t(
+                            phoenix::as_actor<A>::convert(a),
+                            phoenix::as_actor<B>::convert(b),
+                            phoenix::as_actor<C>::convert(c),
+                            phoenix::as_actor<D>::convert(d),
+                            phoenix::as_actor<E>::convert(e)
+                        )
+                    );
+            }
+
+            template <
+                typename A, typename B, typename C, typename D, typename E,
+                typename F
+            >
+            init_closure_parser<
+                DerivedT2,
+                phoenix::tuple<
+                    typename phoenix::as_actor<A>::type,
+                    typename phoenix::as_actor<B>::type,
+                    typename phoenix::as_actor<C>::type,
+                    typename phoenix::as_actor<D>::type,
+                    typename phoenix::as_actor<E>::type,
+                    typename phoenix::as_actor<F>::type
+                >
+            >
+            operator()(
+                A const &a, B const &b, C const &c, D const &d, E const &e,
+                F const &f
+            ) const
+            {
+                typedef typename phoenix::as_actor<A>::type a_t;
+                typedef typename phoenix::as_actor<B>::type b_t;
+                typedef typename phoenix::as_actor<C>::type c_t;
+                typedef typename phoenix::as_actor<D>::type d_t;
+                typedef typename phoenix::as_actor<E>::type e_t;
+                typedef typename phoenix::as_actor<F>::type f_t;
+                typedef phoenix::tuple<
+                            a_t, b_t, c_t, d_t, e_t, f_t
+                        > actor_tuple_t;
+
+                return init_closure_parser<DerivedT2, actor_tuple_t>(
+                        aux_derived(),
+                        actor_tuple_t(
+                            phoenix::as_actor<A>::convert(a),
+                            phoenix::as_actor<B>::convert(b),
+                            phoenix::as_actor<C>::convert(c),
+                            phoenix::as_actor<D>::convert(d),
+                            phoenix::as_actor<E>::convert(e),
+                            phoenix::as_actor<F>::convert(f)
+                        )
+                    );
+            }
+
+    #if BOOST_SPIRIT_CLOSURE_LIMIT > 6
+
+            template <
+                typename A, typename B, typename C, typename D, typename E,
+                typename F, typename G
+            >
+            init_closure_parser<
+                DerivedT2,
+                phoenix::tuple<
+                    typename phoenix::as_actor<A>::type,
+                    typename phoenix::as_actor<B>::type,
+                    typename phoenix::as_actor<C>::type,
+                    typename phoenix::as_actor<D>::type,
+                    typename phoenix::as_actor<E>::type,
+                    typename phoenix::as_actor<F>::type,
+                    typename phoenix::as_actor<G>::type
+                >
+            >
+            operator()(
+                A const &a, B const &b, C const &c, D const &d, E const &e,
+                F const &f, G const &g
+            ) const
+            {
+                typedef typename phoenix::as_actor<A>::type a_t;
+                typedef typename phoenix::as_actor<B>::type b_t;
+                typedef typename phoenix::as_actor<C>::type c_t;
+                typedef typename phoenix::as_actor<D>::type d_t;
+                typedef typename phoenix::as_actor<E>::type e_t;
+                typedef typename phoenix::as_actor<F>::type f_t;
+                typedef typename phoenix::as_actor<G>::type g_t;
+                typedef phoenix::tuple<
+                            a_t, b_t, c_t, d_t, e_t, f_t, g_t
+                        > actor_tuple_t;
+
+                return init_closure_parser<DerivedT2, actor_tuple_t>(
+                        aux_derived(),
+                        actor_tuple_t(
+                            phoenix::as_actor<A>::convert(a),
+                            phoenix::as_actor<B>::convert(b),
+                            phoenix::as_actor<C>::convert(c),
+                            phoenix::as_actor<D>::convert(d),
+                            phoenix::as_actor<E>::convert(e),
+                            phoenix::as_actor<F>::convert(f),
+                            phoenix::as_actor<G>::convert(g)
+                        )
+                    );
+            }
+
+            template <
+                typename A, typename B, typename C, typename D, typename E,
+                typename F, typename G, typename H
+            >
+            init_closure_parser<
+                DerivedT2,
+                phoenix::tuple<
+                    typename phoenix::as_actor<A>::type,
+                    typename phoenix::as_actor<B>::type,
+                    typename phoenix::as_actor<C>::type,
+                    typename phoenix::as_actor<D>::type,
+                    typename phoenix::as_actor<E>::type,
+                    typename phoenix::as_actor<F>::type,
+                    typename phoenix::as_actor<G>::type,
+                    typename phoenix::as_actor<H>::type
+                >
+            >
+            operator()(
+                A const &a, B const &b, C const &c, D const &d, E const &e,
+                F const &f, G const &g, H const &h
+            ) const
+            {
+                typedef typename phoenix::as_actor<A>::type a_t;
+                typedef typename phoenix::as_actor<B>::type b_t;
+                typedef typename phoenix::as_actor<C>::type c_t;
+                typedef typename phoenix::as_actor<D>::type d_t;
+                typedef typename phoenix::as_actor<E>::type e_t;
+                typedef typename phoenix::as_actor<F>::type f_t;
+                typedef typename phoenix::as_actor<G>::type g_t;
+                typedef typename phoenix::as_actor<H>::type h_t;
+                typedef phoenix::tuple<
+                            a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t
+                        > actor_tuple_t;
+
+                return init_closure_parser<DerivedT2, actor_tuple_t>(
+                        aux_derived(),
+                        actor_tuple_t(
+                            phoenix::as_actor<A>::convert(a),
+                            phoenix::as_actor<B>::convert(b),
+                            phoenix::as_actor<C>::convert(c),
+                            phoenix::as_actor<D>::convert(d),
+                            phoenix::as_actor<E>::convert(e),
+                            phoenix::as_actor<F>::convert(f),
+                            phoenix::as_actor<G>::convert(g),
+                            phoenix::as_actor<H>::convert(h)
+                        )
+                    );
+            }
+
+            template <
+                typename A, typename B, typename C, typename D, typename E,
+                typename F, typename G, typename H, typename I
+            >
+            init_closure_parser<
+                DerivedT2,
+                phoenix::tuple<
+                    typename phoenix::as_actor<A>::type,
+                    typename phoenix::as_actor<B>::type,
+                    typename phoenix::as_actor<C>::type,
+                    typename phoenix::as_actor<D>::type,
+                    typename phoenix::as_actor<E>::type,
+                    typename phoenix::as_actor<F>::type,
+                    typename phoenix::as_actor<G>::type,
+                    typename phoenix::as_actor<H>::type,
+                    typename phoenix::as_actor<I>::type
+                >
+            >
+            operator()(
+                A const &a, B const &b, C const &c, D const &d, E const &e,
+                F const &f, G const &g, H const &h, I const &i
+            ) const
+            {
+                typedef typename phoenix::as_actor<A>::type a_t;
+                typedef typename phoenix::as_actor<B>::type b_t;
+                typedef typename phoenix::as_actor<C>::type c_t;
+                typedef typename phoenix::as_actor<D>::type d_t;
+                typedef typename phoenix::as_actor<E>::type e_t;
+                typedef typename phoenix::as_actor<F>::type f_t;
+                typedef typename phoenix::as_actor<G>::type g_t;
+                typedef typename phoenix::as_actor<H>::type h_t;
+                typedef typename phoenix::as_actor<I>::type i_t;
+                typedef phoenix::tuple<
+                            a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t
+                        > actor_tuple_t;
+
+                return init_closure_parser<DerivedT2, actor_tuple_t>(
+                        aux_derived(),
+                        actor_tuple_t(
+                            phoenix::as_actor<A>::convert(a),
+                            phoenix::as_actor<B>::convert(b),
+                            phoenix::as_actor<C>::convert(c),
+                            phoenix::as_actor<D>::convert(d),
+                            phoenix::as_actor<E>::convert(e),
+                            phoenix::as_actor<F>::convert(f),
+                            phoenix::as_actor<G>::convert(g),
+                            phoenix::as_actor<H>::convert(h),
+                            phoenix::as_actor<I>::convert(i)
+                        )
+                    );
+            }
+
+    #if BOOST_SPIRIT_CLOSURE_LIMIT > 9
+
+            template <
+                typename A, typename B, typename C, typename D, typename E,
+                typename F, typename G, typename H, typename I, typename J
+            >
+            init_closure_parser<
+                DerivedT2,
+                phoenix::tuple<
+                    typename phoenix::as_actor<A>::type,
+                    typename phoenix::as_actor<B>::type,
+                    typename phoenix::as_actor<C>::type,
+                    typename phoenix::as_actor<D>::type,
+                    typename phoenix::as_actor<E>::type,
+                    typename phoenix::as_actor<F>::type,
+                    typename phoenix::as_actor<G>::type,
+                    typename phoenix::as_actor<H>::type,
+                    typename phoenix::as_actor<I>::type,
+                    typename phoenix::as_actor<J>::type
+                >
+            >
+            operator()(
+                A const &a, B const &b, C const &c, D const &d, E const &e,
+                F const &f, G const &g, H const &h, I const &i, J const &j
+            ) const
+            {
+                typedef typename phoenix::as_actor<A>::type a_t;
+                typedef typename phoenix::as_actor<B>::type b_t;
+                typedef typename phoenix::as_actor<C>::type c_t;
+                typedef typename phoenix::as_actor<D>::type d_t;
+                typedef typename phoenix::as_actor<E>::type e_t;
+                typedef typename phoenix::as_actor<F>::type f_t;
+                typedef typename phoenix::as_actor<G>::type g_t;
+                typedef typename phoenix::as_actor<H>::type h_t;
+                typedef typename phoenix::as_actor<I>::type i_t;
+                typedef typename phoenix::as_actor<J>::type j_t;
+                typedef phoenix::tuple<
+                            a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t
+                        > actor_tuple_t;
+
+                return init_closure_parser<DerivedT2, actor_tuple_t>(
+                        aux_derived(),
+                        actor_tuple_t(
+                            phoenix::as_actor<A>::convert(a),
+                            phoenix::as_actor<B>::convert(b),
+                            phoenix::as_actor<C>::convert(c),
+                            phoenix::as_actor<D>::convert(d),
+                            phoenix::as_actor<E>::convert(e),
+                            phoenix::as_actor<F>::convert(f),
+                            phoenix::as_actor<G>::convert(g),
+                            phoenix::as_actor<H>::convert(h),
+                            phoenix::as_actor<I>::convert(i),
+                            phoenix::as_actor<J>::convert(j)
+                        )
+                    );
+            }
+
+            template <
+                typename A, typename B, typename C, typename D, typename E,
+                typename F, typename G, typename H, typename I, typename J,
+                typename K
+            >
+            init_closure_parser<
+                DerivedT2,
+                phoenix::tuple<
+                    typename phoenix::as_actor<A>::type,
+                    typename phoenix::as_actor<B>::type,
+                    typename phoenix::as_actor<C>::type,
+                    typename phoenix::as_actor<D>::type,
+                    typename phoenix::as_actor<E>::type,
+                    typename phoenix::as_actor<F>::type,
+                    typename phoenix::as_actor<G>::type,
+                    typename phoenix::as_actor<H>::type,
+                    typename phoenix::as_actor<I>::type,
+                    typename phoenix::as_actor<J>::type,
+                    typename phoenix::as_actor<K>::type
+                >
+            >
+            operator()(
+                A const &a, B const &b, C const &c, D const &d, E const &e,
+                F const &f, G const &g, H const &h, I const &i, J const &j,
+                K const &k
+            ) const
+            {
+                typedef typename phoenix::as_actor<A>::type a_t;
+                typedef typename phoenix::as_actor<B>::type b_t;
+                typedef typename phoenix::as_actor<C>::type c_t;
+                typedef typename phoenix::as_actor<D>::type d_t;
+                typedef typename phoenix::as_actor<E>::type e_t;
+                typedef typename phoenix::as_actor<F>::type f_t;
+                typedef typename phoenix::as_actor<G>::type g_t;
+                typedef typename phoenix::as_actor<H>::type h_t;
+                typedef typename phoenix::as_actor<I>::type i_t;
+                typedef typename phoenix::as_actor<J>::type j_t;
+                typedef typename phoenix::as_actor<K>::type k_t;
+                typedef phoenix::tuple<
+                            a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t,
+                            k_t
+                        > actor_tuple_t;
+
+                return init_closure_parser<DerivedT2, actor_tuple_t>(
+                        aux_derived(),
+                        actor_tuple_t(
+                            phoenix::as_actor<A>::convert(a),
+                            phoenix::as_actor<B>::convert(b),
+                            phoenix::as_actor<C>::convert(c),
+                            phoenix::as_actor<D>::convert(d),
+                            phoenix::as_actor<E>::convert(e),
+                            phoenix::as_actor<F>::convert(f),
+                            phoenix::as_actor<G>::convert(g),
+                            phoenix::as_actor<H>::convert(h),
+                            phoenix::as_actor<I>::convert(i),
+                            phoenix::as_actor<J>::convert(j),
+                            phoenix::as_actor<K>::convert(k)
+                        )
+                    );
+            }
+
+            template <
+                typename A, typename B, typename C, typename D, typename E,
+                typename F, typename G, typename H, typename I, typename J,
+                typename K, typename L
+            >
+            init_closure_parser<
+                DerivedT2,
+                phoenix::tuple<
+                    typename phoenix::as_actor<A>::type,
+                    typename phoenix::as_actor<B>::type,
+                    typename phoenix::as_actor<C>::type,
+                    typename phoenix::as_actor<D>::type,
+                    typename phoenix::as_actor<E>::type,
+                    typename phoenix::as_actor<F>::type,
+                    typename phoenix::as_actor<G>::type,
+                    typename phoenix::as_actor<H>::type,
+                    typename phoenix::as_actor<I>::type,
+                    typename phoenix::as_actor<J>::type,
+                    typename phoenix::as_actor<K>::type,
+                    typename phoenix::as_actor<L>::type
+                >
+            >
+            operator()(
+                A const &a, B const &b, C const &c, D const &d, E const &e,
+                F const &f, G const &g, H const &h, I const &i, J const &j,
+                K const &k, L const &l
+            ) const
+            {
+                typedef typename phoenix::as_actor<A>::type a_t;
+                typedef typename phoenix::as_actor<B>::type b_t;
+                typedef typename phoenix::as_actor<C>::type c_t;
+                typedef typename phoenix::as_actor<D>::type d_t;
+                typedef typename phoenix::as_actor<E>::type e_t;
+                typedef typename phoenix::as_actor<F>::type f_t;
+                typedef typename phoenix::as_actor<G>::type g_t;
+                typedef typename phoenix::as_actor<H>::type h_t;
+                typedef typename phoenix::as_actor<I>::type i_t;
+                typedef typename phoenix::as_actor<J>::type j_t;
+                typedef typename phoenix::as_actor<K>::type k_t;
+                typedef typename phoenix::as_actor<L>::type l_t;
+                typedef phoenix::tuple<
+                            a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t,
+                            k_t, l_t
+                        > actor_tuple_t;
+
+                return init_closure_parser<DerivedT2, actor_tuple_t>(
+                        aux_derived(),
+                        actor_tuple_t(
+                            phoenix::as_actor<A>::convert(a),
+                            phoenix::as_actor<B>::convert(b),
+                            phoenix::as_actor<C>::convert(c),
+                            phoenix::as_actor<D>::convert(d),
+                            phoenix::as_actor<E>::convert(e),
+                            phoenix::as_actor<F>::convert(f),
+                            phoenix::as_actor<G>::convert(g),
+                            phoenix::as_actor<H>::convert(h),
+                            phoenix::as_actor<I>::convert(i),
+                            phoenix::as_actor<J>::convert(j),
+                            phoenix::as_actor<K>::convert(k),
+                            phoenix::as_actor<L>::convert(l)
+                        )
+                    );
+            }
+
+    #if BOOST_SPIRIT_CLOSURE_LIMIT > 12
+
+            template <
+                typename A, typename B, typename C, typename D, typename E,
+                typename F, typename G, typename H, typename I, typename J,
+                typename K, typename L, typename M
+            >
+            init_closure_parser<
+                DerivedT2,
+                phoenix::tuple<
+                    typename phoenix::as_actor<A>::type,
+                    typename phoenix::as_actor<B>::type,
+                    typename phoenix::as_actor<C>::type,
+                    typename phoenix::as_actor<D>::type,
+                    typename phoenix::as_actor<E>::type,
+                    typename phoenix::as_actor<F>::type,
+                    typename phoenix::as_actor<G>::type,
+                    typename phoenix::as_actor<H>::type,
+                    typename phoenix::as_actor<I>::type,
+                    typename phoenix::as_actor<J>::type,
+                    typename phoenix::as_actor<K>::type,
+                    typename phoenix::as_actor<L>::type,
+                    typename phoenix::as_actor<M>::type
+                >
+            >
+            operator()(
+                A const &a, B const &b, C const &c, D const &d, E const &e,
+                F const &f, G const &g, H const &h, I const &i, J const &j,
+                K const &k, L const &l, M const &m
+            ) const
+            {
+                typedef typename phoenix::as_actor<A>::type a_t;
+                typedef typename phoenix::as_actor<B>::type b_t;
+                typedef typename phoenix::as_actor<C>::type c_t;
+                typedef typename phoenix::as_actor<D>::type d_t;
+                typedef typename phoenix::as_actor<E>::type e_t;
+                typedef typename phoenix::as_actor<F>::type f_t;
+                typedef typename phoenix::as_actor<G>::type g_t;
+                typedef typename phoenix::as_actor<H>::type h_t;
+                typedef typename phoenix::as_actor<I>::type i_t;
+                typedef typename phoenix::as_actor<J>::type j_t;
+                typedef typename phoenix::as_actor<K>::type k_t;
+                typedef typename phoenix::as_actor<L>::type l_t;
+                typedef typename phoenix::as_actor<M>::type m_t;
+                typedef phoenix::tuple<
+                            a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t,
+                            k_t, l_t, m_t
+                        > actor_tuple_t;
+
+                return init_closure_parser<DerivedT2, actor_tuple_t>(
+                        aux_derived(),
+                        actor_tuple_t(
+                            phoenix::as_actor<A>::convert(a),
+                            phoenix::as_actor<B>::convert(b),
+                            phoenix::as_actor<C>::convert(c),
+                            phoenix::as_actor<D>::convert(d),
+                            phoenix::as_actor<E>::convert(e),
+                            phoenix::as_actor<F>::convert(f),
+                            phoenix::as_actor<G>::convert(g),
+                            phoenix::as_actor<H>::convert(h),
+                            phoenix::as_actor<I>::convert(i),
+                            phoenix::as_actor<J>::convert(j),
+                            phoenix::as_actor<K>::convert(k),
+                            phoenix::as_actor<L>::convert(l),
+                            phoenix::as_actor<M>::convert(m)
+                        )
+                    );
+            }
+
+            template <
+                typename A, typename B, typename C, typename D, typename E,
+                typename F, typename G, typename H, typename I, typename J,
+                typename K, typename L, typename M, typename N
+            >
+            init_closure_parser<
+                DerivedT2,
+                phoenix::tuple<
+                    typename phoenix::as_actor<A>::type,
+                    typename phoenix::as_actor<B>::type,
+                    typename phoenix::as_actor<C>::type,
+                    typename phoenix::as_actor<D>::type,
+                    typename phoenix::as_actor<E>::type,
+                    typename phoenix::as_actor<F>::type,
+                    typename phoenix::as_actor<G>::type,
+                    typename phoenix::as_actor<H>::type,
+                    typename phoenix::as_actor<I>::type,
+                    typename phoenix::as_actor<J>::type,
+                    typename phoenix::as_actor<K>::type,
+                    typename phoenix::as_actor<L>::type,
+                    typename phoenix::as_actor<M>::type,
+                    typename phoenix::as_actor<N>::type
+                >
+            >
+            operator()(
+                A const &a, B const &b, C const &c, D const &d, E const &e,
+                F const &f, G const &g, H const &h, I const &i, J const &j,
+                K const &k, L const &l, M const &m, N const &n
+            ) const
+            {
+                typedef typename phoenix::as_actor<A>::type a_t;
+                typedef typename phoenix::as_actor<B>::type b_t;
+                typedef typename phoenix::as_actor<C>::type c_t;
+                typedef typename phoenix::as_actor<D>::type d_t;
+                typedef typename phoenix::as_actor<E>::type e_t;
+                typedef typename phoenix::as_actor<F>::type f_t;
+                typedef typename phoenix::as_actor<G>::type g_t;
+                typedef typename phoenix::as_actor<H>::type h_t;
+                typedef typename phoenix::as_actor<I>::type i_t;
+                typedef typename phoenix::as_actor<J>::type j_t;
+                typedef typename phoenix::as_actor<K>::type k_t;
+                typedef typename phoenix::as_actor<L>::type l_t;
+                typedef typename phoenix::as_actor<M>::type m_t;
+                typedef typename phoenix::as_actor<N>::type n_t;
+                typedef phoenix::tuple<
+                            a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t,
+                            k_t, l_t, m_t, n_t
+                        > actor_tuple_t;
+
+                return init_closure_parser<DerivedT2, actor_tuple_t>(
+                        aux_derived(),
+                        actor_tuple_t(
+                            phoenix::as_actor<A>::convert(a),
+                            phoenix::as_actor<B>::convert(b),
+                            phoenix::as_actor<C>::convert(c),
+                            phoenix::as_actor<D>::convert(d),
+                            phoenix::as_actor<E>::convert(e),
+                            phoenix::as_actor<F>::convert(f),
+                            phoenix::as_actor<G>::convert(g),
+                            phoenix::as_actor<H>::convert(h),
+                            phoenix::as_actor<I>::convert(i),
+                            phoenix::as_actor<J>::convert(j),
+                            phoenix::as_actor<K>::convert(k),
+                            phoenix::as_actor<L>::convert(l),
+                            phoenix::as_actor<M>::convert(m),
+                            phoenix::as_actor<N>::convert(n)
+                        )
+                    );
+            }
+
+            template <
+                typename A, typename B, typename C, typename D, typename E,
+                typename F, typename G, typename H, typename I, typename J,
+                typename K, typename L, typename M, typename N, typename O
+            >
+            init_closure_parser<
+                DerivedT2,
+                phoenix::tuple<
+                    typename phoenix::as_actor<A>::type,
+                    typename phoenix::as_actor<B>::type,
+                    typename phoenix::as_actor<C>::type,
+                    typename phoenix::as_actor<D>::type,
+                    typename phoenix::as_actor<E>::type,
+                    typename phoenix::as_actor<F>::type,
+                    typename phoenix::as_actor<G>::type,
+                    typename phoenix::as_actor<H>::type,
+                    typename phoenix::as_actor<I>::type,
+                    typename phoenix::as_actor<J>::type,
+                    typename phoenix::as_actor<K>::type,
+                    typename phoenix::as_actor<L>::type,
+                    typename phoenix::as_actor<M>::type,
+                    typename phoenix::as_actor<N>::type,
+                    typename phoenix::as_actor<O>::type
+                >
+            >
+            operator()(
+                A const &a, B const &b, C const &c, D const &d, E const &e,
+                F const &f, G const &g, H const &h, I const &i, J const &j,
+                K const &k, L const &l, M const &m, N const &n, O const &o
+            ) const
+            {
+                typedef typename phoenix::as_actor<A>::type a_t;
+                typedef typename phoenix::as_actor<B>::type b_t;
+                typedef typename phoenix::as_actor<C>::type c_t;
+                typedef typename phoenix::as_actor<D>::type d_t;
+                typedef typename phoenix::as_actor<E>::type e_t;
+                typedef typename phoenix::as_actor<F>::type f_t;
+                typedef typename phoenix::as_actor<G>::type g_t;
+                typedef typename phoenix::as_actor<H>::type h_t;
+                typedef typename phoenix::as_actor<I>::type i_t;
+                typedef typename phoenix::as_actor<J>::type j_t;
+                typedef typename phoenix::as_actor<K>::type k_t;
+                typedef typename phoenix::as_actor<L>::type l_t;
+                typedef typename phoenix::as_actor<M>::type m_t;
+                typedef typename phoenix::as_actor<N>::type n_t;
+                typedef typename phoenix::as_actor<O>::type o_t;
+                typedef phoenix::tuple<
+                            a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t,
+                            k_t, l_t, m_t, n_t, o_t
+                        > actor_tuple_t;
+
+                return init_closure_parser<DerivedT2, actor_tuple_t>(
+                        aux_derived(),
+                        actor_tuple_t(
+                            phoenix::as_actor<A>::convert(a),
+                            phoenix::as_actor<B>::convert(b),
+                            phoenix::as_actor<C>::convert(c),
+                            phoenix::as_actor<D>::convert(d),
+                            phoenix::as_actor<E>::convert(e),
+                            phoenix::as_actor<F>::convert(f),
+                            phoenix::as_actor<G>::convert(g),
+                            phoenix::as_actor<H>::convert(h),
+                            phoenix::as_actor<I>::convert(i),
+                            phoenix::as_actor<J>::convert(j),
+                            phoenix::as_actor<K>::convert(k),
+                            phoenix::as_actor<L>::convert(l),
+                            phoenix::as_actor<M>::convert(m),
+                            phoenix::as_actor<N>::convert(n),
+                            phoenix::as_actor<O>::convert(o)
+                        )
+                    );
+            }
+
+    #endif
+    #endif
+    #endif
+    #endif
+        };
+
+        ~closure() {}
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  overloads for chseq_p and str_p taking in phoenix actors
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename ActorT>
+    struct container_begin
+    {
+        typedef container_begin<ActorT> self_t;
+
+        template <typename TupleT>
+        struct result
+        {
+            typedef typename phoenix::actor_result<ActorT, TupleT>
+                ::plain_type::iterator type;
+        };
+
+        container_begin(ActorT actor_)
+        : actor(actor_) {}
+
+        template <typename TupleT>
+        typename phoenix::actor_result<self_t, TupleT>::type
+        eval(TupleT const& /*args*/) const
+        { return actor().begin(); }
+
+        ActorT actor;
+    };
+
+    template <typename ActorT>
+    struct container_end
+    {
+        typedef container_begin<ActorT> self_t;
+
+        template <typename TupleT>
+        struct result
+        {
+            typedef typename phoenix::actor_result<ActorT, TupleT>
+                ::plain_type::iterator type;
+        };
+
+        container_end(ActorT actor_)
+        : actor(actor_) {}
+
+        template <typename TupleT>
+        typename phoenix::actor_result<self_t, TupleT>::type
+        eval(TupleT const& /*args*/) const
+        { return actor().end(); }
+
+        ActorT actor;
+    };
+
+    template <typename BaseT>
+    inline f_chseq<
+        phoenix::actor<container_begin<phoenix::actor<BaseT> > >,
+        phoenix::actor<container_end<phoenix::actor<BaseT> > >
+    >
+    f_chseq_p(phoenix::actor<BaseT> const& a)
+    {
+        typedef phoenix::actor<container_begin<phoenix::actor<BaseT> > >
+            container_begin_t;
+        typedef phoenix::actor<container_end<phoenix::actor<BaseT> > >
+            container_end_t;
+        typedef f_chseq<container_begin_t, container_end_t> result_t;
+
+        return result_t(container_begin_t(a), container_end_t(a));
+    }
+
+    template <typename BaseT>
+    inline f_strlit<
+        phoenix::actor<container_begin<phoenix::actor<BaseT> > >,
+        phoenix::actor<container_end<phoenix::actor<BaseT> > >
+    >
+    f_str_p(phoenix::actor<BaseT> const& a)
+    {
+        typedef phoenix::actor<container_begin<phoenix::actor<BaseT> > >
+            container_begin_t;
+        typedef phoenix::actor<container_end<phoenix::actor<BaseT> > >
+            container_end_t;
+        typedef f_strlit<container_begin_t, container_end_t> result_t;
+
+        return result_t(container_begin_t(a), container_end_t(a));
+    }
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/boost/spirit/attribute/closure_context.hpp b/boost/boost/spirit/attribute/closure_context.hpp
new file mode 100644 (file)
index 0000000..ff46228
--- /dev/null
@@ -0,0 +1,51 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Joel de Guzman
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_CLOSURE_CONTEXT_HPP)
+#define BOOST_SPIRIT_CLOSURE_CONTEXT_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+#if !defined(BOOST_SPIRIT_CLOSURE_CONTEXT_LINKER_DEFINED)
+#define BOOST_SPIRIT_CLOSURE_CONTEXT_LINKER_DEFINED
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  closure_context_linker
+//  { helper template for the closure extendability }
+//
+//      This classes can be 'overloaded' (defined elsewhere), to plug
+//      in additional functionality into the closure parsing process.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template<typename ContextT>
+struct closure_context_linker : public ContextT
+{
+    template <typename ParserT>
+    closure_context_linker(ParserT const& p)
+    : ContextT(p) {}
+
+    template <typename ParserT, typename ScannerT>
+    void pre_parse(ParserT const& p, ScannerT const& scan)
+    { ContextT::pre_parse(p, scan); }
+
+    template <typename ResultT, typename ParserT, typename ScannerT>
+    ResultT&
+    post_parse(ResultT& hit, ParserT const& p, ScannerT const& scan)
+    { return ContextT::post_parse(hit, p, scan); }
+};
+
+#endif // !defined(BOOST_SPIRIT_CLOSURE_CONTEXT_LINKER_DEFINED)
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif // BOOST_SPIRIT_CLOSURE_CONTEXT_HPP
diff --git a/boost/boost/spirit/attribute/parametric.hpp b/boost/boost/spirit/attribute/parametric.hpp
new file mode 100644 (file)
index 0000000..2e2883b
--- /dev/null
@@ -0,0 +1,140 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_PARAMETRIC_HPP
+#define BOOST_SPIRIT_PARAMETRIC_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/core/parser.hpp>
+#include <boost/spirit/core/composite/composite.hpp>
+#include <boost/spirit/core/primitives/primitives.hpp>
+
+namespace boost { namespace spirit {
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  f_chlit class [ functional version of chlit ]
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename ChGenT>
+    struct f_chlit : public char_parser<f_chlit<ChGenT> >
+    {
+        f_chlit(ChGenT chgen_)
+        : chgen(chgen_) {}
+
+        template <typename T>
+        bool test(T ch) const
+        { return ch == chgen(); }
+
+        ChGenT   chgen;
+    };
+
+    template <typename ChGenT>
+    inline f_chlit<ChGenT>
+    f_ch_p(ChGenT chgen)
+    { return f_chlit<ChGenT>(chgen); }
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  f_range class [ functional version of range ]
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename ChGenAT, typename ChGenBT>
+    struct f_range : public char_parser<f_range<ChGenAT, ChGenBT> >
+    {
+        f_range(ChGenAT first_, ChGenBT last_)
+        : first(first_), last(last_)
+        {}
+
+        template <typename T>
+        bool test(T ch) const
+        {
+            BOOST_SPIRIT_ASSERT(first() <= last());
+            return (ch >= first()) && (ch <= last());
+        }
+
+        ChGenAT first;
+        ChGenBT last;
+    };
+
+    template <typename ChGenAT, typename ChGenBT>
+    inline f_range<ChGenAT, ChGenBT>
+    f_range_p(ChGenAT first, ChGenBT last)
+    { return f_range<ChGenAT, ChGenBT>(first, last); }
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  f_chseq class [ functional version of chseq ]
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename IterGenAT, typename IterGenBT>
+    class f_chseq : public parser<f_chseq<IterGenAT, IterGenBT> >
+    {
+    public:
+
+        typedef f_chseq<IterGenAT, IterGenBT> self_t;
+
+        f_chseq(IterGenAT first_, IterGenBT last_)
+        : first(first_), last(last_) {}
+
+        template <typename ScannerT>
+        typename parser_result<self_t, ScannerT>::type
+        parse(ScannerT const& scan) const
+        {
+            typedef typename parser_result<self_t, ScannerT>::type result_t;
+            return impl::string_parser_parse<result_t>(first(), last(), scan);
+        }
+
+    private:
+
+        IterGenAT first;
+        IterGenBT last;
+    };
+
+    template <typename IterGenAT, typename IterGenBT>
+    inline f_chseq<IterGenAT, IterGenBT>
+    f_chseq_p(IterGenAT first, IterGenBT last)
+    { return f_chseq<IterGenAT, IterGenBT>(first, last); }
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  f_strlit class [ functional version of strlit ]
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename IterGenAT, typename IterGenBT>
+    class f_strlit : public parser<f_strlit<IterGenAT, IterGenBT> >
+    {
+    public:
+
+        typedef f_strlit<IterGenAT, IterGenBT> self_t;
+
+        f_strlit(IterGenAT first, IterGenBT last)
+        : seq(first, last) {}
+
+        template <typename ScannerT>
+        typename parser_result<self_t, ScannerT>::type
+        parse(ScannerT const& scan) const
+        {
+            typedef typename parser_result<self_t, ScannerT>::type result_t;
+            return impl::contiguous_parser_parse<result_t>
+                (seq, scan, scan);
+        }
+
+    private:
+
+        f_chseq<IterGenAT, IterGenBT> seq;
+    };
+
+    template <typename IterGenAT, typename IterGenBT>
+    inline f_strlit<IterGenAT, IterGenBT>
+    f_str_p(IterGenAT first, IterGenBT last)
+    { return f_strlit<IterGenAT, IterGenBT>(first, last); }
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/boost/spirit/core.hpp b/boost/boost/spirit/core.hpp
new file mode 100644 (file)
index 0000000..2bcba62
--- /dev/null
@@ -0,0 +1,74 @@
+/*=============================================================================
+    Copyright (c) 1998-2003 Joel de Guzman
+    Copyright (c) 2001-2003 Daniel Nuffer
+    Copyright (c) 2001-2003 Hartmut Kaiser
+    Copyright (c) 2002-2003 Martin Wille
+    Copyright (c) 2002 Raghavendra Satish
+    Copyright (c) 2001 Bruce Florman
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_CORE_MAIN_HPP)
+#define BOOST_SPIRIT_CORE_MAIN_HPP
+
+#include <boost/spirit/version.hpp>
+#include <boost/spirit/debug.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Spirit.Core includes
+//
+///////////////////////////////////////////////////////////////////////////////
+
+//  Spirit.Core.Kernel
+#include <boost/spirit/core/config.hpp>
+#include <boost/spirit/core/nil.hpp>
+#include <boost/spirit/core/match.hpp>
+#include <boost/spirit/core/parser.hpp>
+
+//  Spirit.Core.Primitives
+#include <boost/spirit/core/primitives/primitives.hpp>
+#include <boost/spirit/core/primitives/numerics.hpp>
+
+//  Spirit.Core.Scanner
+#include <boost/spirit/core/scanner/scanner.hpp>
+#include <boost/spirit/core/scanner/skipper.hpp>
+
+//  Spirit.Core.NonTerminal
+#include <boost/spirit/core/non_terminal/subrule.hpp>
+#include <boost/spirit/core/non_terminal/rule.hpp>
+#include <boost/spirit/core/non_terminal/grammar.hpp>
+
+//  Spirit.Core.Composite
+#include <boost/spirit/core/composite/actions.hpp>
+#include <boost/spirit/core/composite/composite.hpp>
+#include <boost/spirit/core/composite/directives.hpp>
+#include <boost/spirit/core/composite/epsilon.hpp>
+#include <boost/spirit/core/composite/sequence.hpp>
+#include <boost/spirit/core/composite/sequential_and.hpp>
+#include <boost/spirit/core/composite/sequential_or.hpp>
+#include <boost/spirit/core/composite/alternative.hpp>
+#include <boost/spirit/core/composite/difference.hpp>
+#include <boost/spirit/core/composite/intersection.hpp>
+#include <boost/spirit/core/composite/exclusive_or.hpp>
+#include <boost/spirit/core/composite/kleene_star.hpp>
+#include <boost/spirit/core/composite/positive.hpp>
+#include <boost/spirit/core/composite/optional.hpp>
+#include <boost/spirit/core/composite/list.hpp>
+#include <boost/spirit/core/composite/no_actions.hpp>
+
+//  Deprecated interface includes
+#include <boost/spirit/actor/assign_actor.hpp>
+#include <boost/spirit/actor/push_back_actor.hpp>
+
+#if defined(BOOST_SPIRIT_DEBUG)
+    //////////////////////////////////
+    #include <boost/spirit/debug/parser_names.hpp>
+
+#endif // BOOST_SPIRIT_DEBUG
+
+#endif // BOOST_SPIRIT_CORE_MAIN_HPP
+
diff --git a/boost/boost/spirit/debug.hpp b/boost/boost/spirit/debug.hpp
new file mode 100644 (file)
index 0000000..8b97ede
--- /dev/null
@@ -0,0 +1,146 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_DEBUG_MAIN_HPP)
+#define BOOST_SPIRIT_DEBUG_MAIN_HPP
+
+///////////////////////////////////////////////////////////////////////////
+#if defined(BOOST_SPIRIT_DEBUG)
+
+#include <boost/spirit/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Spirit.Debug includes and defines
+//
+///////////////////////////////////////////////////////////////////////////////
+
+    #include <iostream>
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  The BOOST_SPIRIT_DEBUG_OUT defines the stream object, which should be used
+    //  for debug diagnostics. This defaults to std::cout.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    #if !defined(BOOST_SPIRIT_DEBUG_OUT)
+    #define BOOST_SPIRIT_DEBUG_OUT std::cout
+    #endif
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  The BOOST_SPIRIT_DEBUG_PRINT_SOME constant defines the number of characters
+    //  from the stream to be printed for diagnosis. This defaults to the first
+    //  20 characters.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    #if !defined(BOOST_SPIRIT_DEBUG_PRINT_SOME)
+    #define BOOST_SPIRIT_DEBUG_PRINT_SOME 20
+    #endif
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  Additional BOOST_SPIRIT_DEBUG_FLAGS control the level of diagnostics printed
+    //  Basic constants are defined in debug/minimal.hpp.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    #define BOOST_SPIRIT_DEBUG_FLAGS_NODES        0x0001  // node diagnostics
+    #define BOOST_SPIRIT_DEBUG_FLAGS_ESCAPE_CHAR  0x0002  // escape_char_parse diagnostics
+    #define BOOST_SPIRIT_DEBUG_FLAGS_TREES        0x0004  // parse tree/ast diagnostics
+    #define BOOST_SPIRIT_DEBUG_FLAGS_CLOSURES     0x0008  // closure diagnostics
+    #define BOOST_SPIRIT_DEBUG_FLAGS_SLEX         0x8000  // slex diagnostics
+
+    #define BOOST_SPIRIT_DEBUG_FLAGS_MAX          0xFFFF  // print maximal diagnostics
+
+    #if !defined(BOOST_SPIRIT_DEBUG_FLAGS)
+    #define BOOST_SPIRIT_DEBUG_FLAGS BOOST_SPIRIT_DEBUG_FLAGS_MAX
+    #endif
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  By default all nodes are traced (even those, not registered with
+    //  BOOST_SPIRIT_DEBUG_RULE et.al. - see below). The following constant may be
+    //  used to redefine this default.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    #if !defined(BOOST_SPIRIT_DEBUG_TRACENODE)
+    #define BOOST_SPIRIT_DEBUG_TRACENODE          (true)
+    #endif // !defined(BOOST_SPIRIT_DEBUG_TRACENODE)
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  Helper macros for giving rules and subrules a name accessible through
+    //  parser_name() functions (see parser_names.hpp).
+    //
+    //  Additionally, the macros BOOST_SPIRIT_DEBUG_RULE, SPIRIT_DEBUG_NODE and
+    //  BOOST_SPIRIT_DEBUG_GRAMMAR enable/disable the tracing of the 
+    //  correspondingnode accordingly to the PP constant 
+    //  BOOST_SPIRIT_DEBUG_TRACENODE.
+    //
+    //  The macros BOOST_SPIRIT_DEBUG_TRACE_RULE, BOOST_SPIRIT_DEBUG_TRACE_NODE 
+    //  and BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR allow to specify a flag to define, 
+    //  whether the corresponding node is to be traced or not.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    #if !defined(BOOST_SPIRIT_DEBUG_RULE)
+    #define BOOST_SPIRIT_DEBUG_RULE(r)    \
+        ::boost::spirit::impl::get_node_registry().register_node(&r, #r, BOOST_SPIRIT_DEBUG_TRACENODE)
+    #endif // !defined(BOOST_SPIRIT_DEBUG_RULE)
+
+    #if !defined(BOOST_SPIRIT_DEBUG_NODE)
+    #define BOOST_SPIRIT_DEBUG_NODE(r)    \
+        ::boost::spirit::impl::get_node_registry().register_node(&r, #r, BOOST_SPIRIT_DEBUG_TRACENODE)
+    #endif // !defined(BOOST_SPIRIT_DEBUG_NODE)
+
+    #if !defined(BOOST_SPIRIT_DEBUG_GRAMMAR)
+    #define BOOST_SPIRIT_DEBUG_GRAMMAR(r)    \
+        ::boost::spirit::impl::get_node_registry().register_node(&r, #r, BOOST_SPIRIT_DEBUG_TRACENODE)
+    #endif // !defined(BOOST_SPIRIT_DEBUG_GRAMMAR)
+
+    #if !defined(BOOST_SPIRIT_DEBUG_TRACE_RULE)
+    #define BOOST_SPIRIT_DEBUG_TRACE_RULE(r, t)    \
+        ::boost::spirit::impl::get_node_registry().register_node(&r, #r, (t))
+    #endif // !defined(BOOST_SPIRIT_TRACE_RULE)
+
+    #if !defined(BOOST_SPIRIT_DEBUG_TRACE_NODE)
+    #define BOOST_SPIRIT_DEBUG_TRACE_NODE(r, t)    \
+        ::boost::spirit::impl::get_node_registry().register_node(&r, #r, (t))
+    #endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_NODE)
+
+    #if !defined(BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR)
+    #define BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR(r, t)    \
+        ::boost::spirit::impl::get_node_registry().register_node(&r, #r, (t))
+    #endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR)
+
+    #if !defined(BOOST_SPIRIT_DEBUG_TRACE_RULE_NAME)
+    #define BOOST_SPIRIT_DEBUG_TRACE_RULE_NAME(r, n, t)    \
+        ::boost::spirit::impl::get_node_registry().register_node(&r, (n), (t))
+    #endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_RULE_NAME)
+
+    #if !defined(BOOST_SPIRIT_DEBUG_TRACE_NODE_NAME)
+    #define BOOST_SPIRIT_DEBUG_TRACE_NODE_NAME(r, n, t)    \
+        ::boost::spirit::impl::get_node_registry().register_node(&r, (n), (t))
+    #endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_NODE_NAME)
+
+    #if !defined(BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR_NAME)
+    #define BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR_NAME(r, n, t)    \
+        ::boost::spirit::impl::get_node_registry().register_node(&r, (n), (t))
+    #endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR_NAME)
+
+    //////////////////////////////////
+    #include <boost/spirit/debug/debug_node.hpp>
+
+#else
+    //////////////////////////////////
+    #include <boost/spirit/debug/minimal.hpp>
+
+#endif // BOOST_SPIRIT_DEBUG
+
+#endif
+
diff --git a/boost/boost/spirit/debug/minimal.hpp b/boost/boost/spirit/debug/minimal.hpp
new file mode 100644 (file)
index 0000000..47b6c78
--- /dev/null
@@ -0,0 +1,82 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_MINIMAL_DEBUG_HPP)
+#define BOOST_SPIRIT_MINIMAL_DEBUG_HPP
+
+#if !defined(BOOST_SPIRIT_DEBUG_MAIN_HPP)
+#error "You must include boost/spirit/debug.hpp, not boost/spirit/debug/minimal.hpp"
+#endif
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Minimum debugging tools support
+//
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_SPIRIT_DEBUG_OUT)
+#define BOOST_SPIRIT_DEBUG_OUT std::cout
+#endif
+
+///////////////////////////////////////////////////////////////////////////
+//
+//  BOOST_SPIRIT_DEBUG_FLAGS controls the level of diagnostics printed
+//
+///////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_SPIRIT_DEBUG_FLAGS_NONE)
+#define BOOST_SPIRIT_DEBUG_FLAGS_NONE         0x0000  // no diagnostics at all
+#endif
+
+#if !defined(BOOST_SPIRIT_DEBUG_FLAGS_MAX)
+#define BOOST_SPIRIT_DEBUG_FLAGS_MAX          0xFFFF  // print maximal diagnostics
+#endif
+
+#if !defined(BOOST_SPIRIT_DEBUG_FLAGS)
+#define BOOST_SPIRIT_DEBUG_FLAGS SPIRIT_DEBUG_FLAGS_MAX
+#endif
+
+#if !defined(BOOST_SPIRIT_DEBUG_PRINT_SOME)
+#define BOOST_SPIRIT_DEBUG_PRINT_SOME 20
+#endif
+
+#if !defined(BOOST_SPIRIT_DEBUG_RULE)
+#define BOOST_SPIRIT_DEBUG_RULE(r)
+#endif // !defined(BOOST_SPIRIT_DEBUG_RULE)
+
+#if !defined(BOOST_SPIRIT_DEBUG_NODE)
+#define BOOST_SPIRIT_DEBUG_NODE(r)
+#endif // !defined(BOOST_SPIRIT_DEBUG_NODE)
+
+#if !defined(BOOST_SPIRIT_DEBUG_GRAMMAR)
+#define BOOST_SPIRIT_DEBUG_GRAMMAR(r)
+#endif // !defined(BOOST_SPIRIT_DEBUG_GRAMMAR)
+
+#if !defined(BOOST_SPIRIT_DEBUG_TRACE_RULE)
+#define BOOST_SPIRIT_DEBUG_TRACE_RULE(r, t)
+#endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_RULE)
+
+#if !defined(BOOST_SPIRIT_DEBUG_TRACE_NODE)
+#define BOOST_SPIRIT_DEBUG_TRACE_NODE(r, t)
+#endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_NODE)
+
+#if !defined(BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR)
+#define BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR(r, t)
+#endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR)
+
+#if !defined(BOOST_SPIRIT_DEBUG_TRACE_RULE_NAME)
+#define BOOST_SPIRIT_DEBUG_TRACE_RULE_NAME(r, n, t)
+#endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_RULE_NAME)
+
+#if !defined(BOOST_SPIRIT_DEBUG_TRACE_NODE_NAME)
+#define BOOST_SPIRIT_DEBUG_TRACE_NODE_NAME(r, n, t)
+#endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_NODE_NAME)
+
+#if !defined(BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR_NAME)
+#define BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR_NAME(r, n, t)
+#endif // !defined(BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR_NAME)
+
+#endif  // !defined(BOOST_SPIRIT_MINIMAL_DEBUG_HPP)
diff --git a/boost/boost/spirit/dynamic/if.hpp b/boost/boost/spirit/dynamic/if.hpp
new file mode 100644 (file)
index 0000000..c73d5a8
--- /dev/null
@@ -0,0 +1,224 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Joel de Guzman
+    Copyright (c) 2002 Juan Carlos Arevalo-Baeza
+    Copyright (c) 2002-2003 Martin Wille
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_IF_HPP
+#define BOOST_SPIRIT_IF_HPP
+
+#include <boost/spirit/core/parser.hpp>
+#include <boost/spirit/core/composite/composite.hpp>
+#include <boost/spirit/dynamic/impl/conditions.ipp>
+
+namespace boost { namespace spirit {
+
+    namespace impl {
+
+    //////////////////////////////////
+    // if-else-parser, holds two alternative parsers and a conditional functor
+    // that selects between them.
+    template <typename ParsableTrueT, typename ParsableFalseT, typename CondT>
+    struct if_else_parser
+        : public condition_evaluator<typename as_parser<CondT>::type>
+        , public binary
+        <
+            typename as_parser<ParsableTrueT>::type,
+            typename as_parser<ParsableFalseT>::type,
+            parser< if_else_parser<ParsableTrueT, ParsableFalseT, CondT> >
+        >
+    {
+        typedef if_else_parser<ParsableTrueT, ParsableFalseT, CondT>  self_t;
+
+        typedef as_parser<ParsableTrueT>            as_parser_true_t;
+        typedef as_parser<ParsableFalseT>           as_parser_false_t;
+        typedef typename as_parser_true_t::type     parser_true_t;
+        typedef typename as_parser_false_t::type    parser_false_t;
+        typedef as_parser<CondT>                    cond_as_parser_t;
+        typedef typename cond_as_parser_t::type     condition_t;
+
+        typedef binary<parser_true_t, parser_false_t, parser<self_t> > base_t;
+        typedef condition_evaluator<condition_t>                       eval_t;
+
+        if_else_parser
+        (
+            ParsableTrueT  const& p_true,
+            ParsableFalseT const& p_false,
+            CondT          const& cond_
+        )
+            : eval_t(cond_as_parser_t::convert(cond_))
+            , base_t
+                (
+                    as_parser_true_t::convert(p_true),
+                    as_parser_false_t::convert(p_false)
+                )
+        { }
+
+        template <typename ScannerT>
+        struct result
+        {
+            typedef typename match_result<ScannerT, nil_t>::type type;
+        };
+
+        template <typename ScannerT>
+        typename parser_result<self_t, ScannerT>::type
+        parse(ScannerT const& scan) const
+        {
+            typedef typename parser_result
+                <parser_true_t, ScannerT>::type   then_result_t;
+            typedef typename parser_result
+                <parser_false_t, ScannerT>::type  else_result_t;
+
+            typename ScannerT::iterator_t const  save(scan.first);
+
+            std::ptrdiff_t length = this->evaluate(scan);
+            if (length >= 0)
+            {
+                then_result_t then_result(this->left().parse(scan));
+                if (then_result)
+                {
+                    length += then_result.length();
+                    return scan.create_match(std::size_t(length), nil_t(), save, scan.first);
+                }
+            }
+            else
+            {
+                else_result_t else_result(this->right().parse(scan));
+                if (else_result)
+                {
+                    length = else_result.length();
+                    return scan.create_match(std::size_t(length), nil_t(), save, scan.first);
+                }
+            }
+            return scan.no_match();
+        }
+    };
+
+    //////////////////////////////////
+    // if-else-parser generator, takes the false-parser in brackets
+    // and returns the if-else-parser.
+    template <typename ParsableTrueT, typename CondT>
+    struct if_else_parser_gen
+    {
+        if_else_parser_gen(ParsableTrueT const& p_true_, CondT const& cond_)
+            : p_true(p_true_)
+            , cond(cond_) {}
+
+        template <typename ParsableFalseT>
+        if_else_parser
+        <
+            ParsableTrueT,
+            ParsableFalseT,
+            CondT
+        >
+        operator[](ParsableFalseT const& p_false) const
+        {
+            return if_else_parser<ParsableTrueT, ParsableFalseT, CondT>
+                (
+                    p_true,
+                    p_false,
+                    cond
+                );
+        }
+
+        ParsableTrueT const &p_true;
+        CondT const &cond;
+    };
+
+    //////////////////////////////////
+    // if-parser, conditionally runs a parser is a functor condition is true.
+    // If the condition is fales, it fails the parse.
+    // It can optionally become an if-else-parser through the member else_p.
+    template <typename ParsableT, typename CondT>
+    struct if_parser
+        : public condition_evaluator<typename as_parser<CondT>::type>
+        , public unary
+        <
+            typename as_parser<ParsableT>::type,
+            parser<if_parser<ParsableT, CondT> > >
+    {
+        typedef if_parser<ParsableT, CondT>           self_t;
+        typedef as_parser<ParsableT>                  as_parser_t;
+        typedef typename as_parser_t::type            parser_t;
+
+        typedef as_parser<CondT>                      cond_as_parser_t;
+        typedef typename cond_as_parser_t::type       condition_t;
+        typedef condition_evaluator<condition_t>      eval_t;
+        typedef unary<parser_t, parser<self_t> >      base_t;
+
+        if_parser(ParsableT const& p, CondT const& cond_)
+            : eval_t(cond_as_parser_t::convert(cond_))
+            , base_t(as_parser_t::convert(p))
+            , else_p(p, cond_)
+        {}
+
+        template <typename ScannerT>
+        struct result
+        {
+            typedef typename match_result<ScannerT, nil_t>::type type;
+        };
+
+        template <typename ScannerT>
+        typename parser_result<self_t, ScannerT>::type
+        parse(ScannerT const& scan) const
+        {
+            typedef typename parser_result<parser_t, ScannerT>::type t_result_t;
+            typename ScannerT::iterator_t const save(scan.first);
+
+            std::ptrdiff_t length = this->evaluate(scan);
+            if (length >= 0)
+            {
+                t_result_t then_result(this->subject().parse(scan));
+                if (then_result)
+                {
+                    length += then_result.length();
+                    return scan.create_match(std::size_t(length), nil_t(), save, scan.first);
+                }
+            }
+            return scan.empty_match();
+        }
+
+        if_else_parser_gen<ParsableT, CondT> else_p;
+    };
+
+    //////////////////////////////////
+    // if-parser generator, takes the true-parser in brackets and returns the
+    // if-parser.
+    template <typename CondT>
+    struct if_parser_gen
+    {
+        if_parser_gen(CondT const& cond_) : cond(cond_) {}
+
+        template <typename ParsableT>
+        if_parser
+        <
+            ParsableT,
+            CondT
+        >
+        operator[](ParsableT const& subject) const
+        {
+            return if_parser<ParsableT, CondT>(subject, cond);
+        }
+
+        CondT const &cond;
+    };
+
+} // namespace impl
+
+//////////////////////////////////
+// if_p function, returns "if" parser generator
+
+template <typename CondT>
+impl::if_parser_gen<CondT>
+if_p(CondT const& cond)
+{
+    return impl::if_parser_gen<CondT>(cond);
+}
+
+}} // namespace boost::spirit
+
+#endif // BOOST_SPIRIT_IF_HPP
diff --git a/boost/boost/spirit/dynamic/impl/conditions.ipp b/boost/boost/spirit/dynamic/impl/conditions.ipp
new file mode 100644 (file)
index 0000000..a2fd032
--- /dev/null
@@ -0,0 +1,100 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Martin Wille
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_CONDITIONS_IPP
+#define BOOST_SPIRIT_CONDITIONS_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/meta/parser_traits.hpp>
+#include <boost/spirit/core/composite/epsilon.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+    namespace impl {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// condition evaluation
+//
+///////////////////////////////////////////////////////////////////////////////
+    //////////////////////////////////
+    // condition_parser_selector, decides which parser to use for a condition
+    // If the template argument is a parser then that parser is used.
+    // If the template argument is a functor then a condition parser using
+    // the functor is chosen
+
+    template <typename T> struct embed_t_accessor
+    {
+        typedef typename T::embed_t type;
+    };
+
+#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300
+    template <> struct embed_t_accessor<int>
+    {
+        typedef int type;
+    };
+#endif
+
+    template <typename ConditionT>
+    struct condition_parser_selector
+    {
+        typedef
+            typename mpl::if_<
+                    is_parser<ConditionT>,
+                    ConditionT,
+                    condition_parser<ConditionT>
+                >::type
+            type;
+
+        typedef typename embed_t_accessor<type>::type embed_t;
+    };
+
+    //////////////////////////////////
+    // condition_evaluator, uses a parser to check wether a condition is met
+    // takes a parser or a functor that can be evaluated in boolean context
+    // as template parameter.
+
+    // JDG 4-15-03 refactored
+    template <typename ConditionT>
+    struct condition_evaluator
+    {
+        typedef condition_parser_selector<ConditionT>       selector_t;
+        typedef typename selector_t::type                   selected_t;
+        typedef typename selector_t::embed_t                cond_embed_t;
+
+        typedef typename boost::call_traits<cond_embed_t>::param_type
+            param_t;
+
+        condition_evaluator(param_t s) : cond(s) {}
+
+        /////////////////////////////
+        // evaluate, checks wether condition is met
+        // returns length of a match or a negative number for no-match
+        template <typename ScannerT>
+        std::ptrdiff_t
+        evaluate(ScannerT const &scan) const
+        {
+            typedef typename ScannerT::iterator_t iterator_t;
+            typedef typename parser_result<selected_t, ScannerT>::type cres_t;
+            iterator_t save(scan.first);
+            cres_t result = cond.parse(scan);
+            if (!result)            // reset the position if evaluation
+                scan.first = save;  // fails.
+            return result.length();
+        }
+
+        cond_embed_t cond;
+    };
+
+///////////////////////////////////////////////////////////////////////////////
+    } // namespace impl
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/boost/spirit/error_handling.hpp b/boost/boost/spirit/error_handling.hpp
new file mode 100644 (file)
index 0000000..3d94ca4
--- /dev/null
@@ -0,0 +1,22 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_ERROR_HANDLING_MAIN_HPP)
+#define BOOST_SPIRIT_ERROR_HANDLING_MAIN_HPP
+
+#include <boost/spirit/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Master header for Spirit.ErrorHandling
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include <boost/spirit/error_handling/exceptions.hpp>
+
+#endif // !defined(BOOST_SPIRIT_ERROR_HANDLING_MAIN_HPP)
diff --git a/boost/boost/spirit/error_handling/exceptions.hpp b/boost/boost/spirit/error_handling/exceptions.hpp
new file mode 100644 (file)
index 0000000..8a3e0da
--- /dev/null
@@ -0,0 +1,360 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_EXCEPTIONS_HPP
+#define BOOST_SPIRIT_EXCEPTIONS_HPP
+
+#include <boost/config.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/spirit/core/parser.hpp>
+#include <boost/spirit/core/composite/composite.hpp>
+#include <exception>
+
+namespace boost { namespace spirit {
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  parser_error_base class
+    //
+    //      This is the base class of parser_error (see below). This may be
+    //      used to catch any type of parser error.
+    //
+    //      This exception shouldn't propagate outside the parser. However to
+    //      avoid quirks of many platforms/implementations which fall outside
+    //      the C++ standard, we derive parser_error_base from std::exception
+    //      to allow a single catch handler to catch all exceptions.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    class parser_error_base : public std::exception
+    {
+    protected:
+
+        parser_error_base() {}
+        virtual ~parser_error_base() throw() {}
+
+    public:
+
+        parser_error_base(parser_error_base const&) {}
+        parser_error_base& operator=(parser_error_base const&)
+        {
+            return *this;
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  parser_error class
+    //
+    //      Generic parser exception class. This is the base class for all
+    //      parser exceptions. The exception holds the iterator position
+    //      where the error was encountered in its member variable "where".
+    //      The parser_error also holds information regarding the error
+    //      (error descriptor) in its member variable "descriptor".
+    //
+    //      The throw_ function creates and throws a parser_error given
+    //      an iterator and an error descriptor.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename ErrorDescrT, typename IteratorT = char const*>
+    struct parser_error : public parser_error_base
+    {
+        typedef ErrorDescrT error_descr_t;
+        typedef IteratorT iterator_t;
+
+        parser_error(IteratorT where_, ErrorDescrT descriptor_)
+        : where(where_), descriptor(descriptor_) {}
+
+        parser_error(parser_error const& rhs)
+        : where(rhs.where), descriptor(rhs.descriptor) {}
+
+        parser_error&
+        operator=(parser_error const& rhs)
+        {
+            where = rhs.where;
+            descriptor = rhs.descriptor;
+            return *this;
+        }
+
+        virtual
+        ~parser_error() throw() {}
+
+        virtual const char*
+        what() const throw()
+        {
+            return "boost::spirit::parser_error";
+        }
+
+        IteratorT where;
+        ErrorDescrT descriptor;
+    };
+
+    //////////////////////////////////
+    template <typename ErrorDescrT, typename IteratorT>
+    inline void
+    throw_(IteratorT where, ErrorDescrT descriptor)
+    {
+         boost::throw_exception(
+            parser_error<ErrorDescrT, IteratorT>(where, descriptor));
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  assertive_parser class
+    //
+    //      An assertive_parser class is a parser that throws an exception
+    //      in response to a parsing failure. The assertive_parser throws a
+    //      parser_error exception rather than returning an unsuccessful
+    //      match to signal that the parser failed to match the input.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename ErrorDescrT, typename ParserT>
+    struct assertive_parser
+    :   public unary<ParserT, parser<assertive_parser<ErrorDescrT, ParserT> > >
+    {
+        typedef assertive_parser<ErrorDescrT, ParserT>  self_t;
+        typedef unary<ParserT, parser<self_t> >         base_t;
+        typedef unary_parser_category                   parser_category_t;
+
+        assertive_parser(ParserT const& parser, ErrorDescrT descriptor)
+        : base_t(parser), descriptor(descriptor) {}
+
+        template <typename ScannerT>
+        struct result
+        {
+            typedef typename parser_result<ParserT, ScannerT>::type type;
+        };
+
+        template <typename ScannerT>
+        typename parser_result<self_t, ScannerT>::type
+        parse(ScannerT const& scan) const
+        {
+            typedef typename parser_result<ParserT, ScannerT>::type result_t;
+            typedef typename ScannerT::iterator_t iterator_t;
+
+            result_t hit = this->subject().parse(scan);
+            if (!hit)
+            {
+                throw_(scan.first, descriptor);
+            }
+            return hit;
+        }
+
+        ErrorDescrT descriptor;
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  assertion class
+    //
+    //      assertive_parsers are never instantiated directly. The assertion
+    //      class is used to indirectly create an assertive_parser object.
+    //      Before declaring the grammar, we declare some assertion objects.
+    //      Examples:
+    //
+    //          enum Errors
+    //          {
+    //              program_expected, begin_expected, end_expected
+    //          };
+    //
+    //          assertion<Errors>   expect_program(program_expected);
+    //          assertion<Errors>   expect_begin(begin_expected);
+    //          assertion<Errors>   expect_end(end_expected);
+    //
+    //      Now, we can use these assertions as wrappers around parsers:
+    //
+    //          expect_end(str_p("end"))
+    //
+    //      Take note that although the example uses enums to hold the
+    //      information regarding the error (error desccriptor), we are free
+    //      to use other types such as integers and strings. Enums are
+    //      convenient for error handlers to easily catch since C++ treats
+    //      enums as unique types.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename ErrorDescrT>
+    struct assertion
+    {
+        assertion(ErrorDescrT descriptor_)
+        : descriptor(descriptor_) {}
+
+        template <typename ParserT>
+        assertive_parser<ErrorDescrT, ParserT>
+        operator()(ParserT const& parser) const
+        {
+            return assertive_parser<ErrorDescrT, ParserT>(parser, descriptor);
+        }
+
+        ErrorDescrT descriptor;
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  error_status<T>
+    //
+    //      Where T is an attribute type compatible with the match attribute
+    //      of the fallback_parser's subject (defaults to nil_t). The class
+    //      error_status reports the result of an error handler (see
+    //      fallback_parser). result can be one of:
+    //
+    //          fail:       quit and fail (return a no_match)
+    //          retry:      attempt error recovery, possibly moving the scanner
+    //          accept:     force success returning a matching length, moving
+    //                      the scanner appropriately and returning an attribute
+    //                      value
+    //          rethrow:    rethrows the error.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T = nil_t>
+    struct error_status
+    {
+        enum result_t { fail, retry, accept, rethrow };
+
+        error_status(
+            result_t result_ = fail,
+            std::ptrdiff_t length = -1,
+            T const& value_ = T())
+        : result(result_), length(length), value(value_) {}
+
+        result_t        result;
+        std::ptrdiff_t  length;
+        T               value;
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  fallback_parser class
+    //
+    //      Handles exceptions of type parser_error<ErrorDescrT, IteratorT>
+    //      thrown somewhere inside its embedded ParserT object. The class
+    //      sets up a try block before delegating parsing to its subject.
+    //      When an exception is caught, the catch block then calls the
+    //      HandlerT object. HandlerT may be a function or a functor (with
+    //      an operator() member function) compatible with the interface:
+    //
+    //          error_status<T>
+    //          handler(ScannerT const& scan, ErrorT error);
+    //
+    //      Where scan points to the scanner state prior to parsing and error
+    //      is the error that arose (see parser_error). The handler must
+    //      return an error_status<T> object (see above).
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    namespace impl
+    {
+        template <typename RT, typename ParserT, typename ScannerT>
+        RT fallback_parser_parse(ParserT const& p, ScannerT const& scan);
+    }
+
+    template <typename ErrorDescrT, typename ParserT, typename HandlerT>
+    struct fallback_parser
+    :   public unary<ParserT,
+        parser<fallback_parser<ErrorDescrT, ParserT, HandlerT> > >
+    {
+        typedef fallback_parser<ErrorDescrT, ParserT, HandlerT>
+            self_t;
+        typedef ErrorDescrT
+            error_descr_t;
+        typedef unary<ParserT, parser<self_t> >
+            base_t;
+        typedef unary_parser_category
+            parser_category_t;
+
+        fallback_parser(ParserT const& parser, HandlerT const& handler_)
+        : base_t(parser), handler(handler_) {}
+
+        template <typename ScannerT>
+        struct result
+        {
+            typedef typename parser_result<ParserT, ScannerT>::type type;
+        };
+
+        template <typename ScannerT>
+        typename parser_result<self_t, ScannerT>::type
+        parse(ScannerT const& scan) const
+        {
+            typedef typename parser_result<self_t, ScannerT>::type result_t;
+            return impl::fallback_parser_parse<result_t>(*this, scan);
+        }
+
+        HandlerT handler;
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  guard class
+    //
+    //      fallback_parser objects are not instantiated directly. The guard
+    //      class is used to indirectly create a fallback_parser object.
+    //      guards are typically predeclared just like assertions (see the
+    //      assertion class above; the example extends the previous example
+    //      introduced in the assertion class above):
+    //
+    //          guard<Errors>   my_guard;
+    //
+    //      Errors, in this example is the error descriptor type we want to
+    //      detect; This is essentially the ErrorDescrT template parameter
+    //      of the fallback_parser class.
+    //
+    //      my_guard may now be used in a grammar declaration as:
+    //
+    //          my_guard(p)[h]
+    //
+    //      where p is a parser, h is a function or functor compatible with
+    //      fallback_parser's HandlerT (see above).
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename ErrorDescrT>
+    struct guard;
+
+    template <typename ErrorDescrT, typename ParserT>
+    struct guard_gen : public unary<ParserT, nil_t>
+    {
+        typedef guard<ErrorDescrT>      parser_generator_t;
+        typedef unary_parser_category   parser_category_t;
+
+        guard_gen(ParserT const& p)
+        : unary<ParserT, nil_t>(p) {}
+
+        template <typename HandlerT>
+        fallback_parser<ErrorDescrT, ParserT, HandlerT>
+        operator[](HandlerT const& handler) const
+        {
+            return fallback_parser<ErrorDescrT, ParserT, HandlerT>
+                (this->subject(), handler);
+        }
+    };
+
+    template <typename ErrorDescrT>
+    struct guard
+    {
+        template <typename ParserT>
+        struct result
+        {
+            typedef guard_gen<ErrorDescrT, ParserT> type;
+        };
+
+        template <typename ParserT>
+        static guard_gen<ErrorDescrT, ParserT>
+        generate(ParserT const& parser)
+        {
+            return guard_gen<ErrorDescrT, ParserT>(parser);
+        }
+
+        template <typename ParserT>
+        guard_gen<ErrorDescrT, ParserT>
+        operator()(ParserT const& parser) const
+        {
+            return guard_gen<ErrorDescrT, ParserT>(parser);
+        }
+    };
+
+}} // namespace boost::spirit
+
+#include <boost/spirit/error_handling/impl/exceptions.ipp>
+#endif
+
diff --git a/boost/boost/spirit/error_handling/impl/exceptions.ipp b/boost/boost/spirit/error_handling/impl/exceptions.ipp
new file mode 100644 (file)
index 0000000..e1a871b
--- /dev/null
@@ -0,0 +1,85 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_EXCEPTIONS_IPP
+#define BOOST_SPIRIT_EXCEPTIONS_IPP
+
+namespace boost { namespace spirit { namespace impl {
+
+#ifdef __BORLANDC__
+    template <typename ParserT, typename ScannerT>
+    typename parser_result<ParserT, ScannerT>::type
+    fallback_parser_helper(ParserT const& subject, ScannerT const& scan);
+#endif
+
+    template <typename RT, typename ParserT, typename ScannerT>
+    RT fallback_parser_parse(ParserT const& p, ScannerT const& scan)
+    {
+        typedef typename ScannerT::iterator_t iterator_t;
+        typedef typename RT::attr_t attr_t;
+        typedef error_status<attr_t> error_status_t;
+        typedef typename ParserT::error_descr_t error_descr_t;
+
+        iterator_t save = scan.first;
+        error_status_t hr(error_status_t::retry);
+
+        while (hr.result == error_status_t::retry)
+        {
+            try
+            {
+            #ifndef __BORLANDC__
+                return p.subject().parse(scan);
+            #else
+                return impl::fallback_parser_helper(p, scan);
+            #endif
+            }
+
+            catch (parser_error<error_descr_t, iterator_t>& error)
+            {
+                scan.first = save;
+                hr = p.handler(scan, error);
+                switch (hr.result)
+                {
+                    case error_status_t::fail:
+                        return scan.no_match();
+                    case error_status_t::accept:
+                        return scan.create_match
+                            (std::size_t(hr.length), hr.value, save, scan.first);
+                    case error_status_t::rethrow:
+                         boost::throw_exception(error);
+                    default:
+                        continue;
+                }
+            }
+        }
+        return scan.no_match();
+    }
+
+///////////////////////////////////////////////////////////////////////////
+//
+//  Borland does not like calling the subject directly in the try block.
+//  Removing the #ifdef __BORLANDC__ code makes Borland complain that
+//  some variables and types cannot be found in the catch block. Weird!
+//
+///////////////////////////////////////////////////////////////////////////
+#ifdef __BORLANDC__
+
+    template <typename ParserT, typename ScannerT>
+    typename parser_result<ParserT, ScannerT>::type
+    fallback_parser_helper(ParserT const& p, ScannerT const& scan)
+    {
+        return p.subject().parse(scan);
+    }
+
+#endif
+
+}}} // namespace boost::spirit::impl
+
+///////////////////////////////////////////////////////////////////////////////
+#endif
+
diff --git a/boost/boost/spirit/iterator.hpp b/boost/boost/spirit/iterator.hpp
new file mode 100644 (file)
index 0000000..b0719c1
--- /dev/null
@@ -0,0 +1,26 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Daniel Nuffer
+    Copyright (c) 2003 Giovanni Bajo
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_ITERATOR_MAIN_HPP)
+#define BOOST_SPIRIT_ITERATOR_MAIN_HPP
+
+#include <boost/spirit/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Master header for Spirit.Iterators
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include <boost/spirit/iterator/file_iterator.hpp>
+#include <boost/spirit/iterator/fixed_size_queue.hpp>
+#include <boost/spirit/iterator/position_iterator.hpp>
+#include <boost/spirit/iterator/multi_pass.hpp>
+
+#endif // !defined(BOOST_SPIRIT_ITERATOR_MAIN_HPP)
diff --git a/boost/boost/spirit/iterator/file_iterator.hpp b/boost/boost/spirit/iterator/file_iterator.hpp
new file mode 100644 (file)
index 0000000..0cad0e2
--- /dev/null
@@ -0,0 +1,238 @@
+/*=============================================================================
+    Copyright (c) 2003 Giovanni Bajo
+    Copyright (c) 2003 Thomas Witt
+    Copyright (c) 2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  File Iterator structure
+//
+//  The new structure is designed on layers. The top class (used by the user)
+//  is file_iterator, which implements a full random access iterator through
+//  the file, and some specific member functions (constructor that opens
+//  the file, make_end() to generate the end iterator, operator bool to check
+//  if the file was opened correctly).
+//
+//  file_iterator implements the random access iterator interface by the means
+//  of boost::iterator_adaptor, that is inhering an object created with it.
+//  iterator_adaptor gets a low-level file iterator implementation (with just
+//  a few member functions) and a policy (that basically describes to it how
+//  the low-level file iterator interface is). The advantage is that
+//  with boost::iterator_adaptor only 5 functions are needed to implement
+//  a fully conformant random access iterator, instead of dozens of functions
+//  and operators.
+//
+//  There are two low-level file iterators implemented in this module. The
+//  first (std_file_iterator) uses cstdio stream functions (fopen/fread), which
+//  support full buffering, and is available everywhere (it's standard C++).
+//  The second (mmap_file_iterator) is currently available only on Windows
+//  platforms, and uses memory mapped files, which gives a decent speed boost.
+//
+///////////////////////////////////////////////////////////////////////////////
+//
+//  TODO LIST:
+//
+//  - In the Win32 mmap iterator, we could check if keeping a handle to the
+//    opened file is really required. If it's not, we can just store the file
+//    length (for make_end()) and save performance. Notice that this should be
+//    tested under different Windows versions, the behaviour might change.
+//  - Add some error support (by the means of some exceptions) in case of
+//    low-level I/O failure.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_SPIRIT_FILE_ITERATOR_HPP
+#define BOOST_SPIRIT_FILE_ITERATOR_HPP
+
+#include <string>
+#include <boost/config.hpp>
+#include <boost/iterator_adaptors.hpp>
+#include <boost/spirit/core/safe_bool.hpp>
+
+#if !defined(BOOST_SPIRIT_FILEITERATOR_STD)
+#  if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) \
+      && !defined(BOOST_DISABLE_WIN32)
+#    define BOOST_SPIRIT_FILEITERATOR_WINDOWS
+#  elif defined(BOOST_HAS_UNISTD_H)
+extern "C"
+{
+#    include <unistd.h>
+}
+#    ifdef _POSIX_MAPPED_FILES
+#      define BOOST_SPIRIT_FILEITERATOR_POSIX
+#    endif // _POSIX_MAPPED_FILES
+#  endif // BOOST_HAS_UNISTD_H
+
+#  if !defined(BOOST_SPIRIT_FILEITERATOR_WINDOWS) && \
+      !defined(BOOST_SPIRIT_FILEITERATOR_POSIX)
+#    define BOOST_SPIRIT_FILEITERATOR_STD
+#  endif
+#endif // BOOST_SPIRIT_FILEITERATOR_STD
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+namespace fileiter_impl {
+
+    // Forward declarations
+    template <typename CharT = char>
+    class std_file_iterator;
+
+#if !defined(BOOST_SPIRIT_FILEITERATOR_STD)
+    template <typename CharT = char>
+    class mmap_file_iterator;
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+}   // namespace fileiter_impl
+
+template <
+    typename CharT = char,
+    typename BaseIterator =
+#ifndef BOOST_SPIRIT_FILEITERATOR_WINDOWS
+        fileiter_impl::std_file_iterator<CharT>
+#else
+        fileiter_impl::mmap_file_iterator<CharT>
+#endif
+> class file_iterator;
+
+///////////////////////////////////////////////////////////////////////////////
+namespace fileiter_impl {
+
+    /////////////////////////////////////////////////////////////////////////
+    //
+    //  file_iter_generator
+    //
+    //  Template meta-function to invoke boost::iterator_adaptor
+    //  NOTE: This cannot be moved into the implementation file because of
+    //  a bug of MSVC 7.0 and previous versions (base classes types are
+    //  looked up at compilation time, not instantion types, and
+    //  file_iterator would break).
+    //
+    /////////////////////////////////////////////////////////////////////////
+
+#if !defined(BOOST_ITERATOR_ADAPTORS_VERSION) || \
+     BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+#error "Please use at least Boost V1.31.0 while compiling the file_iterator class!"
+#else // BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+
+    template <typename CharT, typename BaseIteratorT>
+    struct file_iter_generator
+    {
+    public:
+        typedef BaseIteratorT adapted_t;
+        typedef typename adapted_t::value_type value_type;
+
+        typedef boost::iterator_adaptor <
+            file_iterator<CharT, BaseIteratorT>,
+            adapted_t,
+            value_type const,
+            std::random_access_iterator_tag,
+            boost::use_default,
+            signed long
+        > type;
+    };
+
+#endif // BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+
+///////////////////////////////////////////////////////////////////////////////
+} /* namespace impl */
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  file_iterator
+//
+//  Iterates through an opened file.
+//
+//  The main iterator interface is implemented by the iterator_adaptors
+//  library, which wraps a conforming iterator interface around the
+//  impl::BaseIterator class. This class merely derives the iterator_adaptors
+//  generated class to implement the custom constructors and make_end()
+//  member function.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template<typename CharT, typename BaseIteratorT>
+class file_iterator
+    : public fileiter_impl::file_iter_generator<CharT, BaseIteratorT>::type,
+      public safe_bool<file_iterator<CharT, BaseIteratorT> >
+{
+private:
+    typedef typename
+        fileiter_impl::file_iter_generator<CharT, BaseIteratorT>::type
+        base_t;
+    typedef typename
+        fileiter_impl::file_iter_generator<CharT, BaseIteratorT>::adapted_t
+        adapted_t;
+
+public:
+    file_iterator()
+    {}
+
+    file_iterator(std::string fileName)
+    :   base_t(adapted_t(fileName))
+    {}
+
+    file_iterator(const base_t& iter)
+    :   base_t(iter)
+    {}
+
+    inline file_iterator& operator=(const base_t& iter);
+    file_iterator make_end(void);
+
+    // operator bool. This borrows a trick from boost::shared_ptr to avoid
+    //   to interfere with arithmetic operations.
+    bool operator_bool(void) const
+    { return this->base(); }
+
+private:
+    friend class ::boost::iterator_core_access;
+
+    typename base_t::reference dereference() const
+    {
+        return this->base_reference().get_cur_char();
+    }
+
+    void increment()
+    {
+        this->base_reference().next_char();
+    }
+
+    void decrement()
+    {
+        this->base_reference().prev_char();
+    }
+
+    void advance(typename base_t::difference_type n)
+    {
+        this->base_reference().advance(n);
+    }
+
+    template <
+        typename OtherDerivedT, typename OtherIteratorT,
+        typename V, typename C, typename R, typename D
+    >
+    typename base_t::difference_type distance_to(
+        iterator_adaptor<OtherDerivedT, OtherIteratorT, V, C, R, D>
+        const &x) const
+    {
+        return x.base().distance(this->base_reference());
+    }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+}} /* namespace boost::spirit */
+
+///////////////////////////////////////////////////////////////////////////////
+#include "impl/file_iterator.ipp"  /* implementation */
+
+#endif /* BOOST_SPIRIT_FILE_ITERATOR_HPP */
+
diff --git a/boost/boost/spirit/iterator/fixed_size_queue.hpp b/boost/boost/spirit/iterator/fixed_size_queue.hpp
new file mode 100644 (file)
index 0000000..9f18b42
--- /dev/null
@@ -0,0 +1,398 @@
+/*=============================================================================
+    Copyright (c) 2001, Daniel C. Nuffer
+    Copyright (c) 2003, Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef FIXED_SIZE_QUEUE
+#define FIXED_SIZE_QUEUE
+
+#include <cstdlib>
+#include <iterator>
+#include <cstddef>
+
+#include <boost/spirit/core/assert.hpp> // for BOOST_SPIRIT_ASSERT
+
+// FIXES for broken compilers
+#include <boost/config.hpp>
+#include <boost/iterator_adaptors.hpp>
+
+#define BOOST_SPIRIT_ASSERT_FSQ_SIZE \
+    BOOST_SPIRIT_ASSERT(((m_tail + N + 1) - m_head) % (N+1) == m_size % (N+1)) \
+    /**/
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+namespace impl {
+
+#if !defined(BOOST_ITERATOR_ADAPTORS_VERSION) || \
+    BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+#error "Please use at least Boost V1.31.0 while compiling the fixed_size_queue class!"
+#else // BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+
+template <typename QueueT, typename T, typename PointerT>
+class fsq_iterator
+:   public boost::iterator_adaptor<
+        fsq_iterator<QueueT, T, PointerT>, 
+        PointerT,
+        T,
+        std::random_access_iterator_tag
+    >
+{
+public:
+    typedef typename QueueT::position_t position;
+    typedef boost::iterator_adaptor<
+            fsq_iterator<QueueT, T, PointerT>, PointerT, T,
+            std::random_access_iterator_tag
+        > base_t;
+
+    fsq_iterator() {}
+    fsq_iterator(position const &p_) : p(p_) {}
+    
+    position const &get_position() const { return p; }
+    
+private:
+    friend class boost::iterator_core_access;
+    
+    typename base_t::reference dereference() const
+    {
+        return p.self->m_queue[p.pos];
+    }
+
+    void increment()
+    {
+        ++p.pos;
+        if (p.pos == QueueT::MAX_SIZE+1)
+            p.pos = 0;
+    }
+
+    void decrement()
+    {
+        if (p.pos == 0)
+            p.pos = QueueT::MAX_SIZE;
+        else
+            --p.pos;
+    }
+
+    template <
+        typename OtherDerivedT, typename OtherIteratorT, 
+        typename V, typename C, typename R, typename D
+    >   
+    bool equal(iterator_adaptor<OtherDerivedT, OtherIteratorT, V, C, R, D> 
+        const &x) const
+    {
+        position const &rhs_pos = 
+            static_cast<OtherDerivedT const &>(x).get_position();
+        return (p.self == rhs_pos.self) && (p.pos == rhs_pos.pos);
+    }
+
+    template <
+        typename OtherDerivedT, typename OtherIteratorT, 
+        typename V, typename C, typename R, typename D
+    >   
+    typename base_t::difference_type distance_to(
+        iterator_adaptor<OtherDerivedT, OtherIteratorT, V, C, R, D> 
+        const &x) const
+    {
+        typedef typename base_t::difference_type diff_t;
+
+        position const &p2 = 
+            static_cast<OtherDerivedT const &>(x).get_position();
+        std::size_t pos1 = p.pos;
+        std::size_t pos2 = p2.pos;
+
+        // Undefined behaviour if the iterators come from different
+        //  containers
+        BOOST_SPIRIT_ASSERT(p.self == p2.self);
+
+        if (pos1 < p.self->m_head)
+            pos1 += QueueT::MAX_SIZE;
+        if (pos2 < p2.self->m_head)
+            pos2 += QueueT::MAX_SIZE;
+
+        if (pos2 > pos1)
+            return diff_t(pos2 - pos1);
+        else
+            return -diff_t(pos1 - pos2);
+    }
+
+    void advance(typename base_t::difference_type n)
+    {
+        // Notice that we don't care values of n that can
+        //  wrap around more than one time, since it would
+        //  be undefined behaviour anyway (going outside
+        //  the begin/end range). Negative wrapping is a bit
+        //  cumbersome because we don't want to case p.pos
+        //  to signed.
+        if (n < 0)
+        {
+            n = -n;
+            if (p.pos < (std::size_t)n)
+                p.pos = QueueT::MAX_SIZE+1 - (n - p.pos);
+            else
+                p.pos -= n;
+        }
+        else
+        {
+            p.pos += n;
+            if (p.pos >= QueueT::MAX_SIZE+1)
+                p.pos -= QueueT::MAX_SIZE+1;
+        }
+    }
+    
+private:
+    position p;
+};
+
+#endif // BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+
+///////////////////////////////////////////////////////////////////////////////
+} /* namespace impl */
+
+template <typename T, std::size_t N>
+class fixed_size_queue
+{
+private:
+    struct position
+    {
+        fixed_size_queue* self;
+        std::size_t pos;
+
+        position() : self(0), pos(0) {}
+
+        // The const_cast here is just to avoid to have two different
+        //  position structures for the const and non-const case.
+        // The const semantic is guaranteed by the iterator itself
+        position(const fixed_size_queue* s, std::size_t p)
+            : self(const_cast<fixed_size_queue*>(s)), pos(p)
+        {}
+    };
+
+public:
+    // Declare the iterators
+    typedef impl::fsq_iterator<fixed_size_queue<T, N>, T, T*> iterator;
+    typedef impl::fsq_iterator<fixed_size_queue<T, N>, T const, T const*> 
+        const_iterator;
+    typedef position position_t;
+
+    friend class impl::fsq_iterator<fixed_size_queue<T, N>, T, T*>;
+    friend class impl::fsq_iterator<fixed_size_queue<T, N>, T const, T const*>;
+    
+    fixed_size_queue();
+    fixed_size_queue(const fixed_size_queue& x);
+    fixed_size_queue& operator=(const fixed_size_queue& x);
+    ~fixed_size_queue();
+
+    void push_back(const T& e);
+    void push_front(const T& e);
+    void serve(T& e);
+    void pop_front();
+
+    bool empty() const
+    {
+        return m_size == 0;
+    }
+
+    bool full() const
+    {
+        return m_size == N;
+    }
+
+    iterator begin()
+    {
+        return iterator(position(this, m_head));
+    }
+
+    const_iterator begin() const
+    {
+        return const_iterator(position(this, m_head));
+    }
+
+    iterator end()
+    {
+        return iterator(position(this, m_tail));
+    }
+
+    const_iterator end() const
+    {
+        return const_iterator(position(this, m_tail));
+    }
+
+    std::size_t size() const
+    {
+        return m_size;
+    }
+
+    T& front()
+    {
+        return m_queue[m_head];
+    }
+
+    const T& front() const
+    {
+        return m_queue[m_head];
+    }
+
+private:
+    // Redefine the template parameters to avoid using partial template
+    //  specialization on the iterator policy to extract N.
+    BOOST_STATIC_CONSTANT(std::size_t, MAX_SIZE = N);
+
+    std::size_t m_head;
+    std::size_t m_tail;
+    std::size_t m_size;
+    T m_queue[N+1];
+};
+
+template <typename T, std::size_t N>
+inline
+fixed_size_queue<T, N>::fixed_size_queue()
+    : m_head(0)
+    , m_tail(0)
+    , m_size(0)
+{
+    BOOST_SPIRIT_ASSERT(m_size <= N+1);
+    BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+    BOOST_SPIRIT_ASSERT(m_head <= N+1);
+    BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+}
+
+template <typename T, std::size_t N>
+inline
+fixed_size_queue<T, N>::fixed_size_queue(const fixed_size_queue& x)
+    : m_head(x.m_head)
+    , m_tail(x.m_tail)
+    , m_size(x.m_size)
+{
+    copy(x.begin(), x.end(), begin());
+    BOOST_SPIRIT_ASSERT(m_size <= N+1);
+    BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+    BOOST_SPIRIT_ASSERT(m_head <= N+1);
+    BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+}
+
+template <typename T, std::size_t N>
+inline fixed_size_queue<T, N>&
+fixed_size_queue<T, N>::operator=(const fixed_size_queue& x)
+{
+    if (this != &x)
+    {
+        m_head = x.m_head;
+        m_tail = x.m_tail;
+        m_size = x.m_size;
+        copy(x.begin(), x.end(), begin());
+    }
+    BOOST_SPIRIT_ASSERT(m_size <= N+1);
+    BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+    BOOST_SPIRIT_ASSERT(m_head <= N+1);
+    BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+
+    return *this;
+}
+
+template <typename T, std::size_t N>
+inline
+fixed_size_queue<T, N>::~fixed_size_queue()
+{
+    BOOST_SPIRIT_ASSERT(m_size <= N+1);
+    BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+    BOOST_SPIRIT_ASSERT(m_head <= N+1);
+    BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+}
+
+template <typename T, std::size_t N>
+inline void
+fixed_size_queue<T, N>::push_back(const T& e)
+{
+    BOOST_SPIRIT_ASSERT(m_size <= N+1);
+    BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+    BOOST_SPIRIT_ASSERT(m_head <= N+1);
+    BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+
+    BOOST_SPIRIT_ASSERT(!full());
+
+    m_queue[m_tail] = e;
+    ++m_size;
+    ++m_tail;
+    if (m_tail == N+1)
+        m_tail = 0;
+
+
+    BOOST_SPIRIT_ASSERT(m_size <= N+1);
+    BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+    BOOST_SPIRIT_ASSERT(m_head <= N+1);
+    BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+}
+
+template <typename T, std::size_t N>
+inline void
+fixed_size_queue<T, N>::push_front(const T& e)
+{
+    BOOST_SPIRIT_ASSERT(m_size <= N+1);
+    BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+    BOOST_SPIRIT_ASSERT(m_head <= N+1);
+    BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+
+    BOOST_SPIRIT_ASSERT(!full());
+
+    if (m_head == 0)
+        m_head = N;
+    else
+        --m_head;
+
+    m_queue[m_head] = e;
+    ++m_size;
+
+    BOOST_SPIRIT_ASSERT(m_size <= N+1);
+    BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+    BOOST_SPIRIT_ASSERT(m_head <= N+1);
+    BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+}
+
+
+template <typename T, std::size_t N>
+inline void
+fixed_size_queue<T, N>::serve(T& e)
+{
+    BOOST_SPIRIT_ASSERT(m_size <= N+1);
+    BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+    BOOST_SPIRIT_ASSERT(m_head <= N+1);
+    BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+
+    e = m_queue[m_head];
+    pop_front();
+}
+
+
+
+template <typename T, std::size_t N>
+inline void
+fixed_size_queue<T, N>::pop_front()
+{
+    BOOST_SPIRIT_ASSERT(m_size <= N+1);
+    BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+    BOOST_SPIRIT_ASSERT(m_head <= N+1);
+    BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+
+    ++m_head;
+    if (m_head == N+1)
+        m_head = 0;
+    --m_size;
+
+    BOOST_SPIRIT_ASSERT(m_size <= N+1);
+    BOOST_SPIRIT_ASSERT_FSQ_SIZE;
+    BOOST_SPIRIT_ASSERT(m_head <= N+1);
+    BOOST_SPIRIT_ASSERT(m_tail <= N+1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#undef BOOST_SPIRIT_ASSERT_FSQ_SIZE
+
+#endif
diff --git a/boost/boost/spirit/iterator/impl/file_iterator.ipp b/boost/boost/spirit/iterator/impl/file_iterator.ipp
new file mode 100644 (file)
index 0000000..3850676
--- /dev/null
@@ -0,0 +1,459 @@
+/*=============================================================================
+    Copyright (c) 2003 Giovanni Bajo
+    Copyright (c) 2003 Martin Wille
+    Copyright (c) 2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+
+#ifndef BOOST_SPIRIT_FILE_ITERATOR_IPP
+#define BOOST_SPIRIT_FILE_ITERATOR_IPP
+
+#ifdef BOOST_SPIRIT_FILEITERATOR_WINDOWS
+#  define WIN32_LEAN_AND_MEAN
+#  include <windows.h>
+#endif
+
+#include <cstdio>
+#include <boost/shared_ptr.hpp>
+
+#ifdef BOOST_SPIRIT_FILEITERATOR_WINDOWS
+#  include <boost/type_traits/remove_pointer.hpp>
+#endif
+
+#ifdef BOOST_SPIRIT_FILEITERATOR_POSIX
+#  include <sys/types.h> // open, stat, mmap, munmap
+#  include <sys/stat.h>  // stat
+#  include <fcntl.h>     // open
+#  include <unistd.h>    // stat, mmap, munmap
+#  include <sys/mman.h>  // mmap, mmunmap
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+namespace fileiter_impl {
+
+using namespace std;
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  std_file_iterator
+//
+//  Base class that implements iteration through a file using standard C
+//  stream library (fopen and friends). This class and the following are
+//  the base components on which the iterator is built (through the
+//  iterator adaptor library).
+//
+//  The opened file stream (FILE) is held with a shared_ptr<>, whose
+//  custom deleter invokes fcose(). This makes the syntax of the class
+//  very easy, especially everything related to copying.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename CharT>
+class std_file_iterator
+{
+public:
+    typedef CharT value_type;
+
+    std_file_iterator()
+    {}
+
+    explicit std_file_iterator(std::string fileName)
+    {
+        FILE* f = fopen(fileName.c_str(), "rb");
+
+        // If the file was opened, store it into
+        //  the smart pointer.
+        if (f)
+        {
+            m_file.reset(f, fclose);
+            m_pos = 0;
+            m_eof = false;
+            update_char();
+        }
+    }
+
+    std_file_iterator(const std_file_iterator& iter)
+    { *this = iter; }
+
+    std_file_iterator& operator=(const std_file_iterator& iter)
+    {
+        m_file = iter.m_file;
+        m_curChar = iter.m_curChar;
+        m_eof = iter.m_eof;
+        m_pos = iter.m_pos;
+
+        return *this;
+    }
+
+    // Nasty bug in Comeau up to 4.3.0.1, we need explicit boolean context
+    //  for shared_ptr to evaluate correctly
+    operator bool() const
+    { return m_file ? true : false; }
+
+    bool operator==(const std_file_iterator& iter) const
+    {
+        return (m_file == iter.m_file) && (m_eof == iter.m_eof) &&
+            (m_pos == iter.m_pos);
+    }
+
+    const CharT& get_cur_char(void) const
+    {
+        return m_curChar;
+    }
+
+    void prev_char(void)
+    {
+        m_pos -= sizeof(CharT);
+        update_char();
+    }
+
+    void next_char(void)
+    {
+        m_pos += sizeof(CharT);
+        update_char();
+    }
+
+    void seek_end(void)
+    {
+        fseek(m_file.get(), 0, SEEK_END);
+        m_pos = ftell(m_file.get()) / sizeof(CharT);
+        m_eof = true;
+    }
+
+    void advance(signed long n)
+    {
+        m_pos += n * sizeof(CharT);
+        update_char();
+    }
+
+    long distance(const std_file_iterator& iter) const
+    {
+        return (long)(m_pos - iter.m_pos) / sizeof(CharT);
+    }
+
+private:
+    boost::shared_ptr<FILE> m_file;
+    std::size_t m_pos;
+    CharT m_curChar;
+    bool m_eof;
+
+    void update_char(void)
+    {
+        if ((std::size_t)ftell(m_file.get()) != m_pos)
+            fseek(m_file.get(), m_pos, SEEK_SET);
+
+        m_eof = (fread(&m_curChar, sizeof(CharT), 1, m_file.get()) < 1);
+    }
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  mmap_file_iterator
+//
+//  File iterator for memory mapped files, for now implemented on Windows and
+//  POSIX  platforms. This class has the same interface of std_file_iterator,
+//  and can be used in its place (in fact, it's the default for Windows and
+//  POSIX).
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// mmap_file_iterator, Windows version
+#ifdef BOOST_SPIRIT_FILEITERATOR_WINDOWS
+template <typename CharT>
+class mmap_file_iterator
+{
+public:
+    typedef CharT value_type;
+
+    mmap_file_iterator()
+    {}
+
+    explicit mmap_file_iterator(std::string fileName)
+    {
+        HANDLE hFile = ::CreateFileA(
+            fileName.c_str(),
+            GENERIC_READ,
+            FILE_SHARE_READ,
+            NULL,
+            OPEN_EXISTING,
+            FILE_FLAG_SEQUENTIAL_SCAN,
+            NULL
+        );
+
+        if (hFile == INVALID_HANDLE_VALUE)
+            return;
+
+        // Store the size of the file, it's used to construct
+        //  the end iterator
+        m_filesize = ::GetFileSize(hFile, NULL);
+
+        HANDLE hMap = ::CreateFileMapping(
+            hFile,
+            NULL,
+            PAGE_READONLY,
+            0, 0,
+            NULL
+        );
+
+        if (hMap == NULL)
+        {
+            ::CloseHandle(hFile);
+            return;
+        }
+
+        LPVOID pMem = ::MapViewOfFile(
+            hMap,
+            FILE_MAP_READ,
+            0, 0, 0
+        );
+
+        if (pMem == NULL)
+        {
+            ::CloseHandle(hMap);
+            ::CloseHandle(hFile);
+            return;
+        }
+
+        // We hold both the file handle and the memory pointer.
+        // We can close the hMap handle now because Windows holds internally
+        //  a reference to it since there is a view mapped.
+        ::CloseHandle(hMap);
+
+        // It seems like we can close the file handle as well (because
+        //  a reference is hold by the filemap object).
+        ::CloseHandle(hFile);
+
+        // Store the handles inside the shared_ptr (with the custom destructors)
+        m_mem.reset(static_cast<CharT*>(pMem), ::UnmapViewOfFile);
+
+        // Start of the file
+        m_curChar = m_mem.get();
+    }
+
+    mmap_file_iterator(const mmap_file_iterator& iter)
+    { *this = iter; }
+
+    mmap_file_iterator& operator=(const mmap_file_iterator& iter)
+    {
+        m_curChar = iter.m_curChar;
+        m_mem = iter.m_mem;
+        m_filesize = iter.m_filesize;
+
+        return *this;
+    }
+
+    // Nasty bug in Comeau up to 4.3.0.1, we need explicit boolean context
+    //  for shared_ptr to evaluate correctly
+    operator bool() const
+    { return m_mem ? true : false; }
+
+    bool operator==(const mmap_file_iterator& iter) const
+    { return m_curChar == iter.m_curChar; }
+
+    const CharT& get_cur_char(void) const
+    { return *m_curChar; }
+
+    void next_char(void)
+    { m_curChar++; }
+
+    void prev_char(void)
+    { m_curChar--; }
+
+    void advance(signed long n)
+    { m_curChar += n; }
+
+    long distance(const mmap_file_iterator& iter) const
+    { return m_curChar - iter.m_curChar; }
+
+    void seek_end(void)
+    {
+        m_curChar = m_mem.get() +
+            (m_filesize / sizeof(CharT));
+    }
+
+private:
+#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+    typedef boost::remove_pointer<HANDLE>::type handle_t;
+#else
+    typedef void handle_t;
+#endif
+
+    boost::shared_ptr<CharT> m_mem;
+    std::size_t m_filesize;
+    CharT* m_curChar;
+};
+
+#endif // BOOST_SPIRIT_FILEITERATOR_WINDOWS
+
+///////////////////////////////////////////////////////////////////////////////
+// mmap_file_iterator, POSIX version
+#ifdef BOOST_SPIRIT_FILEITERATOR_POSIX
+template <typename CharT>
+class mmap_file_iterator
+{
+private:
+    struct mapping
+    {
+        mapping(void *p, off_t len)
+            : data(p)
+            , size(len)
+        { }
+
+        CharT const *begin() const
+        {
+            return static_cast<CharT *>(data);
+        }
+
+        CharT const *end() const
+        {
+            return static_cast<CharT *>(data) + size/sizeof(CharT);
+        }
+
+        ~mapping()
+        {
+            munmap(data, size);
+        }
+
+    private:
+        void *data;
+        off_t size;
+    };
+
+public:
+    typedef CharT value_type;
+
+    mmap_file_iterator()
+    {}
+
+    explicit mmap_file_iterator(std::string file_name)
+    {
+        // open the file
+       int fd = open(file_name.c_str(),
+#ifdef O_NOCTTY
+            O_NOCTTY | // if stdin was closed then opening a file
+                       // would cause the file to become the controlling
+                       // terminal if the filename refers to a tty. Setting
+                       // O_NOCTTY inhibits this.
+#endif
+            O_RDONLY);
+
+        if (fd == -1)
+            return;
+
+        // call fstat to find get information about the file just
+        // opened (size and file type)
+        struct stat stat_buf;
+        if ((fstat(fd, &stat_buf) != 0) || !S_ISREG(stat_buf.st_mode))
+        {   // if fstat returns an error or if the file isn't a
+            // regular file we give up.
+            close(fd);
+            return;
+        }
+
+        // perform the actual mapping
+        void *p = mmap(0, stat_buf.st_size, PROT_READ, MAP_SHARED, fd, 0);
+        // it is safe to close() here. POSIX requires that the OS keeps a
+        // second handle to the file while the file is mmapped.
+        close(fd);
+
+        if (p == MAP_FAILED)
+            return;
+
+        mapping *m = 0;
+        try
+        {
+            m = new mapping(p, stat_buf.st_size);
+        }
+        catch(...)
+        {
+            munmap(p, stat_buf.st_size);
+            throw;
+        }
+
+        m_mem.reset(m);
+
+        // Start of the file
+        m_curChar = m_mem->begin();
+    }
+
+    mmap_file_iterator(const mmap_file_iterator& iter)
+    { *this = iter; }
+
+    mmap_file_iterator& operator=(const mmap_file_iterator& iter)
+    {
+        m_curChar = iter.m_curChar;
+        m_mem = iter.m_mem;
+
+        return *this;
+    }
+
+    // Nasty bug in Comeau up to 4.3.0.1, we need explicit boolean context
+    //  for shared_ptr to evaluate correctly
+    operator bool() const
+    { return m_mem ? true : false; }
+
+    bool operator==(const mmap_file_iterator& iter) const
+    { return m_curChar == iter.m_curChar; }
+
+    const CharT& get_cur_char(void) const
+    { return *m_curChar; }
+
+    void next_char(void)
+    { m_curChar++; }
+
+    void prev_char(void)
+    { m_curChar--; }
+
+    void advance(signed long n)
+    { m_curChar += n; }
+
+    long distance(const mmap_file_iterator& iter) const
+    { return m_curChar - iter.m_curChar; }
+
+    void seek_end(void)
+    {
+        m_curChar = m_mem->end();
+    }
+
+private:
+
+    boost::shared_ptr<mapping> m_mem;
+    CharT const* m_curChar;
+};
+
+#endif // BOOST_SPIRIT_FILEITERATOR_POSIX
+
+///////////////////////////////////////////////////////////////////////////////
+} /* namespace boost::spirit::fileiter_impl */
+
+template <typename CharT, typename BaseIteratorT>
+file_iterator<CharT,BaseIteratorT>
+file_iterator<CharT,BaseIteratorT>::make_end(void)
+{
+    file_iterator iter(*this);
+    iter.base_reference().seek_end();
+    return iter;
+}
+
+template <typename CharT, typename BaseIteratorT>
+file_iterator<CharT,BaseIteratorT>&
+file_iterator<CharT,BaseIteratorT>::operator=(const base_t& iter)
+{
+    base_t::operator=(iter);
+    return *this;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+}} /* namespace boost::spirit */
+
+
+#endif /* BOOST_SPIRIT_FILE_ITERATOR_IPP */
diff --git a/boost/boost/spirit/iterator/impl/position_iterator.ipp b/boost/boost/spirit/iterator/impl/position_iterator.ipp
new file mode 100644 (file)
index 0000000..37e1d7d
--- /dev/null
@@ -0,0 +1,131 @@
+/*=============================================================================
+    Copyright (c) 2002 Juan Carlos Arevalo-Baeza
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    Copyright (c) 2003 Giovanni Bajo
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef POSITION_ITERATOR_IPP
+#define POSITION_ITERATOR_IPP
+
+#include <boost/config.hpp>
+#include <boost/iterator_adaptors.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/spirit/core/nil.hpp>  // for nil_t
+#include <boost/detail/iterator.hpp> // for boost::detail::iterator_traits
+
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  position_policy<file_position_without_column>
+//
+//  Specialization to handle file_position_without_column. Only take care of
+//  newlines since no column tracking is needed.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <>
+class position_policy<file_position_without_column> {
+
+public:
+    void next_line(file_position_without_column& pos)
+    {
+        ++pos.line;
+    }
+
+    void set_tab_chars(unsigned int /*chars*/){}
+    void next_char(file_position_without_column& /*pos*/)    {}
+    void tabulation(file_position_without_column& /*pos*/)   {}
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  position_policy<file_position>
+//
+//  Specialization to handle file_position. Track characters and tabulation
+//  to compute the current column correctly.
+//
+//  Default tab size is 4. You can change this with the set_tabchars member
+//  of position_iterator.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <>
+class position_policy<file_position> {
+
+public:
+    position_policy()
+        : m_CharsPerTab(4)
+    {}
+
+    void next_line(file_position& pos)
+    {
+        ++pos.line;
+        pos.column = 1;
+    }
+
+    void set_tab_chars(unsigned int chars)
+    {
+        m_CharsPerTab = chars;
+    }
+
+    void next_char(file_position& pos)
+    {
+        ++pos.column;
+    }
+
+    void tabulation(file_position& pos)
+    {
+        pos.column += m_CharsPerTab - (pos.column - 1) % m_CharsPerTab;
+    }
+
+private:
+    unsigned int m_CharsPerTab;
+};
+
+/* namespace boost::spirit { */ namespace iterator_ { namespace impl {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  position_iterator_base_generator
+//
+//  Metafunction to generate the iterator type using boost::iterator_adaptors,
+//  hiding all the metaprogramming thunking code in it. It is used
+//  mainly to keep the public interface (position_iterator) cleanear.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename MainIterT, typename ForwardIterT, typename PositionT>
+struct position_iterator_base_generator
+{
+private:
+    typedef boost::detail::iterator_traits<ForwardIterT> traits;
+    typedef typename traits::value_type value_type;
+    typedef typename traits::iterator_category iter_category_t;
+
+    // Position iterator is always a non-mutable iterator
+    typedef typename boost::add_const<value_type>::type const_value_type;
+
+public:
+    // Check if the MainIterT is nil. If it's nil, it means that the actual
+    //  self type is position_iterator. Otherwise, it's a real type we
+    //  must use
+    typedef typename boost::mpl::if_<
+        typename boost::is_same<MainIterT, nil_t>::type,
+        position_iterator<ForwardIterT, PositionT, nil_t>,
+        MainIterT
+    >::type main_iter_t;
+
+    typedef boost::iterator_adaptor<
+        main_iter_t,
+        ForwardIterT,
+        const_value_type
+    > type;
+};
+
+}}}} /* namespace boost::spirit::iterator_::impl */
+
+#endif
diff --git a/boost/boost/spirit/iterator/multi_pass.hpp b/boost/boost/spirit/iterator/multi_pass.hpp
new file mode 100644 (file)
index 0000000..68397c8
--- /dev/null
@@ -0,0 +1,1302 @@
+/*=============================================================================
+    Copyright (c) 2001, Daniel C. Nuffer
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_ITERATOR_MULTI_PASS_HPP
+#define BOOST_SPIRIT_ITERATOR_MULTI_PASS_HPP
+
+#include <boost/config.hpp>
+#include <boost/throw_exception.hpp>
+#include <deque>
+#include <iterator>
+#include <iostream>
+#include <algorithm>    // for std::swap
+#include <exception>    // for std::exception
+#include <boost/limits.hpp>
+#include <boost/iterator.hpp>
+
+#include <boost/spirit/core/assert.hpp> // for BOOST_SPIRIT_ASSERT
+#include <boost/spirit/iterator/fixed_size_queue.hpp>
+#include <boost/detail/iterator.hpp> // for boost::detail::iterator_traits
+
+namespace boost { namespace spirit {
+
+namespace impl {
+    template <typename T>
+    inline void mp_swap(T& t1, T& t2);
+}
+
+namespace multi_pass_policies
+{
+
+///////////////////////////////////////////////////////////////////////////////
+// class ref_counted
+// Implementation of an OwnershipPolicy used by multi_pass.
+//
+// Implementation modified from RefCounted class from the Loki library by
+// Andrei Alexandrescu
+///////////////////////////////////////////////////////////////////////////////
+class ref_counted
+{
+    protected:
+        ref_counted()
+            : count(new std::size_t(1))
+        {}
+
+        ref_counted(ref_counted const& x)
+            : count(x.count)
+        {}
+
+        // clone is called when a copy of the iterator is made, so increment
+        // the ref-count.
+        void clone()
+        {
+            ++*count;
+        }
+
+        // called when a copy is deleted.  Decrement the ref-count.  Return
+        // value of true indicates that the last copy has been released.
+        bool release()
+        {
+            if (!--*count)
+            {
+                delete count;
+                count = 0;
+                return true;
+            }
+            return false;
+        }
+
+        void swap(ref_counted& x)
+        {
+            impl::mp_swap(count, x.count);
+        }
+
+    public:
+        // returns true if there is only one iterator in existence.
+        // std_deque StoragePolicy will free it's buffered data if this
+        // returns true.
+        bool unique() const
+        {
+            return *count == 1;
+        }
+
+    private:
+        std::size_t* count;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// class first_owner
+// Implementation of an OwnershipPolicy used by multi_pass
+// This ownership policy dictates that the first iterator created will
+// determine the lifespan of the shared components.  This works well for
+// spirit, since no dynamic allocation of iterators is done, and all copies
+// are make on the stack.
+//
+// There is a caveat about using this policy together with the std_deque
+// StoragePolicy. Since first_owner always returns false from unique(),
+// std_deque will only release the queued data if clear_queue() is called.
+///////////////////////////////////////////////////////////////////////////////
+class first_owner
+{
+    protected:
+        first_owner()
+            : first(true)
+        {}
+
+        first_owner(first_owner const&)
+            : first(false)
+        {}
+
+        void clone()
+        {
+        }
+
+        // return true to indicate deletion of resources
+        bool release()
+        {
+            return first;
+        }
+
+        void swap(first_owner&)
+        {
+            // if we're the first, we still remain the first, even if assigned
+            // to, so don't swap first_.  swap is only called from operator=
+        }
+
+    public:
+        bool unique() const
+        {
+            return false; // no way to know, so always return false
+        }
+
+    private:
+        bool first;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// class illegal_backtracking
+// thrown by buf_id_check CheckingPolicy if an instance of an iterator is
+// used after another one has invalidated the queue
+///////////////////////////////////////////////////////////////////////////////
+class illegal_backtracking : public std::exception
+{
+public:
+
+    illegal_backtracking() throw() {}
+    ~illegal_backtracking() throw() {}
+
+    virtual const char*
+    what() const throw()
+    { return "boost::spirit::illegal_backtracking"; }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// class buf_id_check
+// Implementation of the CheckingPolicy used by multi_pass
+// This policy is most effective when used together with the std_deque
+// StoragePolicy.
+// If used with the fixed_size_queue StoragePolicy, it will not detect
+// iterator derefereces that are out of the range of the queue.
+///////////////////////////////////////////////////////////////////////////////
+class buf_id_check
+{
+    protected:
+        buf_id_check()
+            : shared_buf_id(new unsigned long(0))
+            , buf_id(0)
+        {}
+
+        buf_id_check(buf_id_check const& x)
+            : shared_buf_id(x.shared_buf_id)
+            , buf_id(x.buf_id)
+        {}
+
+        // will be called from the destructor of the last iterator.
+        void destroy()
+        {
+            delete shared_buf_id;
+            shared_buf_id = 0;
+        }
+
+        void swap(buf_id_check& x)
+        {
+            impl::mp_swap(shared_buf_id, x.shared_buf_id);
+            impl::mp_swap(buf_id, x.buf_id);
+        }
+
+        // called to verify that everything is okay.
+        void check() const
+        {
+            if (buf_id != *shared_buf_id)
+            {
+                boost::throw_exception(illegal_backtracking());
+            }
+        }
+
+        // called from multi_pass::clear_queue, so we can increment the count
+        void clear_queue()
+        {
+            ++*shared_buf_id;
+            ++buf_id;
+        }
+
+    private:
+        unsigned long* shared_buf_id;
+        unsigned long buf_id;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// class no_check
+// Implementation of the CheckingPolicy used by multi_pass
+// It does not do anything :-)
+///////////////////////////////////////////////////////////////////////////////
+class no_check
+{
+    protected:
+        no_check() {}
+        no_check(no_check const&) {}
+        void destroy() {}
+        void swap(no_check&) {}
+        void check() const {}
+        void clear_queue() {}
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// class std_deque
+// Implementation of the StoragePolicy used by multi_pass
+// This stores all data in a std::deque, and keeps an offset to the current
+// position. It stores all the data unless there is only one
+// iterator using the queue.
+// Note: a position is used instead of an iterator, because a push_back on
+// a deque can invalidate any iterators.
+///////////////////////////////////////////////////////////////////////////////
+class std_deque
+{
+    public:
+
+template <typename ValueT>
+class inner
+{
+    private:
+
+        typedef std::deque<ValueT> queue_type;
+        queue_type* queuedElements;
+        mutable typename queue_type::size_type queuePosition;
+
+    protected:
+        inner()
+            : queuedElements(new queue_type)
+            , queuePosition(0)
+        {}
+
+        inner(inner const& x)
+            : queuedElements(x.queuedElements)
+            , queuePosition(x.queuePosition)
+        {}
+
+        // will be called from the destructor of the last iterator.
+        void destroy()
+        {
+            BOOST_SPIRIT_ASSERT(queuedElements);
+            delete queuedElements;
+            queuedElements = 0;
+        }
+
+        void swap(inner& x)
+        {
+            impl::mp_swap(queuedElements, x.queuedElements);
+            impl::mp_swap(queuePosition, x.queuePosition);
+        }
+
+        // This is called when the iterator is dereferenced.  It's a template
+        // method so we can recover the type of the multi_pass iterator
+        // and call unique and access the m_input data member.
+        template <typename MultiPassT>
+        static typename MultiPassT::reference dereference(MultiPassT const& mp)
+        {
+            if (mp.queuePosition == mp.queuedElements->size())
+            {
+                // check if this is the only iterator
+                if (mp.unique())
+                {
+                    // free up the memory used by the queue.
+                    if (mp.queuedElements->size() > 0)
+                    {
+                        mp.queuedElements->clear();
+                        mp.queuePosition = 0;
+                    }
+                }
+                return mp.get_input();
+            }
+            else
+            {
+                return (*mp.queuedElements)[mp.queuePosition];
+            }
+        }
+
+        // This is called when the iterator is incremented.  It's a template
+        // method so we can recover the type of the multi_pass iterator
+        // and call unique and access the m_input data member.
+        template <typename MultiPassT>
+        static void increment(MultiPassT& mp)
+        {
+            if (mp.queuePosition == mp.queuedElements->size())
+            {
+                // check if this is the only iterator
+                if (mp.unique())
+                {
+                    // free up the memory used by the queue.
+                    if (mp.queuedElements->size() > 0)
+                    {
+                        mp.queuedElements->clear();
+                        mp.queuePosition = 0;
+                    }
+                }
+                else
+                {
+                    mp.queuedElements->push_back(mp.get_input());
+                    ++mp.queuePosition;
+                }
+                mp.advance_input();
+            }
+            else
+            {
+                ++mp.queuePosition;
+            }
+
+        }
+
+        // called to forcibly clear the queue
+        void clear_queue()
+        {
+            queuedElements->clear();
+            queuePosition = 0;
+        }
+
+        // called to determine whether the iterator is an eof iterator
+        template <typename MultiPassT>
+        static bool is_eof(MultiPassT const& mp)
+        {
+            return mp.queuePosition == mp.queuedElements->size() &&
+                mp.input_at_eof();
+        }
+
+        // called by operator==
+        bool equal_to(inner const& x) const
+        {
+            return queuePosition == x.queuePosition;
+        }
+
+        // called by operator<
+        bool less_than(inner const& x) const
+        {
+            return queuePosition < x.queuePosition;
+        }
+}; // class inner
+
+}; // class std_deque
+
+
+///////////////////////////////////////////////////////////////////////////////
+// class fixed_size_queue
+// Implementation of the StoragePolicy used by multi_pass
+// fixed_size_queue keeps a circular buffer (implemented by
+// boost::spirit::fixed_size_queue class) that is size N+1 and stores N elements.
+// It is up to the user to ensure that there is enough look ahead for their
+// grammar.  Currently there is no way to tell if an iterator is pointing
+// to forgotten data.  The leading iterator will put an item in the queue
+// and remove one when it is incremented.  No dynamic allocation is done,
+// except on creation of the queue (fixed_size_queue constructor).
+///////////////////////////////////////////////////////////////////////////////
+template < std::size_t N>
+class fixed_size_queue
+{
+    public:
+
+template <typename ValueT>
+class inner
+{
+    private:
+
+        typedef boost::spirit::fixed_size_queue<ValueT, N> queue_type;
+        queue_type * queuedElements;
+        mutable typename queue_type::iterator queuePosition;
+
+    protected:
+        inner()
+            : queuedElements(new queue_type)
+            , queuePosition(queuedElements->begin())
+        {}
+
+        inner(inner const& x)
+            : queuedElements(x.queuedElements)
+            , queuePosition(x.queuePosition)
+        {}
+
+        // will be called from the destructor of the last iterator.
+        void destroy()
+        {
+            BOOST_SPIRIT_ASSERT(queuedElements);
+            delete queuedElements;
+            queuedElements = 0;
+        }
+
+        void swap(inner& x)
+        {
+            impl::mp_swap(queuedElements, x.queuedElements);
+            impl::mp_swap(queuePosition, x.queuePosition);
+        }
+
+        // This is called when the iterator is dereferenced.  It's a template
+        // method so we can recover the type of the multi_pass iterator
+        // and access the m_input data member.
+        template <typename MultiPassT>
+        static typename MultiPassT::reference dereference(MultiPassT const& mp)
+        {
+            if (mp.queuePosition == mp.queuedElements->end())
+            {
+                return mp.get_input();
+            }
+            else
+            {
+                return *mp.queuePosition;
+            }
+        }
+
+        // This is called when the iterator is incremented.  It's a template
+        // method so we can recover the type of the multi_pass iterator
+        // and access the m_input data member.
+        template <typename MultiPassT>
+        static void increment(MultiPassT& mp)
+        {
+            if (mp.queuePosition == mp.queuedElements->end())
+            {
+                // don't let the queue get larger than N
+                if (mp.queuedElements->size() >= N)
+                    mp.queuedElements->pop_front();
+
+                mp.queuedElements->push_back(mp.get_input());
+                mp.advance_input();
+            }
+            ++mp.queuePosition;
+        }
+
+        // no-op
+        void clear_queue()
+        {}
+
+        // called to determine whether the iterator is an eof iterator
+        template <typename MultiPassT>
+        static bool is_eof(MultiPassT const& mp)
+        {
+            return mp.queuePosition == mp.queuedElements->end() &&
+                mp.input_at_eof();
+        }
+
+        // called by operator==
+        bool equal_to(inner const& x) const
+        {
+            return queuePosition == x.queuePosition;
+        }
+
+        // called by operator<
+        bool less_than(inner const& x) const
+        {
+            return queuePosition < x.queuePosition;
+        }
+}; // class inner
+
+}; // class fixed_size_queue
+
+
+///////////////////////////////////////////////////////////////////////////////
+// class input_iterator
+// Implementation of the InputPolicy used by multi_pass
+// input_iterator encapsulates an input iterator of type InputT
+///////////////////////////////////////////////////////////////////////////////
+class input_iterator
+{
+    public:
+
+template <typename InputT>
+class inner
+{
+        typedef
+            typename boost::detail::iterator_traits<InputT>::value_type
+            result_type;
+
+        struct Data {
+            Data(InputT const &input_) 
+            :   input(input_), was_initialized(false)
+            {}
+            
+            InputT input;
+            result_type curtok;
+            bool was_initialized;
+        };
+
+    public:
+        typedef result_type value_type;
+        typedef
+            typename boost::detail::iterator_traits<InputT>::difference_type
+            difference_type;
+        typedef
+            typename boost::detail::iterator_traits<InputT>::pointer
+            pointer;
+        typedef
+            typename boost::detail::iterator_traits<InputT>::reference
+            reference;
+
+    protected:
+        inner()
+            : data(0)
+        {}
+
+        inner(InputT x)
+            : data(new Data(x))
+        {}
+
+        inner(inner const& x)
+            : data(x.data)
+        {}
+
+        void destroy()
+        {
+            delete data;
+            data = 0;
+        }
+
+        bool same_input(inner const& x) const
+        {
+            return data == x.data;
+        }
+
+        typedef
+            typename boost::detail::iterator_traits<InputT>::value_type
+            value_t;
+        void swap(inner& x)
+        {
+            impl::mp_swap(data, x.data);
+        }
+
+        void ensure_initialized() const
+        {
+            if (data && !data->was_initialized) {
+                data->curtok = *data->input;      // get the first token
+                data->was_initialized = true;
+            }
+        }
+
+    public:
+        reference get_input() const
+        {
+            BOOST_SPIRIT_ASSERT(0 != data);
+            ensure_initialized();
+            return data->curtok;
+        }
+
+        void advance_input()
+        {
+            BOOST_SPIRIT_ASSERT(0 != data);
+            data->was_initialized = false;        // should get the next token
+            ++data->input;
+        }
+
+        bool input_at_eof() const
+        {
+            return !data || data->input == InputT();
+        }
+
+    private:
+        Data *data;
+};
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// class lex_input
+// Implementation of the InputPolicy used by multi_pass
+// lex_input gets tokens (ints) from yylex()
+///////////////////////////////////////////////////////////////////////////////
+class lex_input
+{
+    public:
+
+template <typename InputT>
+class inner
+{
+    public:
+        typedef int value_type;
+    typedef std::ptrdiff_t difference_type;
+        typedef int* pointer;
+        typedef int& reference;
+
+    protected:
+        inner()
+            : curtok(new int(0))
+        {}
+
+        inner(InputT x)
+            : curtok(new int(x))
+        {}
+
+        inner(inner const& x)
+            : curtok(x.curtok)
+        {}
+
+        void destroy()
+        {
+            delete curtok;
+            curtok = 0;
+        }
+
+        bool same_input(inner const& x) const
+        {
+            return curtok == x.curtok;
+        }
+
+        void swap(inner& x)
+        {
+            impl::mp_swap(curtok, x.curtok);
+        }
+
+    public:
+        reference get_input() const
+        {
+            return *curtok;
+        }
+
+        void advance_input()
+        {
+            extern int yylex();
+            *curtok = yylex();
+        }
+
+        bool input_at_eof() const
+        {
+            return *curtok == 0;
+        }
+
+    private:
+        int* curtok;
+
+};
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// class functor_input
+// Implementation of the InputPolicy used by multi_pass
+// functor_input gets tokens from a functor
+// Note: the functor must have a typedef for result_type
+// It also must have a static variable of type result_type defined to
+// represent eof that is called eof.
+///////////////////////////////////////////////////////////////////////////////
+class functor_input
+{
+    public:
+
+template <typename FunctorT>
+class inner
+{
+    typedef typename FunctorT::result_type result_type;
+    public:
+        typedef result_type value_type;
+    typedef std::ptrdiff_t difference_type;
+        typedef result_type* pointer;
+        typedef result_type& reference;
+
+    protected:
+        inner()
+            : ftor(0)
+            , curtok(0)
+        {}
+
+        inner(FunctorT const& x)
+            : ftor(new FunctorT(x))
+            , curtok(new result_type((*ftor)()))
+        {}
+
+        inner(inner const& x)
+            : ftor(x.ftor)
+            , curtok(x.curtok)
+        {}
+
+        void destroy()
+        {
+            delete ftor;
+            ftor = 0;
+            delete curtok;
+            curtok = 0;
+        }
+
+        bool same_input(inner const& x) const
+        {
+            return ftor == x.ftor;
+        }
+
+        void swap(inner& x)
+        {
+            impl::mp_swap(curtok, x.curtok);
+            impl::mp_swap(ftor, x.ftor);
+        }
+
+    public:
+        reference get_input() const
+        {
+            return *curtok;
+        }
+
+        void advance_input()
+        {
+            if (curtok) {
+                *curtok = (*ftor)();
+            }
+        }
+
+        bool input_at_eof() const
+        {
+            return !curtok || *curtok == ftor->eof;
+        }
+
+        FunctorT& get_functor() const
+        {
+            return *ftor;
+        }
+
+
+    private:
+        FunctorT* ftor;
+        result_type* curtok;
+
+};
+
+};
+
+} // namespace multi_pass_policies
+
+///////////////////////////////////////////////////////////////////////////////
+// iterator_base_creator
+///////////////////////////////////////////////////////////////////////////////
+
+namespace iterator_ { namespace impl {
+
+// Meta-function to generate a std::iterator<> base class for multi_pass. This
+//  is used mainly to improve conformance of compilers not supporting PTS
+//  and thus relying on inheritance to recognize an iterator.
+// We are using boost::iterator<> because it offers an automatic workaround
+//  for broken std::iterator<> implementations.
+template <typename InputPolicyT, typename InputT>
+struct iterator_base_creator
+{
+    typedef typename InputPolicyT::BOOST_NESTED_TEMPLATE inner<InputT> input_t;
+
+    typedef boost::iterator
+    <
+        std::forward_iterator_tag,
+        typename input_t::value_type,
+        typename input_t::difference_type,
+        typename input_t::pointer,
+        typename input_t::reference
+    > type;
+};
+
+}}
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+// class template multi_pass (declaration)
+///////////////////////////////////////////////////////////////////////////////
+template
+<
+    typename InputT,
+    typename InputPolicy = multi_pass_policies::input_iterator,
+    typename OwnershipPolicy = multi_pass_policies::ref_counted,
+    typename CheckingPolicy = multi_pass_policies::buf_id_check,
+    typename StoragePolicy = multi_pass_policies::std_deque
+>
+class multi_pass;
+
+// The default multi_pass instantiation uses a ref-counted std_deque scheme.
+
+///////////////////////////////////////////////////////////////////////////////
+// class template multi_pass (definition)
+///////////////////////////////////////////////////////////////////////////////
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+class multi_pass
+    : public OwnershipPolicy
+    , public CheckingPolicy
+    , public StoragePolicy::template inner<
+                typename InputPolicy::template inner<InputT>::value_type>
+    , public InputPolicy::template inner<InputT>
+    , public iterator_::impl::iterator_base_creator<InputPolicy, InputT>::type
+{
+        typedef OwnershipPolicy OP;
+        typedef CheckingPolicy CHP;
+        typedef typename StoragePolicy::template inner<
+            typename InputPolicy::template inner<InputT>::value_type> SP;
+        typedef typename InputPolicy::template inner<InputT> IP;
+        typedef typename
+            iterator_::impl::iterator_base_creator<InputPolicy, InputT>::type
+            IB;
+
+    public:
+        typedef typename IB::value_type value_type;
+        typedef typename IB::difference_type difference_type;
+        typedef typename IB::reference reference;
+        typedef typename IB::pointer pointer;
+        typedef InputT iterator_type;
+
+        multi_pass();
+        explicit multi_pass(InputT input);
+
+#if BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+        multi_pass(int);
+#endif // BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+
+        ~multi_pass();
+
+        multi_pass(multi_pass const&);
+        multi_pass& operator=(multi_pass const&);
+
+        void swap(multi_pass& x);
+
+        reference operator*() const;
+        pointer operator->() const;
+        multi_pass& operator++();
+        multi_pass operator++(int);
+
+        void clear_queue();
+
+        bool operator==(const multi_pass& y) const;
+        bool operator<(const multi_pass& y) const;
+
+    private: // helper functions
+        bool is_eof() const;
+};
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+multi_pass()
+    : OP()
+    , CHP()
+    , SP()
+    , IP()
+{
+}
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+multi_pass(InputT input)
+    : OP()
+    , CHP()
+    , SP()
+    , IP(input)
+{
+}
+
+#if BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+    // The standard library shipped with gcc-3.1 has a bug in
+    // bits/basic_string.tcc. It tries  to use iter::iter(0) to
+    // construct an iterator. Ironically, this  happens in sanity
+    // checking code that isn't required by the standard.
+    // The workaround is to provide an additional constructor that
+    // ignores its int argument and behaves like the default constructor.
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+multi_pass(int)
+    : OP()
+    , CHP()
+    , SP()
+    , IP()
+{
+}
+#endif // BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+~multi_pass()
+{
+    if (OP::release())
+    {
+        CHP::destroy();
+        SP::destroy();
+        IP::destroy();
+    }
+}
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+multi_pass(
+        multi_pass const& x)
+    : OP(x)
+    , CHP(x)
+    , SP(x)
+    , IP(x)
+{
+    OP::clone();
+}
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>&
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+operator=(
+        multi_pass const& x)
+{
+    multi_pass temp(x);
+    temp.swap(*this);
+    return *this;
+}
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline void
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+swap(multi_pass& x)
+{
+    OP::swap(x);
+    CHP::swap(x);
+    SP::swap(x);
+    IP::swap(x);
+}
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline
+typename multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+reference
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+operator*() const
+{
+    CHP::check();
+    return SP::dereference(*this);
+}
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline
+typename multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+pointer
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+operator->() const
+{
+    return &(operator*());
+}
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>&
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+operator++()
+{
+    CHP::check();
+    SP::increment(*this);
+    return *this;
+}
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+operator++(int)
+{
+    multi_pass
+    <
+        InputT,
+        InputPolicy,
+        OwnershipPolicy,
+        CheckingPolicy,
+        StoragePolicy
+    > tmp(*this);
+
+    ++*this;
+
+    return tmp;
+}
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline void
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+clear_queue()
+{
+    SP::clear_queue();
+    CHP::clear_queue();
+}
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline bool
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+is_eof() const
+{
+    return SP::is_eof(*this);
+}
+
+///// Comparisons
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline bool
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+operator==(const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+        StoragePolicy>& y) const
+{
+    bool is_eof_ = SP::is_eof(*this);
+    bool y_is_eof_ = SP::is_eof(y);
+    
+    if (is_eof_ && y_is_eof_)
+    {
+        return true;  // both are EOF
+    }
+    else if (is_eof_ ^ y_is_eof_)
+    {
+        return false; // one is EOF, one isn't
+    }
+    else if (!IP::same_input(y))
+    {
+        return false;
+    }
+    else
+    {
+        return SP::equal_to(y);
+    }
+}
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline bool
+multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
+operator<(const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+        StoragePolicy>& y) const
+{
+    return SP::less_than(y);
+}
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline
+bool operator!=(
+        const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+                        StoragePolicy>& x,
+        const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+                        StoragePolicy>& y)
+{
+    return !(x == y);
+}
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline
+bool operator>(
+        const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+                        StoragePolicy>& x,
+        const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+                        StoragePolicy>& y)
+{
+    return y < x;
+}
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline
+bool operator>=(
+        const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+                        StoragePolicy>& x,
+        const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+                        StoragePolicy>& y)
+{
+    return !(x < y);
+}
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+inline
+bool operator<=(
+        const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+                        StoragePolicy>& x,
+        const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
+                        StoragePolicy>& y)
+{
+    return !(y < x);
+}
+
+///// Generator function
+template <typename InputT>
+inline multi_pass<InputT>
+make_multi_pass(InputT i)
+{
+    return multi_pass<InputT>(i);
+}
+
+// this could be a template typedef, since such a thing doesn't
+// exist in C++, we'll use inheritance to accomplish the same thing.
+
+template <typename InputT, std::size_t N>
+class look_ahead :
+    public multi_pass<
+        InputT,
+        multi_pass_policies::input_iterator,
+        multi_pass_policies::first_owner,
+        multi_pass_policies::no_check,
+        multi_pass_policies::fixed_size_queue<N> >
+{
+        typedef multi_pass<
+            InputT,
+            multi_pass_policies::input_iterator,
+            multi_pass_policies::first_owner,
+            multi_pass_policies::no_check,
+            multi_pass_policies::fixed_size_queue<N> > base_t;
+    public:
+        look_ahead()
+            : base_t() {}
+
+        explicit look_ahead(InputT x)
+            : base_t(x) {}
+
+        look_ahead(look_ahead const& x)
+            : base_t(x) {}
+
+#if BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+        look_ahead(int)         // workaround for a bug in the library
+            : base_t() {}       // shipped with gcc 3.1
+#endif // BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
+
+    // default generated operators destructor and assignment operator are okay.
+};
+
+template
+<
+    typename InputT,
+    typename InputPolicy,
+    typename OwnershipPolicy,
+    typename CheckingPolicy,
+    typename StoragePolicy
+>
+void swap(
+    multi_pass<
+        InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy
+    > &x,
+    multi_pass<
+        InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy
+    > &y)
+{
+    x.swap(y);
+}
+
+namespace impl {
+
+    template <typename T>
+    inline void mp_swap(T& t1, T& t2)
+    {
+        using std::swap;
+        using boost::spirit::swap;
+        swap(t1, t2);
+    }
+}
+
+}} // namespace boost::spirit
+
+#endif // BOOST_SPIRIT_ITERATOR_MULTI_PASS_HPP
+
+
diff --git a/boost/boost/spirit/iterator/position_iterator.hpp b/boost/boost/spirit/iterator/position_iterator.hpp
new file mode 100644 (file)
index 0000000..506b4b4
--- /dev/null
@@ -0,0 +1,432 @@
+/*=============================================================================
+    Copyright (c) 2002 Juan Carlos Arevalo-Baeza
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    Copyright (c) 2003 Giovanni Bajo
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_POSITION_ITERATOR_HPP
+#define BOOST_SPIRIT_POSITION_ITERATOR_HPP
+
+#include <string>
+#include <boost/config.hpp>
+#include <boost/concept_check.hpp>
+
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  file_position_without_column
+//
+//  A structure to hold positional information. This includes the file,
+//  and the line number
+//
+///////////////////////////////////////////////////////////////////////////////
+struct file_position_without_column {
+    std::string file;
+    int line;
+
+    file_position_without_column(std::string const& file_ = std::string(),
+                  int line_ = 1):
+        file    (file_),
+        line    (line_)
+    {}
+
+    bool operator==(const file_position_without_column& fp) const
+    { return line == fp.line && file == fp.file; }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  file_position
+//
+//  This structure holds complete file position, including file name,
+//  line and column number
+//
+///////////////////////////////////////////////////////////////////////////////
+struct file_position : public file_position_without_column {
+    int column;
+
+    file_position(std::string const& file_ = std::string(),
+                  int line_ = 1, int column_ = 1):
+        file_position_without_column (file_, line_),
+        column                       (column_)
+    {}
+
+    bool operator==(const file_position& fp) const
+    { return column == fp.column && line == fp.line && file == fp.file; }
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  position_policy<>
+//
+//  This template is the policy to handle the file position. It is specialized
+//  on the position type. Providing a custom file_position also requires
+//  providing a specialization of this class.
+//
+//  Policy interface:
+//
+//    Default constructor of the custom position class must be accessible.
+//    set_tab_chars(unsigned int chars) - Set the tabstop width
+//    next_char(PositionT& pos)  - Notify that a new character has been
+//      processed
+//    tabulation(PositionT& pos) - Notify that a tab character has been
+//      processed
+//    next_line(PositionT& pos)  - Notify that a new line delimiter has
+//      been reached.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename PositionT>
+class position_policy;
+
+
+// Forward declaration
+template <typename ForwardIteratorT, typename PositionT, typename SelfT>
+class position_iterator;
+
+///////////////////////////////////////////////////////////////////////////////
+}} /* namespace boost::spirit */
+
+
+// This must be included here for full compatibility with old MSVC
+#include "impl/position_iterator.ipp"
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  position_iterator
+//
+//  It wraps an iterator, and keeps track of the current position in the input,
+//  as it gets incremented.
+//
+//  The wrapped iterator must be at least a Forward iterator. The position
+//  iterator itself will always be a non-mutable Forward iterator.
+//
+//  In order to have begin/end iterators constructed, the end iterator must be
+//  empty constructed. Similar to what happens with stream iterators. The begin
+//  iterator must be constructed from both, the begin and end iterators of the
+//  wrapped iterator type. This is necessary to implement the lookahead of
+//  characters necessary to parse CRLF sequences.
+//
+//  In order to extract the current positional data from the iterator, you may
+//  use the get_position member function.
+//
+//  You can also use the set_position member function to reset the current
+//  position to something new.
+//
+//  The structure that holds the current position can be customized through a
+//  template parameter, and the class position_policy must be specialized
+//  on the new type to define how to handle it. Currently, it's possible
+//  to choose between the file_position and file_position_without_column
+//  (which saves some overhead if managing current column is not required).
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#if !defined(BOOST_ITERATOR_ADAPTORS_VERSION) || \
+     BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+#error "Please use at least Boost V1.31.0 while compiling the position_iterator class!"
+#else // BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Uses the newer iterator_adaptor version (should be released with
+//  Boost V1.31.0)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename ForwardIteratorT,
+    typename PositionT = file_position,
+    typename SelfT = nil_t
+>
+class position_iterator
+:   public iterator_::impl::position_iterator_base_generator<
+        SelfT,
+        ForwardIteratorT,
+        PositionT
+    >::type,
+    public position_policy<PositionT>
+{
+private:
+
+    typedef position_policy<PositionT> position_policy_t;
+    typedef typename iterator_::impl::position_iterator_base_generator<
+            SelfT,
+            ForwardIteratorT,
+            PositionT
+        >::type base_t;
+    typedef typename iterator_::impl::position_iterator_base_generator<
+            SelfT,
+            ForwardIteratorT,
+            PositionT
+        >::main_iter_t main_iter_t;
+
+public:
+
+    typedef PositionT position_t;
+
+    position_iterator()
+    :   _isend(true)
+    {}
+
+    position_iterator(
+        const ForwardIteratorT& begin,
+        const ForwardIteratorT& end)
+    :   base_t(begin), _end(end), _pos(PositionT()), _isend(begin == end)
+    {}
+
+    template <typename FileNameT>
+    position_iterator(
+        const ForwardIteratorT& begin,
+        const ForwardIteratorT& end,
+        FileNameT fileName)
+    :   base_t(begin), _end(end), _pos(PositionT(fileName)),
+        _isend(begin == end)
+    {}
+
+    template <typename FileNameT, typename LineT>
+    position_iterator(
+        const ForwardIteratorT& begin,
+        const ForwardIteratorT& end,
+        FileNameT fileName, LineT line)
+    :   base_t(begin), _end(end), _pos(PositionT(fileName, line)),
+        _isend(begin == end)
+    {}
+
+    template <typename FileNameT, typename LineT, typename ColumnT>
+    position_iterator(
+        const ForwardIteratorT& begin,
+        const ForwardIteratorT& end,
+        FileNameT fileName, LineT line, ColumnT column)
+    :   base_t(begin), _end(end), _pos(PositionT(fileName, line, column)),
+        _isend(begin == end)
+    {}
+
+    position_iterator(
+        const ForwardIteratorT& begin,
+        const ForwardIteratorT& end,
+        const PositionT& pos)
+    :   base_t(begin), _end(end), _pos(pos), _isend(begin == end)
+    {}
+
+    position_iterator(const position_iterator& iter)
+    :   base_t(iter.base()), position_policy_t(iter),
+        _end(iter._end), _pos(iter._pos), _isend(iter._isend)
+    {}
+
+    position_iterator& operator=(const position_iterator& iter)
+    {
+        base_t::operator=(iter);
+        position_policy_t::operator=(iter);
+        _end = iter._end;
+        _pos = iter._pos;
+        _isend = iter._isend;
+        return *this;
+    }
+
+    void set_position(PositionT const& newpos) { _pos = newpos; }
+    PositionT& get_position() { return _pos; }
+    PositionT const& get_position() const { return _pos; }
+
+    void set_tabchars(unsigned int chars)
+    {
+        // This function (which comes from the position_policy) has a
+        //  different name on purpose, to avoid messing with using
+        //  declarations or qualified calls to access the base template
+        //  function, which might break some compilers.
+        this->position_policy_t::set_tab_chars(chars);
+    }
+
+private:
+    friend class boost::iterator_core_access;
+
+    void increment()
+    {
+        typename base_t::reference val = *(this->base());
+        if (val == '\n' || val == '\r') {
+            ++this->base_reference();
+            if (this->base_reference() != _end) {
+                typename base_t::reference val2 = *(this->base());
+                if ((val == '\n' && val2 == '\r')
+                    || (val == '\r' && val2 == '\n'))
+                {
+                    ++this->base_reference();
+                }
+            }
+            this->next_line(_pos);
+            static_cast<main_iter_t &>(*this).newline();
+        }
+        else if (val == '\t') {
+            this->tabulation(_pos);
+            ++this->base_reference();
+        }
+        else {
+            this->next_char(_pos);
+            ++this->base_reference();
+        }
+
+        // The iterator is at the end only if it's the same
+        //  of the
+        _isend = (this->base_reference() == _end);
+    }
+
+    template <
+        typename OtherDerivedT, typename OtherIteratorT,
+        typename V, typename C, typename R, typename D
+    >
+    bool equal(iterator_adaptor<OtherDerivedT, OtherIteratorT, V, C, R, D>
+        const &x) const
+    {
+        OtherDerivedT const &rhs = static_cast<OtherDerivedT const &>(x);
+        bool x_is_end = rhs._isend;
+
+        return (_isend && x_is_end) ||
+            (!_isend && !x_is_end && this->base() == rhs.base());
+    }
+
+protected:
+
+    void newline(void)
+    {}
+
+    ForwardIteratorT _end;
+    PositionT _pos;
+    bool _isend;
+};
+
+#endif // BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  position_iterator2
+//
+//  Equivalent to position_iterator, but it is able to extract the current
+//  line into a string. This is very handy for error reports.
+//
+//  Notice that the footprint of this class is higher than position_iterator,
+//  (how much depends on how bulky the underlying iterator is), so it should
+//  be used only if necessary.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template
+<
+    typename ForwardIteratorT,
+    typename PositionT = file_position
+>
+class position_iterator2
+    : public position_iterator
+    <
+        ForwardIteratorT,
+        PositionT,
+        position_iterator2<ForwardIteratorT, PositionT>
+    >
+{
+    typedef position_iterator
+    <
+        ForwardIteratorT,
+        PositionT,
+        position_iterator2<ForwardIteratorT, PositionT> // JDG 4-15-03
+    >  base_t;
+
+public:
+    typedef typename base_t::value_type value_type;
+    typedef PositionT position_t;
+
+    position_iterator2()
+    {}
+
+    position_iterator2(
+        const ForwardIteratorT& begin,
+        const ForwardIteratorT& end):
+        base_t(begin, end),
+        _startline(begin)
+    {}
+
+    template <typename FileNameT>
+    position_iterator2(
+        const ForwardIteratorT& begin,
+        const ForwardIteratorT& end,
+        FileNameT file):
+        base_t(begin, end, file),
+        _startline(begin)
+    {}
+
+    template <typename FileNameT, typename LineT>
+    position_iterator2(
+        const ForwardIteratorT& begin,
+        const ForwardIteratorT& end,
+        FileNameT file, LineT line):
+        base_t(begin, end, file, line),
+        _startline(begin)
+    {}
+
+    template <typename FileNameT, typename LineT, typename ColumnT>
+    position_iterator2(
+        const ForwardIteratorT& begin,
+        const ForwardIteratorT& end,
+        FileNameT file, LineT line, ColumnT column):
+        base_t(begin, end, file, line, column),
+        _startline(begin)
+    {}
+
+    position_iterator2(
+        const ForwardIteratorT& begin,
+        const ForwardIteratorT& end,
+        const PositionT& pos):
+        base_t(begin, end, pos),
+        _startline(begin)
+    {}
+
+    position_iterator2(const position_iterator2& iter)
+        : base_t(iter), _startline(iter._startline)
+    {}
+
+    position_iterator2& operator=(const position_iterator2& iter)
+    {
+        base_t::operator=(iter);
+        _startline = iter._startline;
+        return *this;
+    }
+
+    ForwardIteratorT get_currentline_begin(void) const
+    { return _startline; }
+
+    ForwardIteratorT get_currentline_end(void) const
+    { return get_endline(); }
+
+    std::basic_string<value_type> get_currentline(void) const
+    {
+        return std::basic_string<value_type>
+            (get_currentline_begin(), get_currentline_end());
+    }
+
+protected:
+    ForwardIteratorT _startline;
+
+    friend class position_iterator<ForwardIteratorT, PositionT,
+        position_iterator2<ForwardIteratorT, PositionT> >;
+
+    ForwardIteratorT get_endline() const
+    {
+        ForwardIteratorT endline = _startline;
+        while (endline != this->_end && *endline != '\r' && *endline != '\n')
+        {
+            ++endline;
+        }
+        return endline;
+    }
+
+    void newline(void)
+    { _startline = this->base(); }
+};
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/boost/spirit/meta.hpp b/boost/boost/spirit/meta.hpp
new file mode 100644 (file)
index 0000000..85876f3
--- /dev/null
@@ -0,0 +1,27 @@
+/*=============================================================================
+    Copyright (c) 1998-2003 Joel de Guzman
+    Copyright (c) 2001-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_META_MAIN_HPP)
+#define BOOST_SPIRIT_META_MAIN_HPP
+
+#include <boost/spirit/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Master header for Spirit.Meta
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include <boost/spirit/meta/fundamental.hpp>
+#include <boost/spirit/meta/parser_traits.hpp>
+#include <boost/spirit/meta/as_parser.hpp>
+#include <boost/spirit/meta/traverse.hpp>
+
+#endif // BOOST_SPIRIT_CORE_MAIN_HPP
+
diff --git a/boost/boost/spirit/meta/as_parser.hpp b/boost/boost/spirit/meta/as_parser.hpp
new file mode 100644 (file)
index 0000000..53d5877
--- /dev/null
@@ -0,0 +1,109 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Joel de Guzman
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_AS_PARSER_HPP)
+#define BOOST_SPIRIT_AS_PARSER_HPP
+
+#include <boost/spirit/core/primitives/primitives.hpp>
+
+namespace boost { namespace spirit {
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  Helper templates to derive the parser type from an auxilliary type
+    //  and to generate an object of the required parser type given an
+    //  auxilliary object. Supported types to convert are parsers,
+    //  single characters and character strings.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    namespace impl
+    {
+        template<typename T>
+        struct default_as_parser
+        {
+            typedef T type;
+            static type const& convert(type const& p)
+            {
+                return p;
+            }
+        };
+
+        struct char_as_parser
+        {
+            typedef chlit<char> type;
+            static type convert(char ch)
+            {
+                return type(ch);
+            }
+        };
+
+        struct wchar_as_parser
+        {
+            typedef chlit<wchar_t> type;
+            static type convert(wchar_t ch)
+            {
+                return type(ch);
+            }
+        };
+
+        struct string_as_parser
+        {
+            typedef strlit<char const*> type;
+            static type convert(char const* str)
+            {
+                return type(str);
+            }
+        };
+
+        struct wstring_as_parser
+        {
+            typedef strlit<wchar_t const*> type;
+            static type convert(wchar_t const* str)
+            {
+                return type(str);
+            }
+        };
+    }
+
+    template<typename T>
+    struct as_parser : impl::default_as_parser<T> {};
+
+    template<>
+    struct as_parser<char> : impl::char_as_parser {};
+
+    template<>
+    struct as_parser<wchar_t> : impl::wchar_as_parser {};
+
+    template<>
+    struct as_parser<char*> : impl::string_as_parser {};
+
+    template<>
+    struct as_parser<char const*> : impl::string_as_parser {};
+
+    template<>
+    struct as_parser<wchar_t*> : impl::wstring_as_parser {};
+
+    template<>
+    struct as_parser<wchar_t const*> : impl::wstring_as_parser {};
+
+    template<int N>
+    struct as_parser<char[N]> : impl::string_as_parser {};
+
+    template<int N>
+    struct as_parser<wchar_t[N]> : impl::wstring_as_parser {};
+
+    template<int N>
+    struct as_parser<char const[N]> : impl::string_as_parser {};
+
+    template<int N>
+    struct as_parser<wchar_t const[N]> : impl::wstring_as_parser {};
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/boost/spirit/meta/fundamental.hpp b/boost/boost/spirit/meta/fundamental.hpp
new file mode 100644 (file)
index 0000000..cb0986c
--- /dev/null
@@ -0,0 +1,52 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_FUNDAMENTAL_HPP)
+#define BOOST_SPIRIT_FUNDAMENTAL_HPP
+
+#include <boost/spirit/meta/impl/fundamental.ipp>
+
+namespace boost { namespace spirit 
+{
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  Helper template for counting the number of nodes contained in a
+    //  given parser type.
+    //  All parser_category type parsers are counted as nodes.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename ParserT>
+    struct node_count {
+
+        typedef typename ParserT::parser_category_t parser_category_t;
+        typedef typename impl::nodes<parser_category_t>
+            ::template count<ParserT, mpl::int_<0> > count_t;
+
+        BOOST_STATIC_CONSTANT(int, value = count_t::value);
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  Helper template for counting the number of leaf nodes contained in a
+    //  given parser type.
+    //  Only plain_parser_category type parsers are counted as leaf nodes.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename ParserT>
+    struct leaf_count {
+
+        typedef typename ParserT::parser_category_t parser_category_t;
+        typedef typename impl::leafs<parser_category_t>
+            ::template count<ParserT, mpl::int_<0> > count_t;
+
+        BOOST_STATIC_CONSTANT(int, value = count_t::value);
+    };
+
+}} // namespace boost::spirit
+
+#endif // !defined(BOOST_SPIRIT_FUNDAMENTAL_HPP)
diff --git a/boost/boost/spirit/meta/impl/fundamental.ipp b/boost/boost/spirit/meta/impl/fundamental.ipp
new file mode 100644 (file)
index 0000000..f0b16ca
--- /dev/null
@@ -0,0 +1,305 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_FUNDAMENTAL_IPP)
+#define BOOST_SPIRIT_FUNDAMENTAL_IPP
+
+#include <boost/mpl/int.hpp>
+
+namespace boost { namespace spirit {
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300)
+    BOOST_SPIRIT_DEPENDENT_TEMPLATE_WRAPPER2(count_wrapper, count);
+#endif // defined(BOOST_MSVC) && (BOOST_MSVC <= 1300)
+
+namespace impl
+{
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  Helper template for counting the number of nodes contained in a
+    //  given parser type.
+    //  All parser_category type parsers are counted as nodes.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename CategoryT>
+    struct nodes;
+
+    template <>
+    struct nodes<plain_parser_category> {
+
+        template <typename ParserT, typename LeafCountT>
+        struct count {
+
+            // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT
+            enum { value = (LeafCountT::value + 1) };
+        };
+    };
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300)
+
+    template <>
+    struct nodes<unary_parser_category> {
+
+        template <typename ParserT, typename LeafCountT>
+        struct count {
+
+            typedef typename ParserT::subject_t             subject_t;
+            typedef typename subject_t::parser_category_t   subject_category_t;
+
+            typedef nodes<subject_category_t> nodes_t;
+            typedef typename count_wrapper<nodes_t>
+                ::template result_<subject_t, LeafCountT>    count_t;
+
+            BOOST_STATIC_CONSTANT(int, value = count_t::value + 1);
+        };
+    };
+
+    template <>
+    struct nodes<action_parser_category> {
+
+        template <typename ParserT, typename LeafCountT>
+        struct count {
+
+            typedef typename ParserT::subject_t             subject_t;
+            typedef typename subject_t::parser_category_t   subject_category_t;
+
+            typedef nodes<subject_category_t> nodes_t;
+            typedef typename count_wrapper<nodes_t>
+                ::template result_<subject_t, LeafCountT>    count_t;
+
+            BOOST_STATIC_CONSTANT(int, value = count_t::value + 1);
+        };
+    };
+
+    template <>
+    struct nodes<binary_parser_category> {
+
+        template <typename ParserT, typename LeafCountT>
+        struct count {
+
+            typedef typename ParserT::left_t                left_t;
+            typedef typename ParserT::right_t               right_t;
+            typedef typename left_t::parser_category_t      left_category_t;
+            typedef typename right_t::parser_category_t     right_category_t;
+
+            typedef nodes<left_category_t> left_nodes_t;
+            typedef typename count_wrapper<left_nodes_t>
+                ::template result_<left_t, LeafCountT>       left_count_t;
+
+            typedef nodes<right_category_t> right_nodes_t;
+            typedef typename count_wrapper<right_nodes_t>
+                ::template result_<right_t, LeafCountT>      right_count_t;
+
+            BOOST_STATIC_CONSTANT(int,
+                value = (left_count_t::value + right_count_t::value + 1));
+        };
+    };
+
+#else
+
+    template <>
+    struct nodes<unary_parser_category> {
+
+        template <typename ParserT, typename LeafCountT>
+        struct count {
+
+            typedef typename ParserT::subject_t             subject_t;
+            typedef typename subject_t::parser_category_t   subject_category_t;
+
+            // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT
+            enum { value = (nodes<subject_category_t>
+                ::template count<subject_t, LeafCountT>::value + 1) };
+        };
+    };
+
+    template <>
+    struct nodes<action_parser_category> {
+
+        template <typename ParserT, typename LeafCountT>
+        struct count {
+
+            typedef typename ParserT::subject_t             subject_t;
+            typedef typename subject_t::parser_category_t   subject_category_t;
+
+            // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT
+            enum { value = (nodes<subject_category_t>
+                ::template count<subject_t, LeafCountT>::value + 1) };
+        };
+    };
+
+    template <>
+    struct nodes<binary_parser_category> {
+
+        template <typename ParserT, typename LeafCountT>
+        struct count {
+
+            typedef typename ParserT::left_t                left_t;
+            typedef typename ParserT::right_t               right_t;
+            typedef typename left_t::parser_category_t      left_category_t;
+            typedef typename right_t::parser_category_t     right_category_t;
+
+            typedef count self_t;
+
+            // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT
+            enum {
+                leftcount = (nodes<left_category_t>
+                    ::template count<left_t, LeafCountT>::value),
+                rightcount = (nodes<right_category_t>
+                    ::template count<right_t, LeafCountT>::value),
+                value = ((self_t::leftcount) + (self_t::rightcount) + 1)
+            };
+        };
+    };
+
+#endif
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  Helper template for counting the number of leaf nodes contained in a
+    //  given parser type.
+    //  Only plain_parser_category type parsers are counted as leaf nodes.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename CategoryT>
+    struct leafs;
+
+    template <>
+    struct leafs<plain_parser_category> {
+
+        template <typename ParserT, typename LeafCountT>
+        struct count {
+
+            // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT
+            enum { value = (LeafCountT::value + 1) };
+        };
+    };
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300)
+
+    template <>
+    struct leafs<unary_parser_category> {
+
+        template <typename ParserT, typename LeafCountT>
+        struct count {
+
+            typedef typename ParserT::subject_t             subject_t;
+            typedef typename subject_t::parser_category_t   subject_category_t;
+
+            typedef leafs<subject_category_t> nodes_t;
+            typedef typename count_wrapper<nodes_t>
+                ::template result_<subject_t, LeafCountT>    count_t;
+
+            BOOST_STATIC_CONSTANT(int, value = count_t::value);
+        };
+    };
+
+    template <>
+    struct leafs<action_parser_category> {
+
+        template <typename ParserT, typename LeafCountT>
+        struct count {
+
+            typedef typename ParserT::subject_t             subject_t;
+            typedef typename subject_t::parser_category_t   subject_category_t;
+
+            typedef leafs<subject_category_t> nodes_t;
+            typedef typename count_wrapper<nodes_t>
+                ::template result_<subject_t, LeafCountT>    count_t;
+
+            BOOST_STATIC_CONSTANT(int, value = count_t::value);
+        };
+    };
+
+    template <>
+    struct leafs<binary_parser_category> {
+
+        template <typename ParserT, typename LeafCountT>
+        struct count {
+
+            typedef typename ParserT::left_t                left_t;
+            typedef typename ParserT::right_t               right_t;
+            typedef typename left_t::parser_category_t      left_category_t;
+            typedef typename right_t::parser_category_t     right_category_t;
+
+            typedef leafs<left_category_t> left_nodes_t;
+            typedef typename count_wrapper<left_nodes_t>
+                ::template result_<left_t, LeafCountT>       left_count_t;
+
+            typedef leafs<right_category_t> right_nodes_t;
+            typedef typename count_wrapper<right_nodes_t>
+                ::template result_<right_t, LeafCountT>      right_count_t;
+
+            BOOST_STATIC_CONSTANT(int,
+                value = (left_count_t::value + right_count_t::value));
+        };
+    };
+
+#else
+
+    template <>
+    struct leafs<unary_parser_category> {
+
+        template <typename ParserT, typename LeafCountT>
+        struct count {
+
+            typedef typename ParserT::subject_t             subject_t;
+            typedef typename subject_t::parser_category_t   subject_category_t;
+
+            // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT
+            enum { value = (leafs<subject_category_t>
+                ::template count<subject_t, LeafCountT>::value) };
+        };
+    };
+
+    template <>
+    struct leafs<action_parser_category> {
+
+        template <typename ParserT, typename LeafCountT>
+        struct count {
+
+            typedef typename ParserT::subject_t             subject_t;
+            typedef typename subject_t::parser_category_t   subject_category_t;
+
+            // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT
+            enum { value = (leafs<subject_category_t>
+                ::template count<subject_t, LeafCountT>::value) };
+        };
+    };
+
+    template <>
+    struct leafs<binary_parser_category> {
+
+        template <typename ParserT, typename LeafCountT>
+        struct count {
+
+            typedef typename ParserT::left_t                left_t;
+            typedef typename ParserT::right_t               right_t;
+            typedef typename left_t::parser_category_t      left_category_t;
+            typedef typename right_t::parser_category_t     right_category_t;
+
+            typedef count self_t;
+
+            // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT
+            enum {
+                leftcount = (leafs<left_category_t>
+                    ::template count<left_t, LeafCountT>::value),
+                rightcount = (leafs<right_category_t>
+                    ::template count<right_t, LeafCountT>::value),
+                value = (self_t::leftcount + self_t::rightcount)
+            };
+        };
+    };
+
+#endif
+
+}   // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif // !defined(BOOST_SPIRIT_FUNDAMENTAL_IPP)
diff --git a/boost/boost/spirit/meta/impl/parser_traits.ipp b/boost/boost/spirit/meta/impl/parser_traits.ipp
new file mode 100644 (file)
index 0000000..af210f1
--- /dev/null
@@ -0,0 +1,187 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Joel de Guzman
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    Copyright (c) 2003 Martin Wille
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_PARSER_TRAITS_IPP)
+#define BOOST_SPIRIT_PARSER_TRAITS_IPP
+
+#include <boost/spirit/core/composite/operators.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+namespace impl
+{
+
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  from spirit 1.1 (copyright (c) 2001 Bruce Florman)
+    //  various workarounds to support compile time decisions without partial
+    //  template specialization whether a given type is an instance of a
+    //  concrete parser type.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T>
+    struct parser_type_traits
+    {
+    //  Determine at compile time (without partial specialization)
+    //  whether a given type is an instance of the alternative<A,B>
+
+        static T t();
+
+        typedef struct { char dummy[1]; }   size1_t;
+        typedef struct { char dummy[2]; }   size2_t;
+        typedef struct { char dummy[3]; }   size3_t;
+        typedef struct { char dummy[4]; }   size4_t;
+        typedef struct { char dummy[5]; }   size5_t;
+        typedef struct { char dummy[6]; }   size6_t;
+        typedef struct { char dummy[7]; }   size7_t;
+        typedef struct { char dummy[8]; }   size8_t;
+        typedef struct { char dummy[9]; }   size9_t;
+        typedef struct { char dummy[10]; }  size10_t;
+
+    // the following functions need no implementation
+        template <typename A, typename B>
+        static size1_t test_(alternative<A, B> const&);
+        template <typename A, typename B>
+        static size2_t test_(sequence<A, B> const&);
+        template <typename A, typename B>
+        static size3_t test_(sequential_or<A, B> const&);
+        template <typename A, typename B>
+        static size4_t test_(intersection<A, B> const&);
+        template <typename A, typename B>
+        static size5_t test_(difference<A, B> const&);
+        template <typename A, typename B>
+        static size6_t test_(exclusive_or<A, B> const&);
+        template <typename S>
+        static size7_t test_(optional<S> const&);
+        template <typename S>
+        static size8_t test_(kleene_star<S> const&);
+        template <typename S>
+        static size9_t test_(positive<S> const&);
+
+        static size10_t test_(...);
+
+        BOOST_STATIC_CONSTANT(bool,
+            is_alternative = (sizeof(size1_t) == sizeof(test_(t()))) );
+        BOOST_STATIC_CONSTANT(bool,
+            is_sequence = (sizeof(size2_t) == sizeof(test_(t()))) );
+        BOOST_STATIC_CONSTANT(bool,
+            is_sequential_or = (sizeof(size3_t) == sizeof(test_(t()))) );
+        BOOST_STATIC_CONSTANT(bool,
+            is_intersection = (sizeof(size4_t) == sizeof(test_(t()))) );
+        BOOST_STATIC_CONSTANT(bool,
+            is_difference = (sizeof(size5_t) == sizeof(test_(t()))) );
+        BOOST_STATIC_CONSTANT(bool,
+            is_exclusive_or = (sizeof(size6_t) == sizeof(test_(t()))) );
+        BOOST_STATIC_CONSTANT(bool,
+            is_optional = (sizeof(size7_t) == sizeof(test_(t()))) );
+        BOOST_STATIC_CONSTANT(bool,
+            is_kleene_star = (sizeof(size8_t) == sizeof(test_(t()))) );
+        BOOST_STATIC_CONSTANT(bool,
+            is_positive = (sizeof(size9_t) == sizeof(test_(t()))) );
+    };
+
+#else
+
+    ///////////////////////////////////////////////////////////////////////////
+    struct parser_type_traits_base {
+
+        BOOST_STATIC_CONSTANT(bool, is_alternative = false);
+        BOOST_STATIC_CONSTANT(bool, is_sequence = false);
+        BOOST_STATIC_CONSTANT(bool, is_sequential_or = false);
+        BOOST_STATIC_CONSTANT(bool, is_intersection = false);
+        BOOST_STATIC_CONSTANT(bool, is_difference = false);
+        BOOST_STATIC_CONSTANT(bool, is_exclusive_or = false);
+        BOOST_STATIC_CONSTANT(bool, is_optional = false);
+        BOOST_STATIC_CONSTANT(bool, is_kleene_star = false);
+        BOOST_STATIC_CONSTANT(bool, is_positive = false);
+    };
+
+    template <typename ParserT>
+    struct parser_type_traits : public parser_type_traits_base {
+
+    //  no definition here, fallback for all not explicitly mentioned parser
+    //  types
+    };
+
+    template <typename A, typename B>
+    struct parser_type_traits<alternative<A, B> >
+    :   public parser_type_traits_base {
+
+        BOOST_STATIC_CONSTANT(bool, is_alternative = true);
+    };
+
+    template <typename A, typename B>
+    struct parser_type_traits<sequence<A, B> >
+    :   public parser_type_traits_base {
+
+        BOOST_STATIC_CONSTANT(bool, is_sequence = true);
+    };
+
+    template <typename A, typename B>
+    struct parser_type_traits<sequential_or<A, B> >
+    :   public parser_type_traits_base {
+
+        BOOST_STATIC_CONSTANT(bool, is_sequential_or = true);
+    };
+
+    template <typename A, typename B>
+    struct parser_type_traits<intersection<A, B> >
+    :   public parser_type_traits_base {
+
+        BOOST_STATIC_CONSTANT(bool, is_intersection = true);
+    };
+
+    template <typename A, typename B>
+    struct parser_type_traits<difference<A, B> >
+    :   public parser_type_traits_base {
+
+        BOOST_STATIC_CONSTANT(bool, is_difference = true);
+    };
+
+    template <typename A, typename B>
+    struct parser_type_traits<exclusive_or<A, B> >
+    :   public parser_type_traits_base {
+
+        BOOST_STATIC_CONSTANT(bool, is_exclusive_or = true);
+    };
+
+    template <typename S>
+    struct parser_type_traits<optional<S> >
+    :   public parser_type_traits_base {
+
+        BOOST_STATIC_CONSTANT(bool, is_optional = true);
+    };
+
+    template <typename S>
+    struct parser_type_traits<kleene_star<S> >
+    :   public parser_type_traits_base {
+
+        BOOST_STATIC_CONSTANT(bool, is_kleene_star = true);
+    };
+
+    template <typename S>
+    struct parser_type_traits<positive<S> >
+    :   public parser_type_traits_base {
+
+        BOOST_STATIC_CONSTANT(bool, is_positive = true);
+    };
+
+#endif // defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+}   // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif // !defined(BOOST_SPIRIT_PARSER_TRAITS_IPP)
diff --git a/boost/boost/spirit/meta/impl/refactoring.ipp b/boost/boost/spirit/meta/impl/refactoring.ipp
new file mode 100644 (file)
index 0000000..c63a8c0
--- /dev/null
@@ -0,0 +1,447 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_REFACTORING_IPP
+#define BOOST_SPIRIT_REFACTORING_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The struct 'self_nested_refactoring' is used to indicate, that the
+//  refactoring algorithm should be 'self-nested'.
+//
+//  The struct 'non_nested_refactoring' is used to indicate, that no nesting
+//  of refactoring algorithms is reqired.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+struct non_nested_refactoring { typedef non_nested_refactoring embed_t; };
+struct self_nested_refactoring { typedef self_nested_refactoring embed_t; };
+
+///////////////////////////////////////////////////////////////////////////////
+namespace impl {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Helper templates for refactoring parsers
+//
+///////////////////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  refactor the left unary operand of a binary parser
+    //
+    //      The refactoring should be done only if the left operand is an
+    //      unary_parser_category parser.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename CategoryT>
+    struct refactor_unary_nested {
+
+        template <
+            typename ParserT, typename NestedT,
+            typename ScannerT, typename BinaryT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &, ScannerT const& scan, BinaryT const& binary,
+            NestedT const& /*nested_d*/)
+        {
+            return binary.parse(scan);
+        }
+    };
+
+    template <>
+    struct refactor_unary_nested<unary_parser_category> {
+
+        template <
+            typename ParserT, typename ScannerT, typename BinaryT,
+            typename NestedT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &, ScannerT const& scan, BinaryT const& binary,
+            NestedT const& nested_d)
+        {
+            typedef typename BinaryT::parser_generator_t op_t;
+            typedef
+                typename BinaryT::left_t::parser_generator_t
+                unary_t;
+
+            return
+                unary_t::generate(
+                    nested_d[
+                        op_t::generate(binary.left().subject(), binary.right())
+                    ]
+                ).parse(scan);
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename CategoryT>
+    struct refactor_unary_non_nested {
+
+        template <typename ParserT, typename ScannerT, typename BinaryT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &, ScannerT const& scan, BinaryT const& binary)
+        {
+            return binary.parse(scan);
+        }
+    };
+
+    template <>
+    struct refactor_unary_non_nested<unary_parser_category> {
+
+        template <typename ParserT, typename ScannerT, typename BinaryT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &, ScannerT const& scan, BinaryT const& binary)
+        {
+            typedef typename BinaryT::parser_generator_t op_t;
+            typedef
+                typename BinaryT::left_t::parser_generator_t
+                unary_t;
+
+            return unary_t::generate(
+                op_t::generate(binary.left().subject(), binary.right())
+            ).parse(scan);
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename NestedT>
+    struct refactor_unary_type {
+
+        template <typename ParserT, typename ScannerT, typename BinaryT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &p, ScannerT const& scan, BinaryT const& binary,
+            NestedT const& nested_d)
+        {
+            typedef
+                typename BinaryT::left_t::parser_category_t
+                parser_category_t;
+
+            return refactor_unary_nested<parser_category_t>::
+                    parse(p, scan, binary, nested_d);
+        }
+    };
+
+    template <>
+    struct refactor_unary_type<non_nested_refactoring> {
+
+        template <typename ParserT, typename ScannerT, typename BinaryT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &p, ScannerT const& scan, BinaryT const& binary,
+            non_nested_refactoring const&)
+        {
+            typedef
+                typename BinaryT::left_t::parser_category_t
+                parser_category_t;
+
+            return refactor_unary_non_nested<parser_category_t>::
+                    parse(p, scan, binary);
+        }
+
+    };
+
+    template <>
+    struct refactor_unary_type<self_nested_refactoring> {
+
+        template <typename ParserT, typename ScannerT, typename BinaryT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &p, ScannerT const& scan, BinaryT const& binary,
+            self_nested_refactoring const &nested_tag)
+        {
+            typedef
+                typename BinaryT::left_t::parser_category_t
+                parser_category_t;
+            typedef typename ParserT::parser_generator_t parser_generator_t;
+
+            parser_generator_t nested_d(nested_tag);
+            return refactor_unary_nested<parser_category_t>::
+                    parse(p, scan, binary, nested_d);
+        }
+
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  refactor the action on the left operand of a binary parser
+    //
+    //      The refactoring should be done only if the left operand is an
+    //      action_parser_category parser.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename CategoryT>
+    struct refactor_action_nested {
+
+        template <
+            typename ParserT, typename ScannerT, typename BinaryT,
+            typename NestedT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &, ScannerT const& scan, BinaryT const& binary,
+            NestedT const& nested_d)
+        {
+            return nested_d[binary].parse(scan);
+        }
+    };
+
+    template <>
+    struct refactor_action_nested<action_parser_category> {
+
+        template <
+            typename ParserT, typename ScannerT, typename BinaryT,
+            typename NestedT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &, ScannerT const& scan, BinaryT const& binary,
+            NestedT const& nested_d)
+        {
+            typedef typename BinaryT::parser_generator_t binary_gen_t;
+
+            return (
+                nested_d[
+                    binary_gen_t::generate(
+                        binary.left().subject(),
+                        binary.right()
+                    )
+                ][binary.left().predicate()]
+            ).parse(scan);
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename CategoryT>
+    struct refactor_action_non_nested {
+
+        template <typename ParserT, typename ScannerT, typename BinaryT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &, ScannerT const& scan, BinaryT const& binary)
+        {
+            return binary.parse(scan);
+        }
+    };
+
+    template <>
+    struct refactor_action_non_nested<action_parser_category> {
+
+        template <typename ParserT, typename ScannerT, typename BinaryT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &, ScannerT const& scan, BinaryT const& binary)
+        {
+            typedef typename BinaryT::parser_generator_t binary_gen_t;
+
+            return (
+                binary_gen_t::generate(
+                    binary.left().subject(),
+                    binary.right()
+                )[binary.left().predicate()]
+            ).parse(scan);
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename NestedT>
+    struct refactor_action_type {
+
+        template <typename ParserT, typename ScannerT, typename BinaryT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &p, ScannerT const& scan, BinaryT const& binary,
+            NestedT const& nested_d)
+        {
+            typedef
+                typename BinaryT::left_t::parser_category_t
+                parser_category_t;
+
+            return refactor_action_nested<parser_category_t>::
+                    parse(p, scan, binary, nested_d);
+        }
+    };
+
+    template <>
+    struct refactor_action_type<non_nested_refactoring> {
+
+        template <typename ParserT, typename ScannerT, typename BinaryT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &p, ScannerT const& scan, BinaryT const& binary,
+            non_nested_refactoring const&)
+        {
+            typedef
+                typename BinaryT::left_t::parser_category_t
+                parser_category_t;
+
+            return refactor_action_non_nested<parser_category_t>::
+                parse(p, scan, binary);
+        }
+    };
+
+    template <>
+    struct refactor_action_type<self_nested_refactoring> {
+
+        template <typename ParserT, typename ScannerT, typename BinaryT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &p, ScannerT const& scan, BinaryT const& binary,
+            self_nested_refactoring const &nested_tag)
+        {
+            typedef typename ParserT::parser_generator_t parser_generator_t;
+            typedef
+                typename BinaryT::left_t::parser_category_t
+                parser_category_t;
+
+            parser_generator_t nested_d(nested_tag);
+            return refactor_action_nested<parser_category_t>::
+                    parse(p, scan, binary, nested_d);
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  refactor the action attached to a binary parser
+    //
+    //      The refactoring should be done only if the given parser is an
+    //      binary_parser_category parser.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename CategoryT>
+    struct attach_action_nested {
+
+        template <
+            typename ParserT, typename ScannerT, typename ActionT,
+            typename NestedT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &, ScannerT const& scan, ActionT const &action,
+            NestedT const& nested_d)
+        {
+            return action.parse(scan);
+        }
+    };
+
+    template <>
+    struct attach_action_nested<binary_parser_category> {
+
+        template <
+            typename ParserT, typename ScannerT, typename ActionT,
+            typename NestedT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &, ScannerT const& scan, ActionT const &action,
+            NestedT const& nested_d)
+        {
+            typedef
+                typename ActionT::subject_t::parser_generator_t
+                binary_gen_t;
+
+            return (
+                binary_gen_t::generate(
+                    nested_d[action.subject().left()[action.predicate()]],
+                    nested_d[action.subject().right()[action.predicate()]]
+                )
+            ).parse(scan);
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename CategoryT>
+    struct attach_action_non_nested {
+
+        template <typename ParserT, typename ScannerT, typename ActionT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &, ScannerT const& scan, ActionT const &action)
+        {
+            return action.parse(scan);
+        }
+    };
+
+    template <>
+    struct attach_action_non_nested<binary_parser_category> {
+
+        template <typename ParserT, typename ScannerT, typename ActionT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &, ScannerT const& scan, ActionT const &action)
+        {
+            typedef
+                typename ActionT::subject_t::parser_generator_t
+                binary_gen_t;
+
+            return (
+                binary_gen_t::generate(
+                    action.subject().left()[action.predicate()],
+                    action.subject().right()[action.predicate()]
+                )
+            ).parse(scan);
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename NestedT>
+    struct attach_action_type {
+
+        template <typename ParserT, typename ScannerT, typename ActionT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &p, ScannerT const& scan, ActionT const& action,
+            NestedT const& nested_d)
+        {
+            typedef
+                typename ActionT::subject_t::parser_category_t
+                parser_category_t;
+
+            return attach_action_nested<parser_category_t>::
+                    parse(p, scan, action, nested_d);
+        }
+    };
+
+    template <>
+    struct attach_action_type<non_nested_refactoring> {
+
+        template <typename ParserT, typename ScannerT, typename ActionT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &p, ScannerT const& scan, ActionT const &action,
+            non_nested_refactoring const&)
+        {
+            typedef
+                typename ActionT::subject_t::parser_category_t
+                parser_category_t;
+
+            return attach_action_non_nested<parser_category_t>::
+                parse(p, scan, action);
+        }
+    };
+
+    template <>
+    struct attach_action_type<self_nested_refactoring> {
+
+        template <typename ParserT, typename ScannerT, typename ActionT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const &p, ScannerT const& scan, ActionT const &action,
+            self_nested_refactoring const& nested_tag)
+        {
+            typedef typename ParserT::parser_generator_t parser_generator_t;
+            typedef
+                typename ActionT::subject_t::parser_category_t
+                parser_category_t;
+
+            parser_generator_t nested_d(nested_tag);
+            return attach_action_nested<parser_category_t>::
+                    parse(p, scan, action, nested_d);
+        }
+    };
+
+}   // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/boost/spirit/meta/impl/traverse.ipp b/boost/boost/spirit/meta/impl/traverse.ipp
new file mode 100644 (file)
index 0000000..71c9a9f
--- /dev/null
@@ -0,0 +1,389 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Joel de Guzman
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_TRAVERSE_IPP)
+#define BOOST_SPIRIT_TRAVERSE_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/meta/fundamental.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+namespace impl
+{
+
+    template <typename CategoryT>
+    struct traverse_post_order_return_category;
+
+}   // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Environment class for post_order_traversal
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <int Level, int Node, int Index, int LastLeft>
+struct traverse_post_order_env {
+
+    BOOST_STATIC_CONSTANT(int, level = Level);
+    BOOST_STATIC_CONSTANT(int, node = Node);
+    BOOST_STATIC_CONSTANT(int, index = Index);
+    BOOST_STATIC_CONSTANT(int, lastleft = LastLeft);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  traverse_post_order_return template
+//
+//      This template is a helper for dispatching the calculation of a parser
+//      type result for a traversal level to the corresponding parser_category
+//      based specialization.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename MetaT, typename ParserT, typename EnvT>
+struct traverse_post_order_return {
+
+    typedef typename ParserT::parser_category_t parser_category_t;
+    typedef typename impl::traverse_post_order_return_category<parser_category_t>
+        ::template result<MetaT, ParserT, EnvT>::type type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  parser_traversal_..._result templates
+//
+//      These are metafunctions, which calculate the resulting parser type
+//      for all subparsers and feed these types to the user supplied
+//      metafunctions to get back the resulting parser type of this traversal
+//      level.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename MetaT, typename ParserT, typename EnvT>
+struct parser_traversal_plain_result {
+
+    typedef typename MetaT::template plain_result<ParserT, EnvT>::type type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+template <typename MetaT, typename UnaryT, typename SubjectT, typename EnvT>
+struct parser_traversal_unary_result {
+
+    typedef typename MetaT
+        ::template unary_result<UnaryT, SubjectT, EnvT>::type type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+template <typename MetaT, typename ActionT, typename SubjectT, typename EnvT>
+struct parser_traversal_action_result {
+
+    typedef typename MetaT
+        ::template action_result<ActionT, SubjectT, EnvT>::type type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename MetaT, typename BinaryT, typename LeftT,
+    typename RightT, typename EnvT
+>
+struct parser_traversal_binary_result {
+
+    BOOST_STATIC_CONSTANT(int,
+        thisnum = (node_count<BinaryT>::value + EnvT::lastleft-1));
+    BOOST_STATIC_CONSTANT(int,
+        leftnum = (node_count<LeftT>::value + EnvT::lastleft-1));
+    BOOST_STATIC_CONSTANT(int,
+        leafnum = (leaf_count<LeftT>::value + EnvT::index));
+
+    typedef parser_traversal_binary_result self_t;
+
+    // left traversal environment and resulting parser type
+    typedef traverse_post_order_env<
+                (EnvT::level+1), (self_t::leftnum), (EnvT::index), (EnvT::lastleft)
+            > left_sub_env_t;
+    typedef typename traverse_post_order_return<
+                MetaT, LeftT, left_sub_env_t
+            >::type
+        left_t;
+
+    // right traversal environment and resulting parser type
+    typedef traverse_post_order_env<
+                (EnvT::level+1), (self_t::thisnum-1), (self_t::leafnum), (self_t::leftnum+1)
+            > right_sub_env_t;
+    typedef typename traverse_post_order_return<
+                MetaT, RightT, right_sub_env_t
+            >::type
+        right_t;
+
+    typedef typename MetaT::template binary_result<
+                BinaryT, left_t, right_t, EnvT
+            >::type
+        type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+namespace impl
+{
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  Meta functions, which dispatch the calculation of the return type of
+    //  of the post_order traverse function to the result template of the
+    //  corresponding parser_category based metafunction template.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+
+    template <typename CategoryT>
+    struct traverse_post_order_return_category;
+
+    template <>
+    struct traverse_post_order_return_category<plain_parser_category> {
+
+        template <typename MetaT, typename ParserT, typename EnvT>
+        struct result {
+
+            typedef typename parser_traversal_plain_result<
+                        MetaT, ParserT, EnvT
+                    >::type
+                type;
+        };
+    };
+
+    template <>
+    struct traverse_post_order_return_category<unary_parser_category> {
+
+        template <typename MetaT, typename ParserT, typename EnvT>
+        struct result {
+
+            typedef typename parser_traversal_unary_result<
+                        MetaT, ParserT, typename ParserT::subject_t, EnvT
+                    >::type
+                type;
+        };
+    };
+
+    template <>
+    struct traverse_post_order_return_category<action_parser_category> {
+
+        template <typename MetaT, typename ParserT, typename EnvT>
+        struct result {
+
+            typedef typename parser_traversal_action_result<
+                        MetaT, ParserT, typename ParserT::subject_t, EnvT
+                    >::type
+                type;
+        };
+    };
+
+    template <>
+    struct traverse_post_order_return_category<binary_parser_category> {
+
+        template <typename MetaT, typename ParserT, typename EnvT>
+        struct result {
+
+            typedef typename parser_traversal_binary_result<
+                        MetaT, ParserT, typename ParserT::left_t,
+                        typename ParserT::right_t, EnvT
+                    >::type
+                type;
+        };
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  Post-order parser traversal
+    //
+    //      The following templates contain the parser_category based code for
+    //
+    //        - calculating the type of the resulting parser, which is to be
+    //          returned from a level of traversal
+    //        - traversing down the composite parser structure, this traversal
+    //          returnes a new parser object
+    //
+    //      Both tasks are delegated to the MetaT metafunction supplied by the
+    //      user.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+
+    template <typename CategoryT>
+    struct traverse_post_order;
+
+    template <>
+    struct traverse_post_order<plain_parser_category> {
+
+        template <typename MetaT, typename ParserT, typename EnvT>
+        struct result {
+
+            typedef
+                typename parser_traversal_plain_result<MetaT, ParserT, EnvT>::type
+                type;
+        };
+
+        template <typename MetaT, typename ParserT, typename EnvT>
+        static
+        typename parser_traversal_plain_result<MetaT, ParserT, EnvT>::type
+        generate(MetaT const &meta_, ParserT const &parser_, EnvT const &env)
+        {
+            return meta_.generate_plain(parser_, env);
+        }
+    };
+
+    template <>
+    struct traverse_post_order<unary_parser_category> {
+
+        template <
+            typename MetaT, typename ParserT, typename SubjectT, typename EnvT
+        >
+        struct result {
+
+            typedef typename parser_traversal_unary_result<
+                        MetaT, ParserT, SubjectT, EnvT
+                    >::type
+                type;
+        };
+
+        template <typename MetaT, typename ParserT, typename EnvT>
+        static
+        typename parser_traversal_unary_result<
+            MetaT, ParserT, 
+            typename traverse_post_order_return<
+                MetaT, typename ParserT::subject_t, EnvT
+            >::type,
+            EnvT
+        >::type
+        generate(MetaT const &meta_, ParserT const &unary_, EnvT const &env)
+        {
+            typedef typename ParserT::subject_t             subject_t;
+            typedef typename subject_t::parser_category_t   subject_category_t;
+
+            return meta_.generate_unary(
+                unary_,
+                traverse_post_order<subject_category_t>::generate(meta_,
+                    unary_.subject(),
+                    traverse_post_order_env<
+                        EnvT::level+1, EnvT::node-1, EnvT::index, EnvT::lastleft
+                    >()
+                ),
+                env
+            );
+        }
+    };
+
+    template <>
+    struct traverse_post_order<action_parser_category> {
+
+        template <
+            typename MetaT, typename ParserT, typename SubjectT, typename EnvT
+        >
+        struct result {
+
+            typedef typename parser_traversal_action_result<
+                        MetaT, ParserT, SubjectT, EnvT
+                    >::type
+                type;
+        };
+
+        template <typename MetaT, typename ParserT, typename EnvT>
+        static
+        typename parser_traversal_action_result<
+            MetaT, ParserT, 
+            typename traverse_post_order_return<
+                MetaT, typename ParserT::subject_t, EnvT
+            >::type,
+            EnvT
+        >::type
+        generate(MetaT const &meta_, ParserT const &action_, EnvT const &env)
+        {
+            typedef typename ParserT::subject_t             subject_t;
+            typedef typename subject_t::parser_category_t   subject_category_t;
+
+            return meta_.generate_action(
+                action_,
+                traverse_post_order<subject_category_t>::generate(meta_,
+                    action_.subject(),
+                    traverse_post_order_env<
+                        EnvT::level+1, EnvT::node-1, EnvT::index, EnvT::lastleft
+                    >()
+                ),
+                env
+            );
+        }
+    };
+
+    template <>
+    struct traverse_post_order<binary_parser_category> {
+
+        template <
+            typename MetaT, typename ParserT, typename LeftT,
+            typename RightT, typename EnvT
+        >
+        struct result {
+
+            typedef typename parser_traversal_binary_result<
+                        MetaT, ParserT, LeftT, RightT, EnvT
+                    >::type
+                type;
+        };
+
+        template <typename MetaT, typename ParserT, typename EnvT>
+        static
+        typename parser_traversal_binary_result<
+            MetaT, ParserT, 
+            typename traverse_post_order_return<
+                MetaT, typename ParserT::left_t, EnvT
+            >::type,
+            typename traverse_post_order_return<
+                MetaT, typename ParserT::right_t, EnvT
+            >::type,
+            EnvT
+        >::type
+        generate(MetaT const &meta_, ParserT const &binary_, EnvT const& /*env*/)
+        {
+            typedef typename ParserT::left_t                left_t;
+            typedef typename ParserT::right_t               right_t;
+            typedef typename left_t::parser_category_t      left_category_t;
+            typedef typename right_t::parser_category_t     right_category_t;
+
+            enum {
+                leftnum = (node_count<left_t>::value + EnvT::lastleft-1),
+                thisnum = (node_count<ParserT>::value + EnvT::lastleft-1),
+                rightnum = (thisnum-1),
+                leafnum = (leaf_count<left_t>::value + EnvT::index)
+            };
+
+            return meta_.generate_binary(
+                binary_,
+                traverse_post_order<left_category_t>::generate(
+                    meta_, binary_.left(),
+                    traverse_post_order_env<
+                        EnvT::level+1, leftnum, EnvT::index, EnvT::lastleft
+                    >()
+                ),
+                traverse_post_order<right_category_t>::generate(
+                    meta_, binary_.right(),
+                    traverse_post_order_env<
+                        EnvT::level+1, rightnum, leafnum, leftnum+1
+                    >()
+                ),
+                traverse_post_order_env<
+                    EnvT::level, thisnum, EnvT::index, EnvT::lastleft
+                >()
+            );
+        }
+    };
+
+}   //  namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif // !defined(BOOST_SPIRIT_TRAVERSE_IPP)
diff --git a/boost/boost/spirit/meta/parser_traits.hpp b/boost/boost/spirit/meta/parser_traits.hpp
new file mode 100644 (file)
index 0000000..3a96741
--- /dev/null
@@ -0,0 +1,316 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Joel de Guzman
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    Copyright (c) 2003 Martin Wille
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_PARSER_TRAITS_HPP)
+#define BOOST_SPIRIT_PARSER_TRAITS_HPP
+
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/static_assert.hpp>
+
+#include <boost/spirit/core/parser.hpp>
+#include <boost/spirit/meta/impl/parser_traits.ipp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Parser traits templates
+//
+//      Used to determine the type and several other characteristics of a given
+//      parser type.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The is_parser traits template can be used to tell wether a given
+// class is a parser.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+struct is_parser
+{
+    BOOST_STATIC_CONSTANT(bool, value =
+        (::boost::is_base_and_derived<parser<T>, T>::value));
+
+//  [JDG 2/3/03] simplified implementation by
+//  using boost::is_base_and_derived
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The is_unary_composite traits template can be used to tell if a given
+//  parser is a unary parser as for instance kleene_star or optional.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename UnaryT>
+struct is_unary_composite {
+
+    BOOST_STATIC_CONSTANT(bool, value = (::boost::is_convertible<
+        typename UnaryT::parser_category_t, unary_parser_category>::value));
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The is_acction_parser traits template can be used to tell if a given
+//  parser is a action parser, i.e. it is a composite consisting of a
+//  auxilliary parser and an attached semantic action.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename ActionT>
+struct is_action_parser {
+
+    BOOST_STATIC_CONSTANT(bool, value = (::boost::is_convertible<
+        typename ActionT::parser_category_t, action_parser_category>::value));
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The is_binary_composite traits template can be used to tell if a given
+//  parser is a binary parser as for instance sequence or difference.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename BinaryT>
+struct is_binary_composite {
+
+    BOOST_STATIC_CONSTANT(bool, value = (::boost::is_convertible<
+        typename BinaryT::parser_category_t, binary_parser_category>::value));
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The is_composite_parser traits template can be used to tell if a given
+//  parser is a unary or a binary parser composite type.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CompositeT>
+struct is_composite_parser {
+
+    BOOST_STATIC_CONSTANT(bool, value = (
+        ::boost::spirit::is_unary_composite<CompositeT>::value ||
+        ::boost::spirit::is_binary_composite<CompositeT>::value));
+};
+
+///////////////////////////////////////////////////////////////////////////////
+template <typename ParserT>
+struct is_alternative {
+
+    BOOST_STATIC_CONSTANT(bool, value = (
+        ::boost::spirit::impl::parser_type_traits<ParserT>::is_alternative));
+};
+
+template <typename ParserT>
+struct is_sequence {
+
+    BOOST_STATIC_CONSTANT(bool, value = (
+        ::boost::spirit::impl::parser_type_traits<ParserT>::is_sequence));
+};
+
+template <typename ParserT>
+struct is_sequential_or {
+
+    BOOST_STATIC_CONSTANT(bool, value = (
+        ::boost::spirit::impl::parser_type_traits<ParserT>::is_sequential_or));
+};
+
+template <typename ParserT>
+struct is_intersection {
+
+    BOOST_STATIC_CONSTANT(bool, value = (
+        ::boost::spirit::impl::parser_type_traits<ParserT>::is_intersection));
+};
+
+template <typename ParserT>
+struct is_difference {
+
+    BOOST_STATIC_CONSTANT(bool, value = (
+        ::boost::spirit::impl::parser_type_traits<ParserT>::is_difference));
+};
+
+template <typename ParserT>
+struct is_exclusive_or {
+
+    BOOST_STATIC_CONSTANT(bool, value = (
+        ::boost::spirit::impl::parser_type_traits<ParserT>::is_exclusive_or));
+};
+
+template <typename ParserT>
+struct is_optional {
+
+    BOOST_STATIC_CONSTANT(bool, value = (
+        ::boost::spirit::impl::parser_type_traits<ParserT>::is_optional));
+};
+
+template <typename ParserT>
+struct is_kleene_star {
+
+    BOOST_STATIC_CONSTANT(bool, value = (
+        ::boost::spirit::impl::parser_type_traits<ParserT>::is_kleene_star));
+};
+
+template <typename ParserT>
+struct is_positive {
+
+    BOOST_STATIC_CONSTANT(bool, value = (
+        ::boost::spirit::impl::parser_type_traits<ParserT>::is_positive));
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Parser extraction templates
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The unary_subject template can be used to return the type of the
+//  parser used as the subject of an unary parser.
+//  If the parser under inspection is not an unary type parser the compilation
+//  will fail.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename UnaryT>
+struct unary_subject {
+
+    BOOST_STATIC_ASSERT(::boost::spirit::is_unary_composite<UnaryT>::value);
+    typedef typename UnaryT::subject_t type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The get_unary_subject template function returns the parser object, which
+//  is used as the subject of an unary parser.
+//  If the parser under inspection is not an unary type parser the compilation
+//  will fail.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename UnaryT>
+inline typename unary_subject<UnaryT>::type const &
+get_unary_subject(UnaryT const &unary_)
+{
+    BOOST_STATIC_ASSERT(::boost::spirit::is_unary_composite<UnaryT>::value);
+    return unary_.subject();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The binary_left_subject and binary_right_subject templates can be used to
+//  return the types of the parsers used as the left and right subject of an
+//  binary parser.
+//  If the parser under inspection is not a binary type parser the compilation
+//  will fail.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename BinaryT>
+struct binary_left_subject {
+
+    BOOST_STATIC_ASSERT(::boost::spirit::is_binary_composite<BinaryT>::value);
+    typedef typename BinaryT::left_t type;
+};
+
+template <typename BinaryT>
+struct binary_right_subject {
+
+    BOOST_STATIC_ASSERT(::boost::spirit::is_binary_composite<BinaryT>::value);
+    typedef typename BinaryT::right_t type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The get_binary_left_subject and get_binary_right_subject template functions
+//  return the parser object, which is used as the left or right subject of a
+//  binary parser.
+//  If the parser under inspection is not a binary type parser the compilation
+//  will fail.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename BinaryT>
+inline typename binary_left_subject<BinaryT>::type const &
+get_binary_left_subject(BinaryT const &binary_)
+{
+    BOOST_STATIC_ASSERT(::boost::spirit::is_binary_composite<BinaryT>::value);
+    return binary_.left();
+}
+
+template <typename BinaryT>
+inline typename binary_right_subject<BinaryT>::type const &
+get_binary_right_subject(BinaryT const &binary_)
+{
+    BOOST_STATIC_ASSERT(::boost::spirit::is_binary_composite<BinaryT>::value);
+    return binary_.right();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The action_subject template can be used to return the type of the
+//  parser used as the subject of an action parser.
+//  If the parser under inspection is not an action type parser the compilation
+//  will fail.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename ActionT>
+struct action_subject {
+
+    BOOST_STATIC_ASSERT(::boost::spirit::is_action_parser<ActionT>::value);
+    typedef typename ActionT::subject_t type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The get_action_subject template function returns the parser object, which
+//  is used as the subject of an action parser.
+//  If the parser under inspection is not an action type parser the compilation
+//  will fail.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename ActionT>
+inline typename action_subject<ActionT>::type const &
+get_action_subject(ActionT const &action_)
+{
+    BOOST_STATIC_ASSERT(::boost::spirit::is_action_parser<ActionT>::value);
+    return action_.subject();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The semantic_action template can be used to return the type of the
+//  attached semantic action of an action parser.
+//  If the parser under inspection is not an action type parser the compilation
+//  will fail.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename ActionT>
+struct semantic_action {
+
+    BOOST_STATIC_ASSERT(::boost::spirit::is_action_parser<ActionT>::value);
+    typedef typename ActionT::predicate_t type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The get_semantic_action template function returns the attached semantic
+//  action of an action parser.
+//  If the parser under inspection is not an action type parser the compilation
+//  will fail.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename ActionT>
+inline typename semantic_action<ActionT>::type const &
+get_semantic_action(ActionT const &action_)
+{
+    BOOST_STATIC_ASSERT(::boost::spirit::is_action_parser<ActionT>::value);
+    return action_.predicate();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif // !defined(BOOST_SPIRIT_PARSER_TRAITS_HPP)
diff --git a/boost/boost/spirit/meta/refactoring.hpp b/boost/boost/spirit/meta/refactoring.hpp
new file mode 100644 (file)
index 0000000..6e92683
--- /dev/null
@@ -0,0 +1,274 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_REFACTORING_HPP
+#define BOOST_SPIRIT_REFACTORING_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/static_assert.hpp>
+#include <boost/spirit/meta/as_parser.hpp>
+#include <boost/spirit/core/parser.hpp>
+#include <boost/spirit/core/composite/composite.hpp>
+#include <boost/spirit/meta/impl/refactoring.ipp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  refactor_unary_parser class
+//
+//      This helper template allows to attach an unary operation to a newly
+//      constructed parser, which combines the subject of the left operand of
+//      the original given parser (BinaryT) with the right operand of the
+//      original binary parser through the original binary operation and
+//      rewraps the resulting parser with the original unary operator.
+//
+//      For instance given the parser:
+//          *some_parser - another_parser
+//
+//      will be refactored to:
+//          *(some_parser - another_parser)
+//
+//      If the parser to refactor is not a unary parser, no refactoring is done
+//      at all.
+//
+//      The original parser should be a binary_parser_category parser,
+//      else the compilation will fail
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename NestedT = non_nested_refactoring>
+class refactor_unary_gen;
+
+template <typename BinaryT, typename NestedT = non_nested_refactoring>
+class refactor_unary_parser :
+    public parser<refactor_unary_parser<BinaryT, NestedT> > {
+
+public:
+    //  the parser to refactor has to be at least a binary_parser_category
+    //  parser
+    BOOST_STATIC_ASSERT((
+        boost::is_convertible<typename BinaryT::parser_category_t,
+            binary_parser_category>::value
+    ));
+
+    refactor_unary_parser(BinaryT const& binary_, NestedT const& nested_)
+    : binary(binary_), nested(nested_) {}
+
+    typedef refactor_unary_parser<BinaryT, NestedT> self_t;
+    typedef refactor_unary_gen<NestedT> parser_generator_t;
+    typedef typename BinaryT::left_t::parser_category_t parser_category_t;
+
+    template <typename ScannerT>
+    typename parser_result<self_t, ScannerT>::type
+    parse(ScannerT const& scan) const
+    {
+        return impl::refactor_unary_type<NestedT>::
+            parse(*this, scan, binary, nested);
+    }
+
+private:
+    typename as_parser<BinaryT>::type::embed_t binary;
+    typename NestedT::embed_t nested;
+};
+
+//////////////////////////////////
+template <typename NestedT>
+class refactor_unary_gen {
+
+public:
+    typedef refactor_unary_gen<NestedT> embed_t;
+
+    refactor_unary_gen(NestedT const& nested_ = non_nested_refactoring())
+    : nested(nested_) {}
+
+    template <typename ParserT>
+    refactor_unary_parser<ParserT, NestedT>
+    operator[](parser<ParserT> const& subject) const
+    {
+        return refactor_unary_parser<ParserT, NestedT>
+            (subject.derived(), nested);
+    }
+
+private:
+    typename NestedT::embed_t nested;
+};
+
+const refactor_unary_gen<> refactor_unary_d = refactor_unary_gen<>();
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  refactor_action_parser class
+//
+//      This helper template allows to attach an action taken from the left
+//      operand of the given binary parser to a newly constructed parser,
+//      which combines the subject of the left operand of the original binary
+//      parser with the right operand of the original binary parser by means of
+//      the original binary operator parser.
+//
+//      For instance the parser:
+//          some_parser[some_attached_functor] - another_parser
+//
+//      will be refactored to:
+//          (some_parser - another_parser)[some_attached_functor]
+//
+//      If the left operand to refactor is not an action parser, no refactoring
+//      is done at all.
+//
+//      The original parser should be a binary_parser_category parser,
+//      else the compilation will fail
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename NestedT = non_nested_refactoring>
+class refactor_action_gen;
+
+template <typename BinaryT, typename NestedT = non_nested_refactoring>
+class refactor_action_parser :
+    public parser<refactor_action_parser<BinaryT, NestedT> > {
+
+public:
+    //  the parser to refactor has to be at least a binary_parser_category
+    //  parser
+    BOOST_STATIC_ASSERT((
+        boost::is_convertible<typename BinaryT::parser_category_t,
+            binary_parser_category>::value
+    ));
+
+    refactor_action_parser(BinaryT const& binary_, NestedT const& nested_)
+    : binary(binary_), nested(nested_) {}
+
+    typedef refactor_action_parser<BinaryT, NestedT> self_t;
+    typedef refactor_action_gen<NestedT> parser_generator_t;
+    typedef typename BinaryT::left_t::parser_category_t parser_category_t;
+
+    template <typename ScannerT>
+    typename parser_result<self_t, ScannerT>::type
+    parse(ScannerT const& scan) const
+    {
+        return impl::refactor_action_type<NestedT>::
+            parse(*this, scan, binary, nested);
+    }
+
+private:
+    typename as_parser<BinaryT>::type::embed_t binary;
+    typename NestedT::embed_t nested;
+};
+
+//////////////////////////////////
+template <typename NestedT>
+class refactor_action_gen {
+
+public:
+    typedef refactor_action_gen<NestedT> embed_t;
+
+    refactor_action_gen(NestedT const& nested_ = non_nested_refactoring())
+    : nested(nested_) {}
+
+    template <typename ParserT>
+    refactor_action_parser<ParserT, NestedT>
+    operator[](parser<ParserT> const& subject) const
+    {
+        return refactor_action_parser<ParserT, NestedT>
+            (subject.derived(), nested);
+    }
+
+private:
+    typename NestedT::embed_t nested;
+};
+
+const refactor_action_gen<> refactor_action_d = refactor_action_gen<>();
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  attach_action_parser class
+//
+//      This helper template allows to attach an action given separately
+//      to to all parsers, out of which the given parser is constructed and
+//      reconstructs a new parser having the same structure.
+//
+//      For instance the parser:
+//          (some_parser >> another_parser)[some_attached_functor]
+//
+//      will be refactored to:
+//          some_parser[some_attached_functor]
+//              >> another_parser[some_attached_functor]
+//
+//      The original parser should be a action_parser_category parser,
+//      else the compilation will fail
+//
+//      If the parser, to which the action is attached is not an binary parser,
+//      no refactoring is done at all.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename NestedT = non_nested_refactoring>
+class attach_action_gen;
+
+template <typename ActionT, typename NestedT = non_nested_refactoring>
+class attach_action_parser :
+    public parser<attach_action_parser<ActionT, NestedT> > {
+
+public:
+    //  the parser to refactor has to be at least a action_parser_category
+    //  parser
+    BOOST_STATIC_ASSERT((
+        boost::is_convertible<typename ActionT::parser_category_t,
+            action_parser_category>::value
+    ));
+
+    attach_action_parser(ActionT const& actor_, NestedT const& nested_)
+    : actor(actor_), nested(nested_) {}
+
+    typedef attach_action_parser<ActionT, NestedT> self_t;
+    typedef attach_action_gen<NestedT> parser_generator_t;
+    typedef typename ActionT::parser_category_t parser_category_t;
+
+    template <typename ScannerT>
+    typename parser_result<self_t, ScannerT>::type
+    parse(ScannerT const& scan) const
+    {
+        return impl::attach_action_type<NestedT>::
+            parse(*this, scan, actor, nested);
+    }
+
+private:
+    typename as_parser<ActionT>::type::embed_t actor;
+    typename NestedT::embed_t nested;
+};
+
+//////////////////////////////////
+template <typename NestedT>
+class attach_action_gen {
+
+public:
+    typedef attach_action_gen<NestedT> embed_t;
+
+    attach_action_gen(NestedT const& nested_ = non_nested_refactoring())
+    : nested(nested_) {}
+
+    template <typename ParserT, typename ActionT>
+    attach_action_parser<action<ParserT, ActionT>, NestedT>
+    operator[](action<ParserT, ActionT> const& actor) const
+    {
+        return attach_action_parser<action<ParserT, ActionT>, NestedT>
+            (actor, nested);
+    }
+
+private:
+    typename NestedT::embed_t nested;
+};
+
+const attach_action_gen<> attach_action_d = attach_action_gen<>();
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif // BOOST_SPIRIT_REFACTORING_HPP
+
diff --git a/boost/boost/spirit/meta/traverse.hpp b/boost/boost/spirit/meta/traverse.hpp
new file mode 100644 (file)
index 0000000..0151412
--- /dev/null
@@ -0,0 +1,218 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Joel de Guzman
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_TRAVERSE_HPP)
+#define BOOST_SPIRIT_TRAVERSE_HPP
+
+#include <boost/spirit/meta/impl/traverse.ipp>
+
+namespace boost { namespace spirit
+{
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  Post-order traversal of auxilliary parsers.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    struct post_order
+    {
+        //  Return the parser type, which is generated as the result of the
+        //  traverse function below.
+
+        template <typename MetaT, typename ParserT>
+        struct result
+        {
+            typedef typename
+                traverse_post_order_return<
+                    MetaT
+                  , ParserT
+                  , traverse_post_order_env<0, 0, 0, 0>
+                >::type
+            type;
+        };
+
+        //  Traverse a given parser and refactor it with the help of the given
+        //  MetaT metafunction template.
+
+        template <typename MetaT, typename ParserT>
+        static typename result<MetaT, ParserT>::type
+        traverse(MetaT const &meta_, ParserT const &parser_)
+        {
+            typedef typename ParserT::parser_category_t parser_category_t;
+            return impl::traverse_post_order<parser_category_t>::generate(
+                meta_, parser_, traverse_post_order_env<0, 0, 0, 0>());
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  Transform policies
+    //
+    //      The following policy classes could be used to assemble some new
+    //      transformation metafunction which uses identity transformations
+    //      for some parser_category type parsers.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  transform plain parsers
+    template <typename TransformT>
+    struct plain_identity_policy
+    {
+        template <typename ParserT, typename EnvT>
+        struct plain_result
+        {
+            // plain parsers should be embedded and returned correctly
+            typedef typename ParserT::embed_t type;
+        };
+
+        template <typename ParserT, typename EnvT>
+        typename parser_traversal_plain_result<TransformT, ParserT, EnvT>::type
+        generate_plain(ParserT const &parser_, EnvT const& /*env*/) const
+        {
+            return parser_;
+        }
+    };
+
+    //////////////////////////////////
+    //  transform unary parsers
+    template <typename UnaryT, typename SubjectT>
+    struct unary_identity_policy_return
+    {
+        typedef typename UnaryT::parser_generator_t parser_generator_t;
+        typedef typename parser_generator_t
+            ::template result<SubjectT>::type type;
+    };
+
+    template <typename TransformT>
+    struct unary_identity_policy
+    {
+        template <typename UnaryT, typename SubjectT, typename EnvT>
+        struct unary_result
+        {
+            typedef
+                typename unary_identity_policy_return<UnaryT, SubjectT>::type
+            type;
+        };
+
+        template <typename UnaryT, typename SubjectT, typename EnvT>
+        typename parser_traversal_unary_result<
+            TransformT, UnaryT, SubjectT, EnvT>::type
+        generate_unary(
+            UnaryT const &, SubjectT const &subject_, EnvT const& /*env*/) const
+        {
+            typedef typename UnaryT::parser_generator_t parser_generator_t;
+            return parser_generator_t::template generate<SubjectT>(subject_);
+        }
+    };
+
+    //////////////////////////////////
+    //  transform action parsers
+    template <typename TransformT>
+    struct action_identity_policy
+    {
+        template <typename ActionT, typename SubjectT, typename EnvT>
+        struct action_result
+        {
+            typedef action<SubjectT, typename ActionT::predicate_t> type;
+        };
+
+        template <typename ActionT, typename SubjectT, typename EnvT>
+        typename parser_traversal_action_result<
+            TransformT, ActionT, SubjectT, EnvT
+        >::type
+        generate_action(ActionT const &action_, SubjectT const &subject_,
+            EnvT const& /*env*/) const
+        {
+            return subject_[action_.predicate()];
+        }
+    };
+
+    //////////////////////////////////
+    //  transform binary parsers
+    template <typename BinaryT, typename LeftT, typename RightT>
+    struct binary_identity_policy_return
+    {
+        typedef typename BinaryT::parser_generator_t parser_generator_t;
+        typedef typename parser_generator_t
+            ::template result<LeftT, RightT>::type type;
+    };
+
+    template <typename TransformT>
+    struct binary_identity_policy
+    {
+        template <typename BinaryT, typename LeftT
+            , typename RightT, typename EnvT>
+        struct binary_result {
+
+            typedef typename
+                binary_identity_policy_return<BinaryT, LeftT, RightT>::type
+            type;
+        };
+
+        template <typename BinaryT, typename LeftT
+            , typename RightT, typename EnvT>
+        typename parser_traversal_binary_result<
+            TransformT, BinaryT, LeftT, RightT, EnvT
+        >::type
+        generate_binary(
+            BinaryT const &, LeftT const& left_
+          , RightT const& right_, EnvT const& /*env*/) const
+        {
+            typedef typename BinaryT::parser_generator_t parser_generator_t;
+            return parser_generator_t::
+                template generate<LeftT, RightT>(left_, right_);
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  transform_policies template
+    //
+    //      The transform_policies template metafunction could serve as a
+    //      base class for new metafunctions to be passed to the traverse meta
+    //      template (see above), where only minimal parts have to be
+    //      overwritten.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+
+    template <
+        typename TransformT,
+        typename PlainPolicyT = plain_identity_policy<TransformT>,
+        typename UnaryPolicyT = unary_identity_policy<TransformT>,
+        typename ActionPolicyT = action_identity_policy<TransformT>,
+        typename BinaryPolicyT = binary_identity_policy<TransformT>
+    >
+    struct transform_policies :
+        public PlainPolicyT,
+        public UnaryPolicyT,
+        public ActionPolicyT,
+        public BinaryPolicyT
+    {
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  Identity transformation
+    //
+    //      The identity_transform metafunction supplied to the traverse
+    //      template will generate a new parser, which will be exactly
+    //      identical to the parser given as the parameter to the traverse
+    //      metafunction. I.e. the following conceptual 'equation' will be
+    //      always true:
+    //
+    //      some_parser ==
+    //          post_order::traverse(identity_transform(), some_parser)
+    //
+    ///////////////////////////////////////////////////////////////////////////
+
+    struct identity_transform : transform_policies<identity_transform> {};
+
+}} // namespace boost::spirit
+
+#endif // !defined(BOOST_SPIRIT_TRAVERSE_HPP)
diff --git a/boost/boost/spirit/phoenix.hpp b/boost/boost/spirit/phoenix.hpp
new file mode 100644 (file)
index 0000000..f3655b2
--- /dev/null
@@ -0,0 +1,26 @@
+/*=============================================================================
+    Phoenix V1.2.1
+    Copyright (c) 2001-2002 Joel de Guzman
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_PHOENIX_HPP)
+#define BOOST_SPIRIT_PHOENIX_HPP
+
+#include <boost/spirit/phoenix/tuples.hpp>
+#include <boost/spirit/phoenix/tuple_helpers.hpp>
+#include <boost/spirit/phoenix/actor.hpp>
+#include <boost/spirit/phoenix/primitives.hpp>
+#include <boost/spirit/phoenix/composite.hpp>
+#include <boost/spirit/phoenix/functions.hpp>
+#include <boost/spirit/phoenix/operators.hpp>
+#include <boost/spirit/phoenix/special_ops.hpp>
+#include <boost/spirit/phoenix/statements.hpp>
+#include <boost/spirit/phoenix/binders.hpp>
+#include <boost/spirit/phoenix/closures.hpp>
+#include <boost/spirit/phoenix/casts.hpp>
+#include <boost/spirit/phoenix/new.hpp>
+
+#endif // !defined(BOOST_SPIRIT_PHOENIX_HPP)
diff --git a/boost/boost/spirit/phoenix/actor.hpp b/boost/boost/spirit/phoenix/actor.hpp
new file mode 100644 (file)
index 0000000..7c7d3c4
--- /dev/null
@@ -0,0 +1,613 @@
+/*=============================================================================
+    Phoenix v1.2
+    Copyright (c) 2001-2002 Joel de Guzman
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef PHOENIX_ACTOR_HPP
+#define PHOENIX_ACTOR_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/phoenix/tuples.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+//  These are forward declared here because we cannot include impl.hpp
+//  or operators.hpp yet but the actor's assignment operator and index
+//  operator are required to be members.
+
+//////////////////////////////////
+struct assign_op;
+struct index_op;
+
+//////////////////////////////////
+namespace impl {
+
+    template <typename OperationT, typename BaseT, typename B>
+    struct make_binary1;
+}
+
+namespace impl {
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //      if_t selects type A or B depending on the condition C If C is of
+    //      type char[2], B is selected, otherwise A
+    //
+    //      TODO: This should be part of a common meta-library
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename C, typename A, typename B>
+    struct if_t { typedef A type; };
+
+    template <typename A, typename B>
+    struct if_t<char[2], A, B> { typedef B type; };
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  unpack_tuple class
+//
+//      This class is used to unpack a supplied tuple such, that the members of 
+//      this tuple will be handled as if they would be supplied separately.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename TupleT>
+struct unpack_tuple : public TupleT {
+
+    typedef TupleT tuple_t;
+    
+    unpack_tuple() {}
+    unpack_tuple(tuple_t const &tuple_) : TupleT(tuple_) {}
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  actor class
+//
+//      This class is a protocol class for all actors. This class is
+//      essentially an interface contract. The actor class does not
+//      really know how how to act on anything but instead relies on the
+//      template parameter BaseT (from which the actor will derive from)
+//      to do the actual action.
+//
+//      An actor is a functor that is capable of accepting arguments up
+//      to a predefined maximum. It is up to the base class to do the
+//      actual processing or possibly to limit the arity (no. of
+//      arguments) passed in. Upon invocation of the functor through a
+//      supplied operator(), the actor funnels the arguments passed in
+//      by the client into a tuple and calls the base eval member
+//      function.
+//
+//      Schematically:
+//
+//          arg0 ---------|
+//          arg1 ---------|
+//          arg3 ---------|---> tupled_args ---> base.eval
+//          ...           |
+//          argN ---------|
+//
+//          actor::operator()(arg0, arg1... argN)
+//              ---> BaseT::eval(tupled_args);
+//
+//      Actor base classes from which this class inherits from are
+//      expected to have a corresponding member function eval compatible
+//      with the conceptual Interface:
+//
+//          template <typename TupleT>
+//          actor_return_type
+//          eval(TupleT const& args) const;
+//
+//      where args are the actual arguments passed in by the client
+//      funneled into a tuple (see tuple.hpp for details).
+//
+//      The actor_return_type can be anything. Base classes are free to
+//      return any type, even argument dependent types (types that are
+//      deduced from the types of the arguments). After evaluating the
+//      parameters and doing some computations or actions, the eval
+//      member function concludes by returning something back to the
+//      client. To do this, the forwarding function (the actor's
+//      operator()) needs to know the return type of the eval member
+//      function that it is calling. For this purpose, actor base
+//      classes are required to provide a nested template class:
+//
+//          template <typename TupleT>
+//          struct result;
+//
+//      This auxiliary class provides the result type information
+//      returned by the eval member function of a base actor class. The
+//      nested template class result should have a typedef 'type' that
+//      reflects the return type of its member function eval. It is
+//      basically a type computer that answers the question "given
+//      arguments packed into a TupleT type, what will be the result
+//      type of the eval member function of ActorT?". The template class
+//      actor_result queries this to extract the return type of an
+//      actor. Example:
+//
+//          typedef typename actor_result<ActorT, TupleT>::type
+//              actor_return_type;
+//
+//      where actor_return_type is the actual type returned by ActorT's
+//      eval member function given some arguments in a TupleT.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename ActorT, typename TupleT>
+struct actor_result {
+
+    typedef typename ActorT::template result<TupleT>::type type;
+    typedef typename remove_reference<type>::type plain_type;
+};
+
+//////////////////////////////////
+template <typename BaseT>
+struct actor : public BaseT {
+
+    actor();
+    actor(BaseT const& base);
+
+    typename actor_result<BaseT, tuple<> >::type
+    operator()() const;
+
+    template <typename A>
+    typename actor_result<BaseT, tuple<A&> >::type
+    operator()(A& a) const;
+
+    template <typename A, typename B>
+    typename actor_result<BaseT, tuple<A&, B&> >::type
+    operator()(A& a, B& b) const;
+
+    template <typename A, typename B, typename C>
+    typename actor_result<BaseT, tuple<A&, B&, C&> >::type
+    operator()(A& a, B& b, C& c) const;
+
+#if PHOENIX_LIMIT > 3
+    template <typename A, typename B, typename C, typename D>
+    typename actor_result<BaseT, tuple<A&, B&, C&, D&> >::type
+    operator()(A& a, B& b, C& c, D& d) const;
+
+    template <typename A, typename B, typename C, typename D, typename E>
+    typename actor_result<BaseT, tuple<A&, B&, C&, D&, E&> >::type
+    operator()(A& a, B& b, C& c, D& d, E& e) const;
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F>
+    typename actor_result<BaseT, tuple<A&, B&, C&, D&, E&, F&> >::type
+    operator()(A& a, B& b, C& c, D& d, E& e, F& f) const;
+
+#if PHOENIX_LIMIT > 6
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G>
+    typename actor_result<BaseT, tuple<A&, B&, C&, D&, E&, F&, G&> >::type
+    operator()(A& a, B& b, C& c, D& d, E& e, F& f, G& g) const;
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H>
+    typename actor_result<BaseT,
+        tuple<A&, B&, C&, D&, E&, F&, G&, H&>
+    >::type
+    operator()(A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h) const;
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I>
+    typename actor_result<BaseT,
+        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&>
+    >::type
+    operator()(A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i) const;
+
+#if PHOENIX_LIMIT > 9
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J>
+    typename actor_result<BaseT,
+        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&>
+    >::type
+    operator()(
+        A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j) const;
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K>
+    typename actor_result<BaseT,
+        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&>
+    >::type
+    operator()(
+        A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
+        K& k) const;
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L>
+    typename actor_result<BaseT,
+        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&>
+    >::type
+    operator()(
+        A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
+        K& k, L& l) const;
+
+#if PHOENIX_LIMIT > 12
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M>
+    typename actor_result<BaseT,
+        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&>
+    >::type
+    operator()(
+        A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
+        K& k, L& l, M& m) const;
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M, typename N>
+    typename actor_result<BaseT,
+        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&>
+    >::type
+    operator()(
+        A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
+        K& k, L& l, M& m, N& n) const;
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M, typename N, typename O>
+    typename actor_result<BaseT,
+        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&, O&>
+    >::type
+    operator()(
+        A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
+        K& k, L& l, M& m, N& n, O& o) const;
+
+#endif
+#endif
+#endif
+#endif
+
+    template <typename TupleT>
+    typename actor_result<BaseT, unpack_tuple<TupleT> >::type
+    operator()(unpack_tuple<TupleT> const &t) const;
+    
+    template <typename B>
+    typename impl::make_binary1<assign_op, BaseT, B>::type
+    operator=(B const& b) const;
+
+    template <typename B>
+    typename impl::make_binary1<index_op, BaseT, B>::type
+    operator[](B const& b) const;
+};
+
+///////////////////////////////////////////////////////////////////////////
+//
+//  as_actor
+//
+//      as_actor is a meta-program that converts an arbitrary type into
+//      an actor. All participants in the framework must be first-class
+//      actors. This meta-program is used all throughout the framework
+//      whenever an unknown type needs to be converted to an actor.
+//      as_actor specializations are expected to have a typedef 'type'.
+//      This is the destination actor type. A static member function
+//      'convert' converts an object to this target type.
+//
+//      The meta-program does no conversion if the object to be
+//      converted is already an actor.
+//
+///////////////////////////////////////////////////////////////////////////
+template <typename T>
+struct as_actor;
+
+//////////////////////////////////
+template <typename BaseT>
+struct as_actor<actor<BaseT> > {
+
+    typedef actor<BaseT> type;
+    static type convert(actor<BaseT> const& x) { return x; }
+};
+
+//////////////////////////////////
+template <>
+struct as_actor<nil_t> {
+
+    typedef nil_t type;
+    static nil_t convert(nil_t /*x*/)
+    { return nil_t(); }
+};
+
+//////////////////////////////////
+template <>
+struct as_actor<void> {
+
+    typedef void type;
+    //  ERROR!!!
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  actor class implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename BaseT>
+actor<BaseT>::actor()
+:   BaseT() {}
+
+//////////////////////////////////
+template <typename BaseT>
+actor<BaseT>::actor(BaseT const& base)
+:   BaseT(base) {}
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename actor_result<BaseT, tuple<> >::type
+actor<BaseT>::operator()() const
+{
+    return BaseT::eval(tuple<>());
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <typename A>
+inline typename actor_result<BaseT, tuple<A&> >::type
+actor<BaseT>::operator()(A& a) const
+{
+    return BaseT::eval(tuple<A&>(a));
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <typename A, typename B>
+inline typename actor_result<BaseT, tuple<A&, B&> >::type
+actor<BaseT>::operator()(A& a, B& b) const
+{
+    return BaseT::eval(tuple<A&, B&>(a, b));
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <typename A, typename B, typename C>
+inline typename actor_result<BaseT, tuple<A&, B&, C&> >::type
+actor<BaseT>::operator()(A& a, B& b, C& c) const
+{
+    return BaseT::eval(tuple<A&, B&, C&>(a, b, c));
+}
+
+#if PHOENIX_LIMIT > 3
+//////////////////////////////////
+template <typename BaseT>
+template <typename A, typename B, typename C, typename D>
+inline typename actor_result<BaseT, tuple<A&, B&, C&, D&> >::type
+actor<BaseT>::operator()(A& a, B& b, C& c, D& d) const
+{
+    return BaseT::eval(tuple<A&, B&, C&, D&>(a, b, c, d));
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <typename A, typename B, typename C, typename D, typename E>
+inline typename actor_result<BaseT, tuple<A&, B&, C&, D&, E&> >::type
+actor<BaseT>::operator()(A& a, B& b, C& c, D& d, E& e) const
+{
+    return BaseT::eval(tuple<A&, B&, C&, D&, E&>(a, b, c, d, e));
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F>
+inline typename actor_result<BaseT,
+    tuple<A&, B&, C&, D&, E&, F&>
+>::type
+actor<BaseT>::operator()(
+    A& a, B& b, C& c, D& d, E& e, F& f
+) const
+{
+    return BaseT::eval(
+        tuple<A&, B&, C&, D&, E&, F&>
+        (a, b, c, d, e, f)
+    );
+}
+
+#if PHOENIX_LIMIT > 6
+//////////////////////////////////
+template <typename BaseT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G>
+inline typename actor_result<BaseT,
+    tuple<A&, B&, C&, D&, E&, F&, G&>
+>::type
+actor<BaseT>::operator()(
+    A& a, B& b, C& c, D& d, E& e, F& f, G& g
+) const
+{
+    return BaseT::eval(
+        tuple<A&, B&, C&, D&, E&, F&, G&>
+        (a, b, c, d, e, f, g)
+    );
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H>
+inline typename actor_result<BaseT,
+    tuple<A&, B&, C&, D&, E&, F&, G&, H&>
+>::type
+actor<BaseT>::operator()(
+    A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h
+) const
+{
+    return BaseT::eval(
+        tuple<A&, B&, C&, D&, E&, F&, G&, H&>
+        (a, b, c, d, e, f, g, h)
+    );
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I>
+inline typename actor_result<BaseT,
+    tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&>
+>::type
+actor<BaseT>::operator()(
+    A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i
+) const
+{
+    return BaseT::eval(
+        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&>
+        (a, b, c, d, e, f, g, h, i)
+    );
+}
+
+#if PHOENIX_LIMIT > 9
+//////////////////////////////////
+template <typename BaseT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J>
+inline typename actor_result<BaseT,
+    tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&>
+>::type
+actor<BaseT>::operator()(
+    A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j
+) const
+{
+    return BaseT::eval(
+        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&>
+        (a, b, c, d, e, f, g, h, i, j)
+    );
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K>
+inline typename actor_result<BaseT,
+    tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&>
+>::type
+actor<BaseT>::operator()(
+    A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
+    K& k
+) const
+{
+    return BaseT::eval(
+        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&>
+        (a, b, c, d, e, f, g, h, i, j, k)
+    );
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L>
+inline typename actor_result<BaseT,
+    tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&>
+>::type
+actor<BaseT>::operator()(
+    A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
+    K& k, L& l
+) const
+{
+    return BaseT::eval(
+        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&>
+        (a, b, c, d, e, f, g, h, i, j, k, l)
+    );
+}
+
+#if PHOENIX_LIMIT > 12
+//////////////////////////////////
+template <typename BaseT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M>
+inline typename actor_result<BaseT,
+    tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&>
+>::type
+actor<BaseT>::operator()(
+    A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
+    K& k, L& l, M& m
+) const
+{
+    return BaseT::eval(
+        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&>
+        (a, b, c, d, e, f, g, h, i, j, k, l, m)
+    );
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N>
+inline typename actor_result<BaseT,
+    tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&>
+>::type
+actor<BaseT>::operator()(
+    A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
+    K& k, L& l, M& m, N& n
+) const
+{
+    return BaseT::eval(
+        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&>
+        (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
+    );
+}
+
+//////////////////////////////////
+template <typename BaseT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N, typename O>
+inline typename actor_result<BaseT,
+    tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&, O&>
+>::type
+actor<BaseT>::operator()(
+    A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
+    K& k, L& l, M& m, N& n, O& o
+) const
+{
+    return BaseT::eval(
+        tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&, O&>
+        (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
+    );
+}
+
+#endif
+#endif
+#endif
+#endif
+
+//////////////////////////////////
+template <typename BaseT>
+template <typename TupleT>
+typename actor_result<BaseT, unpack_tuple<TupleT> >::type
+actor<BaseT>::operator()(unpack_tuple<TupleT> const &t) const
+{
+    return BaseT::eval(t);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+}   //  namespace phoenix
+
+#endif
diff --git a/boost/boost/spirit/phoenix/binders.hpp b/boost/boost/spirit/phoenix/binders.hpp
new file mode 100644 (file)
index 0000000..a894ff8
--- /dev/null
@@ -0,0 +1,4067 @@
+/*=============================================================================
+    Phoenix v1.2
+    Copyright (c) 2001-2002 Joel de Guzman
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef PHOENIX_BINDERS_HPP
+#define PHOENIX_BINDERS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/phoenix/functions.hpp>
+#include <boost/type_traits/is_const.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Binders
+//
+//      There are times when it is desireable to bind a simple functor,
+//      function, member function or member variable for deferred
+//      evaluation. This can be done through the binding facilities
+//      provided below. There are template classes:
+//
+//          1) function_ptr           ( function pointer binder )
+//          2) functor                ( functor pointer binder )
+//          3) member_function_ptr    ( member function pointer binder )
+//          4) member_var_ptr         ( member variable pointer binder )
+//
+//      These template classes are specialized lazy function classes for
+//      functors, function pointers, member function pointers and member
+//      variable pointers, respectively. These are subclasses of the
+//      lazy-function class (see functions.hpp). Each of these has a
+//      corresponding overloaded bind(x) function. Each bind(x) function
+//      generates a suitable binder object.
+//
+//      Example, given a function foo:
+//
+//          void foo_(int n) { std::cout << n << std::endl; }
+//
+//      Here's how the function foo is bound:
+//
+//          bind(&foo_)
+//
+//      This bind expression results to a lazy-function (see
+//      functions.hpp) that is lazily evaluated. This bind expression is
+//      also equivalent to:
+//
+//          function_ptr<void, int> foo = &foo_;
+//
+//      The template parameter of the function_ptr is the return and
+//      argument types of actual signature of the function to be bound
+//      read from left to right:
+//
+//          void foo_(int); ---> function_ptr<void, int>
+//
+//      Either bind(&foo_) and its equivalent foo can now be used in the
+//      same way a lazy function (see functions.hpp) is used:
+//
+//          bind(&foo_)(arg1)
+//
+//      or
+//
+//          foo(arg1)
+//
+//      The latter, of course, being much easier to understand. This is
+//      now a full-fledged lazy function that can finally be evaluated
+//      by another function call invocation. A second function call will
+//      invoke the actual foo function:
+//
+//          int i = 4;
+//          foo(arg1)(i);
+//
+//      will print out "4".
+//
+//      Binding functors and member functions can be done similarly.
+//      Here's how to bind a functor (e.g. std::plus<int>):
+//
+//          bind(std::plus<int>())
+//
+//      or
+//
+//          functor<std::plus<int> > plus;
+//
+//      Again, these are full-fledged lazy functions. In this case,
+//      unlike the first example, expect 2 arguments (std::plus<int>
+//      needs two arguments lhs and rhs). Either or both of which can be
+//      lazily bound:
+//
+//          plus(arg1, arg2)     // arg1 + arg2
+//          plus(100, arg1)      // 100 + arg1
+//          plus(100, 200)       // 300
+//
+//      A bound member function takes in a pointer or reference to an
+//      object as the first argument. For instance, given:
+//
+//          struct xyz { void foo(int) const; };
+//
+//      xyz's foo member function can be bound as:
+//
+//          bind(&xyz::foo)
+//
+//      or
+//
+//          member_function_ptr<void, xyz, int> xyz_foo = &xyz::foo;
+//
+//      The template parameter of the member_function_ptr is the return,
+//      class and argument types of actual signature of the function to
+//      be bound read from left to right:
+//
+//          void xyz::foo_(int); ---> member_function_ptr<void, xyz, int>
+//
+//      Take note that a member_function_ptr lazy-function expects the
+//      first argument to be a pointer or reference to an object. Both
+//      the object (reference or pointer) and the arguments can be
+//      lazily bound. Examples:
+//
+//          xyz obj;
+//          xyz_foo(arg1, arg2)   // arg1.foo(arg2)
+//          xyz_foo(obj, arg1)    // obj.foo(arg1)
+//          xyz_foo(obj, 100)     // obj.foo(100)
+//
+//      Be reminded that var(obj) must be used to call non-const member
+//      functions. For example, if xyz was declared as:
+//
+//          struct xyz { void foo(int); };
+//
+//      the pointer or reference to the object must also be non-const.
+//      Lazily bound arguments are stored as const value by default (see
+//      variable class in primitives.hpp).
+//
+//          xyz_foo(var(obj), 100)    // obj.foo(100)
+//
+//      Finally, member variables can be bound much like member
+//      functions. For instance, given:
+//
+//          struct xyz { int v; };
+//
+//      xyz::v can be bound as:
+//
+//          bind(&xyz::v)
+//      or
+//
+//          member_var_ptr<int, xyz> xyz_v = &xyz::v;
+//
+//      The template parameter of the member_var_ptr is the type of the
+//      variable followed by the class:
+//
+//          int xyz::v; ---> member_var_ptr<int, xyz>
+//
+//      Just like the member_function_ptr, member_var_ptr also expects
+//      the first argument to be a pointer or reference to an object.
+//      Both the object (reference or pointer) and the arguments can be
+//      lazily bound. Examples:
+//
+//          xyz obj;
+//          xyz_v(arg1)   // arg1.v
+//          xyz_v(obj)    // obj.v
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Functor binder
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename FuncT>
+struct functor_action : public FuncT {
+
+#if !defined(__BORLANDC__) && (!defined(__MWERKS__) || (__MWERKS__ > 0x3002))
+
+    template <
+            typename A = nil_t
+        ,   typename B = nil_t
+        ,   typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+        ,   typename D = nil_t
+        ,   typename E = nil_t
+        ,   typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+        ,   typename G = nil_t
+        ,   typename H = nil_t
+        ,   typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+        ,   typename J = nil_t
+        ,   typename K = nil_t
+        ,   typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+        ,   typename M = nil_t
+        ,   typename N = nil_t
+        ,   typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+    >
+    struct result { typedef typename FuncT::result_type type; };
+#endif
+
+    functor_action(FuncT fptr_ = FuncT())
+    :   FuncT(fptr_) {}
+};
+
+#if defined(__BORLANDC__) || (defined(__MWERKS__) && (__MWERKS__ <= 0x3002))
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The following specializations are needed because Borland and CodeWarrior
+//  does not accept default template arguments in nested template classes in
+//  classes (i.e functor_action::result)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename FuncT, typename TupleT>
+struct composite0_result<functor_action<FuncT>, TupleT> {
+
+    typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+    typename A>
+struct composite1_result<functor_action<FuncT>, TupleT, A> {
+
+    typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+    typename A, typename B>
+struct composite2_result<functor_action<FuncT>, TupleT, A, B> {
+
+    typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+    typename A, typename B, typename C>
+struct composite3_result<functor_action<FuncT>, TupleT, A, B, C> {
+
+    typedef typename FuncT::result_type type;
+};
+
+#if PHOENIX_LIMIT > 3
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+    typename A, typename B, typename C, typename D>
+struct composite4_result<functor_action<FuncT>, TupleT,
+    A, B, C, D> {
+
+    typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E>
+struct composite5_result<functor_action<FuncT>, TupleT,
+    A, B, C, D, E> {
+
+    typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F>
+struct composite6_result<functor_action<FuncT>, TupleT,
+    A, B, C, D, E, F> {
+
+    typedef typename FuncT::result_type type;
+};
+
+#if PHOENIX_LIMIT > 6
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G>
+struct composite7_result<functor_action<FuncT>, TupleT,
+    A, B, C, D, E, F, G> {
+
+    typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H>
+struct composite8_result<functor_action<FuncT>, TupleT,
+    A, B, C, D, E, F, G, H> {
+
+    typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I>
+struct composite9_result<functor_action<FuncT>, TupleT,
+    A, B, C, D, E, F, G, H, I> {
+
+    typedef typename FuncT::result_type type;
+};
+
+#if PHOENIX_LIMIT > 9
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J>
+struct composite10_result<functor_action<FuncT>, TupleT,
+    A, B, C, D, E, F, G, H, I, J> {
+
+    typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K>
+struct composite11_result<functor_action<FuncT>, TupleT,
+    A, B, C, D, E, F, G, H, I, J, K> {
+
+    typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L>
+struct composite12_result<functor_action<FuncT>, TupleT,
+    A, B, C, D, E, F, G, H, I, J, K, L> {
+
+    typedef typename FuncT::result_type type;
+};
+
+#if PHOENIX_LIMIT > 12
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M>
+struct composite13_result<functor_action<FuncT>, TupleT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M> {
+
+    typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N>
+struct composite14_result<functor_action<FuncT>, TupleT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, N> {
+
+    typedef typename FuncT::result_type type;
+};
+
+//////////////////////////////////
+template <typename FuncT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N, typename O>
+struct composite15_result<functor_action<FuncT>, TupleT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> {
+
+    typedef typename FuncT::result_type type;
+};
+
+#endif
+#endif
+#endif
+#endif
+#endif
+
+//////////////////////////////////
+template <typename FuncT>
+struct functor : public function<functor_action<FuncT> > {
+
+    functor(FuncT func)
+    :   function<functor_action<FuncT> >(functor_action<FuncT>(func)) {};
+};
+
+//////////////////////////////////
+template <typename FuncT>
+inline functor<FuncT>
+bind(FuncT func)
+{
+    return functor<FuncT>(func);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member variable pointer binder
+//
+///////////////////////////////////////////////////////////////////////////////
+namespace impl {
+
+    //////////////////////////////////
+    template <typename T>
+    struct as_ptr {
+
+        typedef T* pointer_type;
+
+        static T* get(T& ref)
+        { return &ref; }
+    };
+
+    //////////////////////////////////
+    template <typename T>
+    struct as_ptr<T*> {
+
+        typedef T* pointer_type;
+
+        static T* get(T* ptr)
+        { return ptr; }
+    };
+}
+
+//////////////////////////////////
+template <typename ActionT, typename ClassT>
+struct member_var_ptr_action_result {
+
+    typedef typename ActionT::template result<ClassT>::type type;
+};
+
+//////////////////////////////////
+template <typename T, typename ClassT>
+struct member_var_ptr_action {
+
+    typedef member_var_ptr_action<T, ClassT> self_t;
+
+    template <typename CT>
+    struct result {
+
+        typedef char is_const[boost::is_const<CT>::value ? 1 : 2];
+        typedef typename impl::if_t<is_const, T const&, T&>::type type;
+    };
+
+    typedef T ClassT::*mem_var_ptr_t;
+
+    member_var_ptr_action(mem_var_ptr_t ptr_)
+    :   ptr(ptr_) {}
+
+    template <typename CT>
+    typename member_var_ptr_action_result<self_t, CT>::type
+    operator()(CT& obj) const
+    { return impl::as_ptr<CT>::get(obj)->*ptr; }
+
+    mem_var_ptr_t ptr;
+};
+
+//////////////////////////////////
+template <typename T, typename ClassT>
+struct member_var_ptr
+:   public function<member_var_ptr_action<T, ClassT> > {
+
+    member_var_ptr(T ClassT::*mp)
+    :   function<member_var_ptr_action<T, ClassT> >
+        (member_var_ptr_action<T, ClassT>(mp)) {}
+};
+
+//////////////////////////////////
+template <typename T, typename ClassT>
+inline member_var_ptr<T, ClassT>
+bind(T ClassT::*mp)
+{
+    return member_var_ptr<T, ClassT>(mp);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (main class)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename RT
+    ,   typename A = nil_t
+    ,   typename B = nil_t
+    ,   typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+    ,   typename D = nil_t
+    ,   typename E = nil_t
+    ,   typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+    ,   typename G = nil_t
+    ,   typename H = nil_t
+    ,   typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+    ,   typename J = nil_t
+    ,   typename K = nil_t
+    ,   typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+    ,   typename M = nil_t
+    ,   typename N = nil_t
+    ,   typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+
+    ,   typename NU = nil_t  // Not used
+>
+struct function_ptr_action;
+
+//////////////////////////////////
+template <
+    typename RT
+    ,   typename A = nil_t
+    ,   typename B = nil_t
+    ,   typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+    ,   typename D = nil_t
+    ,   typename E = nil_t
+    ,   typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+    ,   typename G = nil_t
+    ,   typename H = nil_t
+    ,   typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+    ,   typename J = nil_t
+    ,   typename K = nil_t
+    ,   typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+    ,   typename M = nil_t
+    ,   typename N = nil_t
+    ,   typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+>
+struct function_ptr
+:   public function<function_ptr_action<RT
+    , A, B, C
+#if PHOENIX_LIMIT > 3
+    , D, E, F
+#if PHOENIX_LIMIT > 6
+    , G, H, I
+#if PHOENIX_LIMIT > 9
+    , J, K, L
+#if PHOENIX_LIMIT > 12
+    , M, N, O
+#endif
+#endif
+#endif
+#endif
+    > > {
+
+    typedef function_ptr_action<RT
+        , A, B, C
+#if PHOENIX_LIMIT > 3
+        , D, E, F
+#if PHOENIX_LIMIT > 6
+        , G, H, I
+#if PHOENIX_LIMIT > 9
+        , J, K, L
+#if PHOENIX_LIMIT > 12
+        , M, N, O
+#endif
+#endif
+#endif
+#endif
+    > action_t;
+
+    template <typename FPT>
+    function_ptr(FPT fp)
+    :   function<action_t>(action_t(fp)) {}
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (specialization for 0 arg)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT>
+struct function_ptr_action<RT,
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(*func_ptr_t)();
+
+    function_ptr_action(func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    result_type operator()() const
+    { return fptr(); }
+
+    func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT>
+inline function_ptr<RT>
+bind(RT(*fptr)())
+{
+    return function_ptr<RT>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (specialization for 1 arg)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename A>
+struct function_ptr_action<RT,
+    A, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(*func_ptr_t)(A);
+
+    template <typename A_>
+    struct result { typedef result_type type; };
+
+    function_ptr_action(func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    result_type operator()(A a) const
+    { return fptr(a); }
+
+    func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename A>
+inline function_ptr<RT, A>
+bind(RT(*fptr)(A))
+{
+    return function_ptr<RT, A>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (specialization for 2 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename A, typename B>
+struct function_ptr_action<RT,
+    A, B, nil_t,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(*func_ptr_t)(A, B);
+
+    template <typename A_, typename B_>
+    struct result { typedef result_type type; };
+
+    function_ptr_action(func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    result_type operator()(A a, B b) const
+    { return fptr(a, b); }
+
+    func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename A, typename B>
+inline function_ptr<RT, A, B>
+bind(RT(*fptr)(A, B))
+{
+    return function_ptr<RT, A, B>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (specialization for 3 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename A, typename B, typename C>
+struct function_ptr_action<RT,
+    A, B, C,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(*func_ptr_t)(A, B, C);
+
+    template <typename A_, typename B_, typename C_>
+    struct result { typedef result_type type; };
+
+    function_ptr_action(func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    result_type operator()(A a, B b, C c) const
+    { return fptr(a, b, c); }
+
+    func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename A, typename B, typename C>
+inline function_ptr<RT, A, B, C>
+bind(RT(*fptr)(A, B, C))
+{
+    return function_ptr<RT, A, B, C>(fptr);
+}
+
+#if PHOENIX_LIMIT > 3
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (specialization for 4 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename A, typename B, typename C, typename D>
+struct function_ptr_action<RT,
+    A, B, C, D, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(*func_ptr_t)(A, B, C, D);
+
+    template <typename A_, typename B_, typename C_, typename D_>
+    struct result { typedef result_type type; };
+
+    function_ptr_action(func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    result_type operator()(A a, B b, C c, D d) const
+    { return fptr(a, b, c, d); }
+
+    func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename A, typename B, typename C, typename D>
+inline function_ptr<RT, A, B, C, D>
+bind(RT(*fptr)(A, B, C, D))
+{
+    return function_ptr<RT, A, B, C, D>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (specialization for 5 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E
+>
+struct function_ptr_action<RT,
+    A, B, C, D, E, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(*func_ptr_t)(A, B, C, D, E);
+
+    template <
+        typename A_, typename B_, typename C_, typename D_, typename E_
+    >
+    struct result { typedef result_type type; };
+
+    function_ptr_action(func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e
+    ) const
+    { return fptr(a, b, c, d, e); }
+
+    func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E
+>
+inline function_ptr<RT, A, B, C, D, E>
+bind(RT(*fptr)(A, B, C, D, E))
+{
+    return function_ptr<RT, A, B, C, D, E>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (specialization for 6 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F
+>
+struct function_ptr_action<RT,
+    A, B, C, D, E, F,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(*func_ptr_t)(A, B, C, D, E, F);
+
+    template <
+        typename A_, typename B_, typename C_, typename D_, typename E_,
+        typename F_
+    >
+    struct result { typedef result_type type; };
+
+    function_ptr_action(func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e,
+        F f
+    ) const
+    { return fptr(a, b, c, d, e, f); }
+
+    func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F
+>
+inline function_ptr<RT, A, B, C, D, E, F>
+bind(RT(*fptr)(A, B, C, D, E, F))
+{
+    return function_ptr<RT, A, B, C, D, E, F>(fptr);
+}
+
+#if PHOENIX_LIMIT > 6
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (specialization for 7 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G
+>
+struct function_ptr_action<RT,
+    A, B, C, D, E, F, G, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(*func_ptr_t)(A, B, C, D, E, F, G);
+
+    template <
+        typename A_, typename B_, typename C_, typename D_, typename E_,
+        typename F_, typename G_
+    >
+    struct result { typedef result_type type; };
+
+    function_ptr_action(func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e,
+        F f, G g
+    ) const
+    { return fptr(a, b, c, d, e, f, g); }
+
+    func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G
+>
+inline function_ptr<RT, A, B, C, D, E, F, G>
+bind(RT(*fptr)(A, B, C, D, E, F, G))
+{
+    return function_ptr<RT, A, B, C, D, E, F, G>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (specialization for 8 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H
+>
+struct function_ptr_action<RT,
+    A, B, C, D, E, F, G, H, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H);
+
+    template <
+        typename A_, typename B_, typename C_, typename D_, typename E_,
+        typename F_, typename G_, typename H_
+    >
+    struct result { typedef result_type type; };
+
+    function_ptr_action(func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e,
+        F f, G g, H h
+    ) const
+    { return fptr(a, b, c, d, e, f, g, h); }
+
+    func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H
+>
+inline function_ptr<RT, A, B, C, D, E, F, G, H>
+bind(RT(*fptr)(A, B, C, D, E, F, G, H))
+{
+    return function_ptr<RT, A, B, C, D, E, F, G, H>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (specialization for 9 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I
+>
+struct function_ptr_action<RT,
+    A, B, C, D, E, F, G, H, I,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I);
+
+    template <
+        typename A_, typename B_, typename C_, typename D_, typename E_,
+        typename F_, typename G_, typename H_, typename I_
+    >
+    struct result { typedef result_type type; };
+
+    function_ptr_action(func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e,
+        F f, G g, H h, I i
+    ) const
+    { return fptr(a, b, c, d, e, f, g, h, i); }
+
+    func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I
+>
+inline function_ptr<RT, A, B, C, D, E, F, G, H, I>
+bind(RT(*fptr)(A, B, C, D, E, F, G, H, I))
+{
+    return function_ptr<RT, A, B, C, D, E, F, G, H, I>(fptr);
+}
+
+#if PHOENIX_LIMIT > 9
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (specialization for 10 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J
+>
+struct function_ptr_action<RT,
+    A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J);
+
+    template <
+        typename A_, typename B_, typename C_, typename D_, typename E_,
+        typename F_, typename G_, typename H_, typename I_, typename J_
+    >
+    struct result { typedef result_type type; };
+
+    function_ptr_action(func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e,
+        F f, G g, H h, I i, J j
+    ) const
+    { return fptr(a, b, c, d, e, f, g, h, i, j); }
+
+    func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J
+>
+inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J>
+bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J))
+{
+    return function_ptr<RT, A, B, C, D, E, F, G, H, I, J>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (specialization for 11 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K
+>
+struct function_ptr_action<RT,
+    A, B, C, D, E, F, G, H, I, J, K, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J, K);
+
+    template <
+        typename A_, typename B_, typename C_, typename D_, typename E_,
+        typename F_, typename G_, typename H_, typename I_, typename J_,
+        typename K_
+    >
+    struct result { typedef result_type type; };
+
+    function_ptr_action(func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e,
+        F f, G g, H h, I i, J j,
+        K k
+    ) const
+    { return fptr(a, b, c, d, e, f, g, h, i, j, k); }
+
+    func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K
+>
+inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K>
+bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J, K))
+{
+    return function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (specialization for 12 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L
+>
+struct function_ptr_action<RT,
+    A, B, C, D, E, F, G, H, I, J, K, L,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J, K, L);
+
+    template <
+        typename A_, typename B_, typename C_, typename D_, typename E_,
+        typename F_, typename G_, typename H_, typename I_, typename J_,
+        typename K_, typename L_
+    >
+    struct result { typedef result_type type; };
+
+    function_ptr_action(func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e,
+        F f, G g, H h, I i, J j,
+        K k, L l
+    ) const
+    { return fptr(a, b, c, d, e, f, g, h, i, j, k, l); }
+
+    func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L
+>
+inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L>
+bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J, K, L))
+{
+    return function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L>(fptr);
+}
+
+#if PHOENIX_LIMIT > 12
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (specialization for 13 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M
+>
+struct function_ptr_action<RT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t> {
+
+    typedef RT result_type;
+    typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J, K, L, M);
+
+    template <
+        typename A_, typename B_, typename C_, typename D_, typename E_,
+        typename F_, typename G_, typename H_, typename I_, typename J_,
+        typename K_, typename L_, typename M_
+    >
+    struct result { typedef result_type type; };
+
+    function_ptr_action(func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e,
+        F f, G g, H h, I i, J j,
+        K k, L l, M m
+    ) const
+    { return fptr(a, b, c, d, e, f, g, h, i, j, k, l, m); }
+
+    func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M
+>
+inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M>
+bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M))
+{
+    return function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (specialization for 14 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N
+>
+struct function_ptr_action<RT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t> {
+
+    typedef RT result_type;
+    typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J, K, L, M, N);
+
+    template <
+        typename A_, typename B_, typename C_, typename D_, typename E_,
+        typename F_, typename G_, typename H_, typename I_, typename J_,
+        typename K_, typename L_, typename M_, typename N_
+    >
+    struct result { typedef result_type type; };
+
+    function_ptr_action(func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e,
+        F f, G g, H h, I i, J j,
+        K k, L l, M m, N n
+    ) const
+    { return fptr(a, b, c, d, e, f, g, h, i, j, k, l, m, n); }
+
+    func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N
+>
+inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
+bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N))
+{
+    return function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Function pointer binder (specialization for 15 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N, typename O
+>
+struct function_ptr_action<RT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t> {
+
+    typedef RT result_type;
+    typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O);
+
+    template <
+        typename A_, typename B_, typename C_, typename D_, typename E_,
+        typename F_, typename G_, typename H_, typename I_, typename J_,
+        typename K_, typename L_, typename M_, typename N_, typename O_
+    >
+    struct result { typedef result_type type; };
+
+    function_ptr_action(func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e,
+        F f, G g, H h, I i, J j,
+        K k, L l, M m, N n, O o
+    ) const
+    { return fptr(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o); }
+
+    func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N, typename O
+>
+inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
+bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O))
+{
+    return function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(fptr);
+}
+
+#endif
+#endif
+#endif
+#endif
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (main class)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename RT,
+    typename ClassT
+    ,   typename A = nil_t
+    ,   typename B = nil_t
+    ,   typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+    ,   typename D = nil_t
+    ,   typename E = nil_t
+    ,   typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+    ,   typename G = nil_t
+    ,   typename H = nil_t
+    ,   typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+    ,   typename J = nil_t
+    ,   typename K = nil_t
+    ,   typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+    ,   typename M = nil_t
+    ,   typename N = nil_t
+    ,   typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+
+    ,   typename NU = nil_t  // Not used
+>
+struct member_function_ptr_action;
+
+//////////////////////////////////
+template <
+    typename RT,
+    typename ClassT
+    ,   typename A = nil_t
+    ,   typename B = nil_t
+    ,   typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+    ,   typename D = nil_t
+    ,   typename E = nil_t
+    ,   typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+    ,   typename G = nil_t
+    ,   typename H = nil_t
+    ,   typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+    ,   typename J = nil_t
+    ,   typename K = nil_t
+    ,   typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+    ,   typename M = nil_t
+    ,   typename N = nil_t
+    ,   typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+>
+struct member_function_ptr
+:   public function<member_function_ptr_action<RT, ClassT
+    , A, B, C
+#if PHOENIX_LIMIT > 3
+    , D, E, F
+#if PHOENIX_LIMIT > 6
+    , G, H, I
+#if PHOENIX_LIMIT > 9
+    , J, K, L
+#if PHOENIX_LIMIT > 12
+    , M, N, O
+#endif
+#endif
+#endif
+#endif
+    > > {
+
+    typedef member_function_ptr_action<RT, ClassT
+        , A, B, C
+#if PHOENIX_LIMIT > 3
+        , D, E, F
+#if PHOENIX_LIMIT > 6
+        , G, H, I
+#if PHOENIX_LIMIT > 9
+        , J, K, L
+#if PHOENIX_LIMIT > 12
+        , M, N, O
+#endif
+#endif
+#endif
+#endif
+    > action_t;
+
+    template <typename FPT>
+    member_function_ptr(FPT fp)
+    :   function<action_t>(action_t(fp)) {}
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (specialization for 0 arg)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT>
+struct member_function_ptr_action<RT, ClassT,
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)();
+    typedef RT(ClassT::*cmf)() const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT>
+    struct result { typedef result_type type; };
+
+    member_function_ptr_action(mem_func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    template <typename CT>
+    result_type operator()(CT& obj) const
+    { return (impl::as_ptr<CT>::get(obj)->*fptr)(); }
+
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT>
+inline member_function_ptr<RT, ClassT>
+bind(RT(ClassT::*fptr)())
+{
+    return member_function_ptr<RT, ClassT>(fptr);
+}
+
+template <typename RT, typename ClassT>
+inline member_function_ptr<RT, ClassT const>
+bind(RT(ClassT::*fptr)() const)
+{
+    return member_function_ptr<RT, ClassT const>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (specialization for 1 arg)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT, typename A>
+struct member_function_ptr_action<RT, ClassT,
+    A, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A);
+    typedef RT(ClassT::*cmf)(A) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT, typename A_>
+    struct result { typedef result_type type; };
+
+    member_function_ptr_action(mem_func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    template <typename CT>
+    result_type operator()(CT& obj, A a) const
+    { return (impl::as_ptr<CT>::get(obj)->*fptr)(a); }
+
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A>
+inline member_function_ptr<RT, ClassT, A>
+bind(RT(ClassT::*fptr)(A))
+{
+    return member_function_ptr<RT, ClassT, A>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A>
+inline member_function_ptr<RT, ClassT const, A>
+bind(RT(ClassT::*fptr)(A) const)
+{
+    return member_function_ptr<RT, ClassT const, A>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (specialization for 2 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B>
+struct member_function_ptr_action<RT, ClassT,
+    A, B, nil_t,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B);
+    typedef RT(ClassT::*cmf)(A, B) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT, typename A_, typename B_>
+    struct result { typedef result_type type; };
+
+    member_function_ptr_action(mem_func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    template <typename CT>
+    result_type operator()(CT& obj, A a, B b) const
+    { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b); }
+
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B>
+inline member_function_ptr<RT, ClassT, A, B>
+bind(RT(ClassT::*fptr)(A, B))
+{
+    return member_function_ptr<RT, ClassT, A, B>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B>
+inline member_function_ptr<RT, ClassT const, A, B>
+bind(RT(ClassT::*fptr)(A, B) const)
+{
+    return member_function_ptr<RT, ClassT const, A, B>(fptr);
+}
+
+#if PHOENIX_LIMIT > 3
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (specialization for 3 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B, typename C>
+struct member_function_ptr_action<RT, ClassT,
+    A, B, C, nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C);
+    typedef RT(ClassT::*cmf)(A, B, C) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT, typename A_, typename B_, typename C_>
+    struct result { typedef result_type type; };
+
+    member_function_ptr_action(mem_func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    template <typename CT>
+    result_type operator()(CT& obj, A a, B b, C c) const
+    { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c); }
+
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B, typename C>
+inline member_function_ptr<RT, ClassT, A, B, C>
+bind(RT(ClassT::*fptr)(A, B, C))
+{
+    return member_function_ptr<RT, ClassT, A, B, C>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B, typename C>
+inline member_function_ptr<RT, ClassT const, A, B, C>
+bind(RT(ClassT::*fptr)(A, B, C) const)
+{
+    return member_function_ptr<RT, ClassT const, A, B, C>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (specialization for 4 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D
+>
+struct member_function_ptr_action<RT, ClassT,
+    A, B, C, D, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D);
+    typedef RT(ClassT::*cmf)(A, B, C, D) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT,
+        typename A_, typename B_, typename C_, typename D_
+    >
+    struct result { typedef result_type type; };
+
+    member_function_ptr_action(mem_func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    template <typename CT>
+    result_type operator()(CT& obj,
+        A a, B b, C c, D d
+    ) const
+    { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d); }
+
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D>
+bind(RT(ClassT::*fptr)(A, B, C, D))
+{
+    return member_function_ptr<
+        RT, ClassT, A, B, C, D>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D>
+bind(RT(ClassT::*fptr)(A, B, C, D) const)
+{
+    return member_function_ptr<
+        RT, ClassT const, A, B, C, D>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (specialization for 5 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E
+>
+struct member_function_ptr_action<RT, ClassT,
+    A, B, C, D, E, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT,
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_
+    >
+    struct result { typedef result_type type; };
+
+    member_function_ptr_action(mem_func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    template <typename CT>
+    result_type operator()(CT& obj,
+        A a, B b, C c, D d, E e
+    ) const
+    { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d, e); }
+
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E>
+bind(RT(ClassT::*fptr)(A, B, C, D, E))
+{
+    return member_function_ptr<
+        RT, ClassT, A, B, C, D, E>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E>
+bind(RT(ClassT::*fptr)(A, B, C, D, E) const)
+{
+    return member_function_ptr<
+        RT, ClassT const, A, B, C, D, E>(fptr);
+}
+
+#if PHOENIX_LIMIT > 6
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (specialization for 6 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F
+>
+struct member_function_ptr_action<RT, ClassT,
+    A, B, C, D, E, F, nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT,
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_
+    >
+    struct result { typedef result_type type; };
+
+    member_function_ptr_action(mem_func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    template <typename CT>
+    result_type operator()(CT& obj,
+        A a, B b, C c, D d, E e, F f
+    ) const
+    { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d, e, f); }
+
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F))
+{
+    return member_function_ptr<
+        RT, ClassT, A, B, C, D, E, F>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F) const)
+{
+    return member_function_ptr<
+        RT, ClassT const, A, B, C, D, E, F>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (specialization for 7 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G
+>
+struct member_function_ptr_action<RT, ClassT,
+    A, B, C, D, E, F, G, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT,
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_
+    >
+    struct result { typedef result_type type; };
+
+    member_function_ptr_action(mem_func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    template <typename CT>
+    result_type operator()(CT& obj,
+        A a, B b, C c, D d, E e, F f, G g
+    ) const
+    { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d, e, f, g); }
+
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G))
+{
+    return member_function_ptr<
+        RT, ClassT, A, B, C, D, E, F, G>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G) const)
+{
+    return member_function_ptr<
+        RT, ClassT const, A, B, C, D, E, F, G>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (specialization for 8 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H
+>
+struct member_function_ptr_action<RT, ClassT,
+    A, B, C, D, E, F, G, H, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT,
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_, typename H_
+    >
+    struct result { typedef result_type type; };
+
+    member_function_ptr_action(mem_func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    template <typename CT>
+    result_type operator()(CT& obj,
+        A a, B b, C c, D d, E e, F f, G g, H h
+    ) const
+    { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d, e, f, g, h); }
+
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H))
+{
+    return member_function_ptr<
+        RT, ClassT, A, B, C, D, E, F, G, H>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H) const)
+{
+    return member_function_ptr<
+        RT, ClassT const, A, B, C, D, E, F, G, H>(fptr);
+}
+
+#if PHOENIX_LIMIT > 9
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (specialization for 9 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I
+>
+struct member_function_ptr_action<RT, ClassT,
+    A, B, C, D, E, F, G, H, I, nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT,
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_, typename H_, typename I_
+    >
+    struct result { typedef result_type type; };
+
+    member_function_ptr_action(mem_func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    template <typename CT>
+    result_type operator()(CT& obj,
+        A a, B b, C c, D d, E e, F f, G g, H h, I i
+    ) const
+    { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d, e, f, g, h, i); }
+
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I))
+{
+    return member_function_ptr<
+        RT, ClassT, A, B, C, D, E, F, G, H, I>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I) const)
+{
+    return member_function_ptr<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (specialization for 10 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J
+>
+struct member_function_ptr_action<RT, ClassT,
+    A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT,
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_, typename H_, typename I_,
+        typename J_
+    >
+    struct result { typedef result_type type; };
+
+    member_function_ptr_action(mem_func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    template <typename CT>
+    result_type operator()(CT& obj,
+        A a, B b, C c, D d, E e, F f, G g, H h, I i, J j
+    ) const
+    {
+        return (impl::as_ptr<CT>::get(obj)->*fptr)
+            (a, b, c, d, e, f, g, h, i, j);
+    }
+
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J))
+{
+    return member_function_ptr<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J) const)
+{
+    return member_function_ptr<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (specialization for 11 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K
+>
+struct member_function_ptr_action<RT, ClassT,
+    A, B, C, D, E, F, G, H, I, J, K, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT,
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_, typename H_, typename I_,
+        typename J_, typename K_
+    >
+    struct result { typedef result_type type; };
+
+    member_function_ptr_action(mem_func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    template <typename CT>
+    result_type operator()(CT& obj,
+        A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k
+    ) const
+    {
+        return (impl::as_ptr<CT>::get(obj)->*fptr)
+            (a, b, c, d, e, f, g, h, i, j, k);
+    }
+
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K))
+{
+    return member_function_ptr<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K) const)
+{
+    return member_function_ptr<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>(fptr);
+}
+
+#if PHOENIX_LIMIT > 12
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (specialization for 12 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L
+>
+struct member_function_ptr_action<RT, ClassT,
+    A, B, C, D, E, F, G, H, I, J, K, L, nil_t, nil_t, nil_t, nil_t> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT,
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_, typename H_, typename I_,
+        typename J_, typename K_, typename L_
+    >
+    struct result { typedef result_type type; };
+
+    member_function_ptr_action(mem_func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    template <typename CT>
+    result_type operator()(CT& obj,
+        A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l
+    ) const
+    {
+        return (impl::as_ptr<CT>::get(obj)->*fptr)
+            (a, b, c, d, e, f, g, h, i, j, k, l);
+    }
+
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L))
+{
+    return member_function_ptr<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L) const)
+{
+    return member_function_ptr<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (specialization for 13 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M
+>
+struct member_function_ptr_action<RT, ClassT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT,
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_, typename H_, typename I_,
+        typename J_, typename K_, typename L_, typename M_
+    >
+    struct result { typedef result_type type; };
+
+    member_function_ptr_action(mem_func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    template <typename CT>
+    result_type operator()(CT& obj,
+        A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m
+    ) const
+    {
+        return (impl::as_ptr<CT>::get(obj)->*fptr)
+            (a, b, c, d, e, f, g, h, i, j, k, l, m);
+    }
+
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M))
+{
+    return member_function_ptr<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M) const)
+{
+    return member_function_ptr<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (specialization for 14 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M, typename N
+>
+struct member_function_ptr_action<RT, ClassT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT,
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_, typename H_, typename I_,
+        typename J_, typename K_, typename L_, typename M_, typename N_
+    >
+    struct result { typedef result_type type; };
+
+    member_function_ptr_action(mem_func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    template <typename CT>
+    result_type operator()(CT& obj,
+        A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m, N n
+    ) const
+    {
+        return (impl::as_ptr<CT>::get(obj)->*fptr)
+            (a, b, c, d, e, f, g, h, i, j, k, l, m, n);
+    }
+
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M, typename N
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N))
+{
+    return member_function_ptr<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M, typename N
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N) const)
+{
+    return member_function_ptr<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Member function pointer binder (specialization for 15 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M, typename N,
+    typename O
+>
+struct member_function_ptr_action<RT, ClassT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT,
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_, typename H_, typename I_,
+        typename J_, typename K_, typename L_, typename M_, typename N_,
+        typename O_
+    >
+    struct result { typedef result_type type; };
+
+    member_function_ptr_action(mem_func_ptr_t fptr_)
+    :   fptr(fptr_) {}
+
+    template <typename CT>
+    result_type operator()(CT& obj,
+        A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m, N n, O o
+    ) const
+    {
+        return (impl::as_ptr<CT>::get(obj)->*fptr)
+            (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
+    }
+
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M, typename N,
+    typename O
+>
+inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O))
+{
+    return member_function_ptr<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M, typename N,
+    typename O
+>
+inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
+bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) const)
+{
+    return member_function_ptr<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(fptr);
+}
+
+#endif
+#endif
+#endif
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (main class)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename RT,
+    typename ClassT
+    ,   typename A = nil_t
+    ,   typename B = nil_t
+    ,   typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+    ,   typename D = nil_t
+    ,   typename E = nil_t
+    ,   typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+    ,   typename G = nil_t
+    ,   typename H = nil_t
+    ,   typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+    ,   typename J = nil_t
+    ,   typename K = nil_t
+    ,   typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+    ,   typename M = nil_t
+    ,   typename N = nil_t
+    ,   typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+
+    ,   typename NU = nil_t  // Not used
+>
+struct bound_member_action;
+
+//////////////////////////////////
+template <
+    typename RT,
+    typename ClassT
+    ,   typename A = nil_t
+    ,   typename B = nil_t
+    ,   typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+    ,   typename D = nil_t
+    ,   typename E = nil_t
+    ,   typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+    ,   typename G = nil_t
+    ,   typename H = nil_t
+    ,   typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+    ,   typename J = nil_t
+    ,   typename K = nil_t
+    ,   typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+    ,   typename M = nil_t
+    ,   typename N = nil_t
+    ,   typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+>
+struct bound_member
+:   public function<bound_member_action<RT, ClassT
+    , A, B, C
+#if PHOENIX_LIMIT > 3
+    , D, E, F
+#if PHOENIX_LIMIT > 6
+    , G, H, I
+#if PHOENIX_LIMIT > 9
+    , J, K, L
+#if PHOENIX_LIMIT > 12
+    , M, N, O
+#endif
+#endif
+#endif
+#endif
+    > > {
+
+    typedef bound_member_action<RT, ClassT
+        , A, B, C
+#if PHOENIX_LIMIT > 3
+        , D, E, F
+#if PHOENIX_LIMIT > 6
+        , G, H, I
+#if PHOENIX_LIMIT > 9
+        , J, K, L
+#if PHOENIX_LIMIT > 12
+        , M, N, O
+#endif
+#endif
+#endif
+#endif
+    > action_t;
+
+    template <typename CT, typename FPT>
+    bound_member(CT & c, FPT fp)
+    :   function<action_t>(action_t(c,fp)) {}
+
+#if !defined(__BORLANDC__)
+    template <typename CT, typename FPT>
+    bound_member(CT * c, FPT fp)
+    :   function<action_t>(action_t(c,fp)) {}
+#endif
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (specialization for 0 arg)
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename RT, typename ClassT>
+struct bound_member_action<RT, ClassT,
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)();
+    typedef RT(ClassT::*cmf)() const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename CT>
+    struct result { typedef result_type type; };
+
+    template <typename CT>
+    bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+    :   obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+    result_type operator()() const
+    { return (obj->*fptr)(); }
+
+    typename impl::as_ptr<ClassT>::pointer_type obj;
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+
+template <typename RT, typename ClassT>
+inline bound_member<RT,ClassT>
+bind(ClassT & obj, RT(ClassT::*fptr)())
+{
+    return bound_member<RT,ClassT>(obj, fptr);
+}
+
+template <typename RT, typename ClassT>
+inline bound_member<RT,ClassT>
+bind(ClassT * obj, RT(ClassT::*fptr)())
+{
+#if defined(__MWERKS__) && (__MWERKS__ < 0x3003)
+    return bound_member<RT,ClassT>(*obj, fptr);
+#else
+    return bound_member<RT,ClassT>(obj, fptr);
+#endif
+}
+
+template <typename RT, typename ClassT>
+inline bound_member<RT,ClassT const>
+bind(ClassT const& obj, RT(ClassT::*fptr)())
+{
+    return bound_member<RT,ClassT const>(obj, fptr);
+}
+
+template <typename RT, typename ClassT>
+inline bound_member<RT,ClassT const>
+bind(ClassT  const* obj, RT(ClassT::*fptr)() const)
+{
+#if defined(__MWERKS__) && (__MWERKS__ < 0x3003)
+    return bound_member<RT,ClassT const>(*obj, fptr);
+#else
+    return bound_member<RT,ClassT const>(obj, fptr);
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (specialization for 1 arg)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT, typename A>
+struct bound_member_action<RT, ClassT,
+    A, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A);
+    typedef RT(ClassT::*cmf)(A) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename A_>
+    struct result { typedef result_type type; };
+
+    template <typename CT>
+    bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+    :   obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+    result_type operator()(A a) const
+    { return (obj->*fptr)(a); }
+
+    typename impl::as_ptr<ClassT>::pointer_type obj;
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A>
+inline bound_member<RT, ClassT, A>
+bind(ClassT & obj, RT(ClassT::*fptr)(A))
+{
+    return bound_member<RT, ClassT, A>(obj,fptr);
+}
+
+template <typename RT, typename ClassT, typename A>
+inline bound_member<RT, ClassT, A>
+bind(ClassT * obj, RT(ClassT::*fptr)(A))
+{
+    return bound_member<RT, ClassT, A>(obj,fptr);
+}
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A>
+inline bound_member<RT, ClassT const, A>
+bind(ClassT const& obj, RT(ClassT::*fptr)(A) const)
+{
+    return bound_member<RT, ClassT const, A>(obj,fptr);
+}
+
+template <typename RT, typename ClassT, typename A>
+inline bound_member<RT, ClassT const, A>
+bind(ClassT const* obj, RT(ClassT::*fptr)(A) const)
+{
+    return bound_member<RT, ClassT const, A>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (specialization for 2 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B>
+struct bound_member_action<RT, ClassT,
+    A, B, nil_t,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B);
+    typedef RT(ClassT::*cmf)(A, B) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename A_, typename B_>
+    struct result { typedef result_type type; };
+
+    template <typename CT>
+    bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+    :   obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+    result_type operator()(A a, B b) const
+    { return (obj->*fptr)(a, b); }
+
+    typename impl::as_ptr<ClassT>::pointer_type obj;
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B>
+inline bound_member<RT, ClassT, A, B>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B))
+{
+    return bound_member<RT, ClassT, A, B>(obj,fptr);
+}
+
+template <typename RT, typename ClassT, typename A, typename B>
+inline bound_member<RT, ClassT, A, B>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B))
+{
+    return bound_member<RT, ClassT, A, B>(obj,fptr);
+}
+
+template <typename RT, typename ClassT, typename A, typename B>
+inline bound_member<RT, ClassT const, A, B>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B) const)
+{
+    return bound_member<RT, ClassT const, A, B>(obj,fptr);
+}
+
+template <typename RT, typename ClassT, typename A, typename B>
+inline bound_member<RT, ClassT const, A, B>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B) const)
+{
+    return bound_member<RT, ClassT const, A, B>(obj,fptr);
+}
+
+#if PHOENIX_LIMIT > 3
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (specialization for 3 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B, typename C>
+struct bound_member_action<RT, ClassT,
+    A, B, C, nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C);
+    typedef RT(ClassT::*cmf)(A, B, C) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename A_, typename B_, typename C_>
+    struct result { typedef result_type type; };
+
+    template <typename CT>
+    bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+    :   obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+    result_type operator()(A a, B b, C c) const
+    { return (obj->*fptr)(a, b, c); }
+
+    typename impl::as_ptr<ClassT>::pointer_type obj;
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT, typename A, typename B, typename C>
+inline bound_member<RT, ClassT, A, B, C>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C))
+{
+    return bound_member<RT, ClassT, A, B, C>(obj,fptr);
+}
+
+template <typename RT, typename ClassT, typename A, typename B, typename C>
+inline bound_member<RT, ClassT, A, B, C>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C))
+{
+    return bound_member<RT, ClassT, A, B, C>(obj,fptr);
+}
+
+template <typename RT, typename ClassT, typename A, typename B, typename C>
+inline bound_member<RT, ClassT const, A, B, C>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C) const)
+{
+    return bound_member<RT, ClassT const, A, B, C>(obj,fptr);
+}
+
+template <typename RT, typename ClassT, typename A, typename B, typename C>
+inline bound_member<RT, ClassT const, A, B, C>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C) const)
+{
+    return bound_member<RT, ClassT const, A, B, C>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (specialization for 4 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D
+>
+struct bound_member_action<RT, ClassT,
+    A, B, C, D, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D);
+    typedef RT(ClassT::*cmf)(A, B, C, D) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename A_, typename B_, typename C_, typename D_>
+    struct result { typedef result_type type; };
+
+    template <typename CT>
+    bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+    :   obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+    result_type operator()(A a, B b, C c, D d) const
+    { return (obj->*fptr)(a, b, c, d); }
+
+    typename impl::as_ptr<ClassT>::pointer_type obj;
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D
+>
+inline bound_member<RT, ClassT, A, B, C, D>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D
+>
+inline bound_member<RT, ClassT, A, B, C, D>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D
+>
+inline bound_member<RT, ClassT const, A, B, C, D>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D
+>
+inline bound_member<RT, ClassT const, A, B, C, D>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (specialization for 5 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E
+>
+struct bound_member_action<RT, ClassT,
+    A, B, C, D, E, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <typename A_, typename B_, typename C_, typename D_,
+        typename E_
+    >
+    struct result { typedef result_type type; };
+
+    template <typename CT>
+    bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+    :   obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e
+    ) const
+    { return (obj->*fptr)(a, b, c, d, e); }
+
+    typename impl::as_ptr<ClassT>::pointer_type obj;
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E
+>
+inline bound_member<RT, ClassT, A, B, C, D, E>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E
+>
+inline bound_member<RT, ClassT, A, B, C, D, E>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E>(obj,fptr);
+}
+
+#if PHOENIX_LIMIT > 6
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (specialization for 6 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F
+>
+struct bound_member_action<RT, ClassT,
+    A, B, C, D, E, F, nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_
+    >
+    struct result { typedef result_type type; };
+
+    template <typename CT>
+    bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+    :   obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e, F f
+    ) const
+    { return (obj->*fptr)(a, b, c, d, e, f); }
+
+    typename impl::as_ptr<ClassT>::pointer_type obj;
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (specialization for 7 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G
+>
+struct bound_member_action<RT, ClassT,
+    A, B, C, D, E, F, G, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_
+    >
+    struct result { typedef result_type type; };
+
+    template <typename CT>
+    bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+    :   obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e, F f, G g
+    ) const
+    { return (obj->*fptr)(a, b, c, d, e, f, g); }
+
+    typename impl::as_ptr<ClassT>::pointer_type obj;
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (specialization for 8 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H
+>
+struct bound_member_action<RT, ClassT,
+    A, B, C, D, E, F, G, H, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_, typename H_
+    >
+    struct result { typedef result_type type; };
+
+    template <typename CT>
+    bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+    :   obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e, F f, G g, H h
+    ) const
+    { return (obj->*fptr)(a, b, c, d, e, f, g, h); }
+
+    typename impl::as_ptr<ClassT>::pointer_type obj;
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G, H>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G, H>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G, H>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G, H>(obj,fptr);
+}
+
+#if PHOENIX_LIMIT > 9
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (specialization for 9 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I
+>
+struct bound_member_action<RT, ClassT,
+    A, B, C, D, E, F, G, H, I, nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_, typename H_, typename I_
+    >
+    struct result { typedef result_type type; };
+
+    template <typename CT>
+    bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+    :   obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e, F f, G g, H h, I i
+    ) const
+    { return (obj->*fptr)(a, b, c, d, e, f, g, h, i); }
+
+    typename impl::as_ptr<ClassT>::pointer_type obj;
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G, H, I>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G, H, I>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (specialization for 10 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J
+>
+struct bound_member_action<RT, ClassT,
+    A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_, typename H_, typename I_,
+        typename J_
+    >
+    struct result { typedef result_type type; };
+
+    template <typename CT>
+    bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+    :   obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e, F f, G g, H h, I i, J j
+    ) const
+    {
+        return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j);
+    }
+
+    typename impl::as_ptr<ClassT>::pointer_type obj;
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (specialization for 11 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K
+>
+struct bound_member_action<RT, ClassT,
+    A, B, C, D, E, F, G, H, I, J, K, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_, typename H_, typename I_,
+        typename J_, typename K_
+    >
+    struct result { typedef result_type type; };
+
+    template <typename CT>
+    bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+    :   obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k
+    ) const
+    {
+        return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j, k);
+    }
+
+    typename impl::as_ptr<ClassT>::pointer_type obj;
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>(obj,fptr);
+}
+
+#if PHOENIX_LIMIT > 12
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (specialization for 12 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L
+>
+struct bound_member_action<RT, ClassT,
+    A, B, C, D, E, F, G, H, I, J, K, L, nil_t, nil_t, nil_t, nil_t> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_, typename H_, typename I_,
+        typename J_, typename K_, typename L_
+    >
+    struct result { typedef result_type type; };
+
+    template <typename CT>
+    bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+    :   obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l
+    ) const
+    {
+        return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j, k, l);
+    }
+
+    typename impl::as_ptr<ClassT>::pointer_type obj;
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (specialization for 13 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M
+>
+struct bound_member_action<RT, ClassT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_, typename H_, typename I_,
+        typename J_, typename K_, typename L_, typename M_
+    >
+    struct result { typedef result_type type; };
+
+    template <typename CT>
+    bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+    :   obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m
+    ) const
+    {
+        return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j, k, l, m);
+    }
+
+    typename impl::as_ptr<ClassT>::pointer_type obj;
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (specialization for 14 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M, typename N
+>
+struct bound_member_action<RT, ClassT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_, typename H_, typename I_,
+        typename J_, typename K_, typename L_, typename M_, typename N_
+    >
+    struct result { typedef result_type type; };
+
+    template <typename CT>
+    bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+    :   obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m, N n
+    ) const
+    {
+        return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
+    }
+
+    typename impl::as_ptr<ClassT>::pointer_type obj;
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M, typename N
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M, typename N
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M, typename N
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M, typename N
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(obj,fptr);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Bound member function binder (specialization for 15 args)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M, typename N,
+    typename O
+>
+struct bound_member_action<RT, ClassT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t> {
+
+    typedef RT result_type;
+    typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O);
+    typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) const;
+    typedef char is_const[boost::is_const<ClassT>::value ? 1 : 2];
+    typedef typename impl::if_t<is_const, cmf, mf>::type mem_func_ptr_t;
+
+    template <
+        typename A_, typename B_, typename C_, typename D_,
+        typename E_, typename F_, typename G_, typename H_, typename I_,
+        typename J_, typename K_, typename L_, typename M_, typename N_,
+        typename O_
+    >
+    struct result { typedef result_type type; };
+
+    template <typename CT>
+    bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
+    :   obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
+
+    result_type operator()(
+        A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m, N n, O o
+    ) const
+    {
+        return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
+    }
+
+    typename impl::as_ptr<ClassT>::pointer_type obj;
+    mem_func_ptr_t fptr;
+};
+
+//////////////////////////////////
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M, typename N,
+    typename O
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
+bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M, typename N,
+    typename O
+>
+inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
+bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O))
+{
+    return bound_member<
+        RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M, typename N,
+    typename O
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
+bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(obj,fptr);
+}
+
+template <typename RT, typename ClassT,
+    typename A, typename B, typename C, typename D,
+    typename E, typename F, typename G, typename H, typename I,
+    typename J, typename K, typename L, typename M, typename N,
+    typename O
+>
+inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
+bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) const)
+{
+    return bound_member<
+        RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(obj,fptr);
+}
+
+#endif
+#endif
+#endif
+#endif
+
+}   //  namespace phoenix
+
+#endif
diff --git a/boost/boost/spirit/phoenix/casts.hpp b/boost/boost/spirit/phoenix/casts.hpp
new file mode 100644 (file)
index 0000000..3782e9f
--- /dev/null
@@ -0,0 +1,1471 @@
+/*=============================================================================
+    Phoenix V1.2.1
+    Copyright (c) 2001-2003 Joel de Guzman
+    Copyright (c) 2001-2003 Hartmut Kaiser
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#ifndef PHOENIX_CASTS_HPP
+#define PHOENIX_CASTS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/phoenix/actor.hpp>
+#include <boost/spirit/phoenix/composite.hpp>
+#include <boost/static_assert.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Phoenix predefined maximum construct_ limit. This limit defines the maximum
+//  number of parameters supported for calles to the set of construct_ template
+//  functions (lazy object construction, see below). This number defaults to 3.
+//  The actual maximum is rounded up in multiples of 3. Thus, if this value
+//  is 4, the actual limit is 6. The ultimate maximum limit in this
+//  implementation is 15.
+//  PHOENIX_CONSTRUCT_LIMIT should NOT be greater than PHOENIX_LIMIT!
+
+#if !defined(PHOENIX_CONSTRUCT_LIMIT)
+#define PHOENIX_CONSTRUCT_LIMIT PHOENIX_LIMIT
+#endif
+
+// ensure PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT
+BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT);
+
+// ensure PHOENIX_CONSTRUCT_LIMIT <= 15
+BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= 15);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Lazy C++ casts
+//
+//      The set of lazy C++ cast template classes and functions provide a way
+//      of lazily casting certain type to another during parsing.
+//      The lazy C++ templates are (syntactically) used very much like
+//      the well known C++ casts:
+//
+//          A *a = static_cast_<A *>(...actor returning a convertible type...);
+//
+//      where the given parameter should be an actor, which eval() function
+//      returns a convertible type.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T, typename A>
+struct static_cast_l {
+
+    template <typename TupleT>
+    struct result { typedef T type; };
+
+    static_cast_l(A const& a_)
+    :   a(a_) {}
+
+    template <typename TupleT>
+    T
+    eval(TupleT const& args) const
+    {
+        return static_cast<T>(a.eval(args));
+    }
+
+    A a;
+};
+
+//////////////////////////////////
+template <typename T, typename BaseAT>
+inline actor<static_cast_l<T, BaseAT> >
+static_cast_(actor<BaseAT> const& a)
+{
+    typedef static_cast_l<T, BaseAT> cast_t;
+    return actor<cast_t>(cast_t(a));
+}
+
+//////////////////////////////////
+template <typename T, typename A>
+struct dynamic_cast_l {
+
+    template <typename TupleT>
+    struct result { typedef T type; };
+
+    dynamic_cast_l(A const& a_)
+    :   a(a_) {}
+
+    template <typename TupleT>
+    T
+    eval(TupleT const& args) const
+    {
+        return dynamic_cast<T>(a.eval(args));
+    }
+
+    A a;
+};
+
+//////////////////////////////////
+template <typename T, typename BaseAT>
+inline actor<dynamic_cast_l<T, BaseAT> >
+dynamic_cast_(actor<BaseAT> const& a)
+{
+    typedef dynamic_cast_l<T, BaseAT> cast_t;
+    return actor<cast_t>(cast_t(a));
+}
+
+//////////////////////////////////
+template <typename T, typename A>
+struct reinterpret_cast_l {
+
+    template <typename TupleT>
+    struct result { typedef T type; };
+
+    reinterpret_cast_l(A const& a_)
+    :   a(a_) {}
+
+    template <typename TupleT>
+    T
+    eval(TupleT const& args) const
+    {
+        return reinterpret_cast<T>(a.eval(args));
+    }
+
+    A a;
+};
+
+//////////////////////////////////
+template <typename T, typename BaseAT>
+inline actor<reinterpret_cast_l<T, BaseAT> >
+reinterpret_cast_(actor<BaseAT> const& a)
+{
+    typedef reinterpret_cast_l<T, BaseAT> cast_t;
+    return actor<cast_t>(cast_t(a));
+}
+
+//////////////////////////////////
+template <typename T, typename A>
+struct const_cast_l {
+
+    template <typename TupleT>
+    struct result { typedef T type; };
+
+    const_cast_l(A const& a_)
+    :   a(a_) {}
+
+    template <typename TupleT>
+    T
+    eval(TupleT const& args) const
+    {
+        return const_cast<T>(a.eval(args));
+    }
+
+    A a;
+};
+
+//////////////////////////////////
+template <typename T, typename BaseAT>
+inline actor<const_cast_l<T, BaseAT> >
+const_cast_(actor<BaseAT> const& a)
+{
+    typedef const_cast_l<T, BaseAT> cast_t;
+    return actor<cast_t>(cast_t(a));
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  construct_
+//
+//      Lazy object construction
+//
+//      The set of construct_<> template classes and functions provide a way
+//      of lazily constructing certain object from a arbitrary set of
+//      actors during parsing.
+//      The construct_ templates are (syntactically) used very much like
+//      the well known C++ casts:
+//
+//          A a = construct_<A>(...arbitrary list of actors...);
+//
+//      where the given parameters are submitted as parameters to the
+//      contructor of the object of type A. (This certainly implies, that
+//      type A has a constructor with a fitting set of parameter types
+//      defined.)
+//
+//      The maximum number of needed parameters is controlled through the
+//      preprocessor constant PHOENIX_CONSTRUCT_LIMIT. Note though, that this
+//      limit should not be greater than PHOENIX_LIMIT.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+struct construct_l_0 {
+    typedef T result_type;
+
+    T operator()() const {
+        return T();
+    }
+};
+
+
+template <typename T>
+struct construct_l {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+
+#if PHOENIX_CONSTRUCT_LIMIT > 3
+        ,   typename D
+        ,   typename E
+        ,   typename F
+
+#if PHOENIX_CONSTRUCT_LIMIT > 6
+        ,   typename G
+        ,   typename H
+        ,   typename I
+
+#if PHOENIX_CONSTRUCT_LIMIT > 9
+        ,   typename J
+        ,   typename K
+        ,   typename L
+
+#if PHOENIX_CONSTRUCT_LIMIT > 12
+        ,   typename M
+        ,   typename N
+        ,   typename O
+#endif
+#endif
+#endif
+#endif
+    >
+    struct result { typedef T type; };
+
+    T operator()() const 
+    {
+        return T();
+    }
+
+    template <typename A>
+    T operator()(A const& a) const 
+    {
+        T t(a); 
+        return t;
+    }
+
+    template <typename A, typename B>
+    T operator()(A const& a, B const& b) const 
+    {
+        T t(a, b);
+        return t;
+    }
+
+    template <typename A, typename B, typename C>
+    T operator()(A const& a, B const& b, C const& c) const 
+    {
+        T t(a, b, c);
+        return t;
+    }
+
+#if PHOENIX_CONSTRUCT_LIMIT > 3
+    template <
+        typename A, typename B, typename C, typename D
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d) const
+    {
+        T t(a, b, c, d);
+        return t;
+    }
+
+    template <
+        typename A, typename B, typename C, typename D, typename E
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e) const
+    {
+        T t(a, b, c, d, e);
+        return t;
+    }
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f) const
+    {
+        T t(a, b, c, d, e, f);
+        return t;
+    }
+
+#if PHOENIX_CONSTRUCT_LIMIT > 6
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g) const
+    {
+        T t(a, b, c, d, e, f, g);
+        return t;
+    }
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h) const
+    {
+        T t(a, b, c, d, e, f, g, h);
+        return t;
+    }
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i) const
+    {
+        T t(a, b, c, d, e, f, g, h, i);
+        return t;
+    }
+
+#if PHOENIX_CONSTRUCT_LIMIT > 9
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j) const
+    {
+        T t(a, b, c, d, e, f, g, h, i, j);
+        return t;
+    }
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k) const
+    {
+        T t(a, b, c, d, e, f, g, h, i, j, k);
+        return t;
+    }
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l) const
+    {
+        T t(a, b, c, d, e, f, g, h, i, j, k, l);
+        return t;
+    }
+
+#if PHOENIX_CONSTRUCT_LIMIT > 12
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l, M const& m) const
+    {
+        T t(a, b, c, d, e, f, g, h, i, j, k, l, m);
+        return t;
+    }
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M, typename N
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l, M const& m, N const& n) const
+    {
+        T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
+        return t;
+    }
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M, typename N, typename O
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l, M const& m, N const& n, O const& o) const
+    {
+        T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
+        return t;
+    }
+
+#endif
+#endif
+#endif
+#endif
+};
+
+
+template <typename T>
+struct construct_1 {
+
+    template <
+            typename A
+    >
+    struct result { typedef T type; };
+
+    template <typename A>
+    T operator()(A const& a) const 
+    {
+        T t(a);
+        return t;
+    }
+
+};
+
+template <typename T>
+struct construct_2 {
+
+    template <
+            typename A
+        ,   typename B
+    >
+    struct result { typedef T type; };
+
+    template <typename A, typename B>
+    T operator()(A const& a, B const& b) const 
+    {
+        T t(a, b);
+        return t;
+    }
+
+};
+
+template <typename T>
+struct construct_3 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+    >
+    struct result { typedef T type; };
+
+    template <typename A, typename B, typename C>
+    T operator()(A const& a, B const& b, C const& c) const 
+    {
+        T t(a, b, c);
+        return t;
+    }
+};
+
+#if PHOENIX_CONSTRUCT_LIMIT > 3
+template <typename T>
+struct construct_4 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+    >
+    struct result { typedef T type; };
+
+    template <
+        typename A, typename B, typename C, typename D
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d) const
+    {
+        T t(a, b, c, d);
+        return t;
+    }
+};
+
+
+template <typename T>
+struct construct_5 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+    >
+    struct result { typedef T type; };
+
+    template <
+        typename A, typename B, typename C, typename D, typename E
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e) const
+    {
+        T t(a, b, c, d, e);
+        return t;
+    }
+};
+
+
+template <typename T>
+struct construct_6 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+    >
+    struct result { typedef T type; };
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f) const
+    {
+        T t(a, b, c, d, e, f);
+        return t;
+    }
+};
+#endif
+
+
+#if PHOENIX_CONSTRUCT_LIMIT > 6
+template <typename T>
+struct construct_7 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+    >
+    struct result { typedef T type; };
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g) const
+    {
+        T t(a, b, c, d, e, f, g);
+        return t;
+    }
+};
+
+template <typename T>
+struct construct_8 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+        ,   typename H
+    >
+    struct result { typedef T type; };
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h) const
+    {
+        T t(a, b, c, d, e, f, g, h);
+        return t;
+    }
+};
+
+template <typename T>
+struct construct_9 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+        ,   typename H
+        ,   typename I
+    >
+    struct result { typedef T type; };
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i) const
+    {
+        T t(a, b, c, d, e, f, g, h, i);
+        return t;
+    }
+};
+#endif
+
+
+#if PHOENIX_CONSTRUCT_LIMIT > 9
+template <typename T>
+struct construct_10 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+        ,   typename H
+        ,   typename I
+        ,   typename J
+    >
+    struct result { typedef T type; };
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j) const
+    {
+        T t(a, b, c, d, e, f, g, h, i, j);
+        return t;
+    }
+};
+
+template <typename T>
+struct construct_11 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+        ,   typename H
+        ,   typename I
+        ,   typename J
+        ,   typename K
+    >
+    struct result { typedef T type; };
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k) const
+    {
+        T t(a, b, c, d, e, f, g, h, i, j, k);
+        return t;
+    }
+};
+
+template <typename T>
+struct construct_12 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+        ,   typename H
+        ,   typename I
+        ,   typename J
+        ,   typename K
+        ,   typename L
+    >
+    struct result { typedef T type; };
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l) const
+    {
+        T t(a, b, c, d, f, e, g, h, i, j, k, l);
+        return t;
+    }
+};
+#endif
+
+#if PHOENIX_CONSTRUCT_LIMIT > 12
+template <typename T>
+struct construct_13 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+        ,   typename H
+        ,   typename I
+        ,   typename J
+        ,   typename K
+        ,   typename L
+        ,   typename M
+    >
+    struct result { typedef T type; };
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l, M const& m) const
+    {
+        T t(a, b, c, d, e, f, g, h, i, j, k, l, m);
+        return t;
+    }
+};
+
+template <typename T>
+struct construct_14 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+        ,   typename H
+        ,   typename I
+        ,   typename J
+        ,   typename K
+        ,   typename L
+        ,   typename M
+        ,   typename N
+    >
+    struct result { typedef T type; };
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M, typename N
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l, M const& m, N const& n) const
+    {
+        T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
+        return t;
+    }
+};
+
+template <typename T>
+struct construct_15 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+        ,   typename H
+        ,   typename I
+        ,   typename J
+        ,   typename K
+        ,   typename L
+        ,   typename M
+        ,   typename N
+        ,   typename O
+    >
+    struct result { typedef T type; };
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M, typename N, typename O
+    >
+    T operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l, M const& m, N const& n, O const& o) const
+    {
+        T t(a, b, c, d, f, e, g, h, i, j, k, l, m, n, o);
+        return t;
+    }
+};
+#endif
+
+
+#if defined(__BORLANDC__) || (defined(__MWERKS__) && (__MWERKS__ <= 0x3002))
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The following specializations are needed because Borland and CodeWarrior
+//  does not accept default template arguments in nested template classes in
+//  classes (i.e construct_l::result)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T, typename TupleT>
+struct composite0_result<construct_l_0<T>, TupleT> {
+
+    typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A>
+struct composite1_result<construct_l<T>, TupleT, A> {
+
+    typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B>
+struct composite2_result<construct_l<T>, TupleT, A, B> {
+
+    typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C>
+struct composite3_result<construct_l<T>, TupleT, A, B, C> {
+
+    typedef T type;
+};
+
+#if PHOENIX_LIMIT > 3
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D>
+struct composite4_result<construct_l<T>, TupleT,
+    A, B, C, D> {
+
+    typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E>
+struct composite5_result<construct_l<T>, TupleT,
+    A, B, C, D, E> {
+
+    typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F>
+struct composite6_result<construct_l<T>, TupleT,
+    A, B, C, D, E, F> {
+
+    typedef T type;
+};
+
+#if PHOENIX_LIMIT > 6
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G>
+struct composite7_result<construct_l<T>, TupleT,
+    A, B, C, D, E, F, G> {
+
+    typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H>
+struct composite8_result<construct_l<T>, TupleT,
+    A, B, C, D, E, F, G, H> {
+
+    typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I>
+struct composite9_result<construct_l<T>, TupleT,
+    A, B, C, D, E, F, G, H, I> {
+
+    typedef T type;
+};
+
+#if PHOENIX_LIMIT > 9
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J>
+struct composite10_result<construct_l<T>, TupleT,
+    A, B, C, D, E, F, G, H, I, J> {
+
+    typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K>
+struct composite11_result<construct_l<T>, TupleT,
+    A, B, C, D, E, F, G, H, I, J, K> {
+
+    typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L>
+struct composite12_result<construct_l<T>, TupleT,
+    A, B, C, D, E, F, G, H, I, J, K, L> {
+
+    typedef T type;
+};
+
+#if PHOENIX_LIMIT > 12
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M>
+struct composite13_result<construct_l<T>, TupleT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M> {
+
+    typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N>
+struct composite14_result<construct_l<T>, TupleT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, N> {
+
+    typedef T type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N, typename O>
+struct composite15_result<construct_l<T>, TupleT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> {
+
+    typedef T type;
+};
+
+#endif
+#endif
+#endif
+#endif
+#endif
+
+//////////////////////////////////
+template <typename T>
+inline typename impl::make_composite<construct_l_0<T> >::type
+construct_()
+{
+    typedef impl::make_composite<construct_l_0<T> > make_composite_t;
+    typedef typename make_composite_t::type type_t;
+    typedef typename make_composite_t::composite_type composite_type_t;
+    
+    return type_t(composite_type_t(construct_l_0<T>()));
+}
+
+//////////////////////////////////
+template <typename T, typename A>
+inline typename impl::make_composite<construct_1<T>, A>::type
+construct_(A const& a)
+{
+    typedef impl::make_composite<construct_1<T>, A> make_composite_t;
+    typedef typename make_composite_t::type type_t;
+    typedef typename make_composite_t::composite_type composite_type_t;
+
+    return type_t(composite_type_t(construct_1<T>(), 
+        as_actor<A>::convert(a)
+    ));
+}
+
+//////////////////////////////////
+template <typename T, typename A, typename B>
+inline typename impl::make_composite<construct_2<T>, A, B>::type
+construct_(A const& a, B const& b)
+{
+    typedef impl::make_composite<construct_2<T>, A, B> make_composite_t;
+    typedef typename make_composite_t::type type_t;
+    typedef typename make_composite_t::composite_type composite_type_t;
+
+    return type_t(composite_type_t(construct_2<T>(), 
+        as_actor<A>::convert(a), 
+        as_actor<B>::convert(b)
+    ));
+}
+
+//////////////////////////////////
+template <typename T, typename A, typename B, typename C>
+inline typename impl::make_composite<construct_3<T>, A, B, C>::type
+construct_(A const& a, B const& b, C const& c)
+{
+    typedef impl::make_composite<construct_3<T>, A, B, C> make_composite_t;
+    typedef typename make_composite_t::type type_t;
+    typedef typename make_composite_t::composite_type composite_type_t;
+
+    return type_t(composite_type_t(construct_3<T>(), 
+        as_actor<A>::convert(a), 
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c)
+    ));
+}
+
+#if PHOENIX_CONSTRUCT_LIMIT > 3
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D
+>
+inline typename impl::make_composite<construct_4<T>, A, B, C, D>::type
+construct_(
+    A const& a, B const& b, C const& c, D const& d)
+{
+    typedef
+        impl::make_composite<construct_4<T>, A, B, C, D>
+        make_composite_t;
+    typedef typename make_composite_t::type type_t;
+    typedef typename make_composite_t::composite_type composite_type_t;
+
+    return type_t(composite_type_t(construct_4<T>(), 
+        as_actor<A>::convert(a), 
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d)
+    ));
+}
+
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E
+>
+inline typename impl::make_composite<construct_5<T>, A, B, C, D, E>::type
+construct_(
+    A const& a, B const& b, C const& c, D const& d, E const& e)
+{
+    typedef
+        impl::make_composite<construct_5<T>, A, B, C, D, E>
+        make_composite_t;
+    typedef typename make_composite_t::type type_t;
+    typedef typename make_composite_t::composite_type composite_type_t;
+
+    return type_t(composite_type_t(construct_5<T>(), 
+        as_actor<A>::convert(a), 
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e)
+    ));
+}
+
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F
+>
+inline typename impl::make_composite<construct_6<T>, A, B, C, D, E, F>::type
+construct_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f)
+{
+    typedef
+        impl::make_composite<construct_6<T>, A, B, C, D, E, F>
+        make_composite_t;
+    typedef typename make_composite_t::type type_t;
+    typedef typename make_composite_t::composite_type composite_type_t;
+
+    return type_t(composite_type_t(construct_6<T>(), 
+        as_actor<A>::convert(a), 
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f)
+    ));
+}
+
+#if PHOENIX_CONSTRUCT_LIMIT > 6
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G
+>
+inline typename impl::make_composite<construct_7<T>, A, B, C, D, E, F, G>::type
+construct_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g)
+{
+    typedef
+        impl::make_composite<construct_7<T>, A, B, C, D, E, F, G>
+        make_composite_t;
+    typedef typename make_composite_t::type type_t;
+    typedef typename make_composite_t::composite_type composite_type_t;
+
+    return type_t(composite_type_t(construct_7<T>(), 
+        as_actor<A>::convert(a), 
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g)
+    ));
+}
+
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H
+>
+inline typename impl::make_composite<construct_8<T>, A, B, C, D, E, F, G, H>::type
+construct_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h)
+{
+    typedef
+        impl::make_composite<construct_8<T>, A, B, C, D, E, F, G, H>
+        make_composite_t;
+    typedef typename make_composite_t::type type_t;
+    typedef typename make_composite_t::composite_type composite_type_t;
+
+    return type_t(composite_type_t(construct_8<T>(), 
+        as_actor<A>::convert(a), 
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h)
+    ));
+}
+
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I
+>
+inline typename impl::make_composite<construct_9<T>, A, B, C, D, E, F, G, H, I>::type
+construct_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i)
+{
+    typedef
+        impl::make_composite<construct_9<T>, A, B, C, D, E, F, G, H, I>
+        make_composite_t;
+    typedef typename make_composite_t::type type_t;
+    typedef typename make_composite_t::composite_type composite_type_t;
+
+    return type_t(composite_type_t(construct_9<T>(), 
+        as_actor<A>::convert(a), 
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i)
+    ));
+}
+
+#if PHOENIX_CONSTRUCT_LIMIT > 9
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J
+>
+inline typename impl::make_composite<
+    construct_10<T>, A, B, C, D, E, F, G, H, I, J>::type
+construct_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j)
+{
+    typedef
+        impl::make_composite<
+            construct_10<T>, A, B, C, D, E, F, G, H, I, J
+        >
+        make_composite_t;
+    typedef typename make_composite_t::type type_t;
+    typedef typename make_composite_t::composite_type composite_type_t;
+
+    return type_t(composite_type_t(construct_10<T>(), 
+        as_actor<A>::convert(a), 
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j)
+    ));
+}
+
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J, typename K
+>
+inline typename impl::make_composite<
+    construct_11<T>, A, B, C, D, E, F, G, H, I, J, K>::type
+construct_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j,
+    K const& k)
+{
+    typedef
+        impl::make_composite<
+            construct_11<T>, A, B, C, D, E, F, G, H, I, J, K
+        >
+        make_composite_t;
+    typedef typename make_composite_t::type type_t;
+    typedef typename make_composite_t::composite_type composite_type_t;
+
+    return type_t(composite_type_t(construct_11<T>(), 
+        as_actor<A>::convert(a), 
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j),
+        as_actor<K>::convert(k)
+    ));
+}
+
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J, typename K,
+    typename L
+>
+inline typename impl::make_composite<
+    construct_12<T>, A, B, C, D, E, F, G, H, I, J, K, L>::type
+construct_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j,
+    K const& k, L const& l)
+{
+    typedef
+        impl::make_composite<
+            construct_12<T>, A, B, C, D, E, F, G, H, I, J, K, L
+        >
+        make_composite_t;
+    typedef typename make_composite_t::type type_t;
+    typedef typename make_composite_t::composite_type composite_type_t;
+
+    return type_t(composite_type_t(construct_12<T>(), 
+        as_actor<A>::convert(a), 
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j),
+        as_actor<K>::convert(k),
+        as_actor<L>::convert(l)
+    ));
+}
+
+#if PHOENIX_CONSTRUCT_LIMIT > 12
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J, typename K,
+    typename L, typename M
+>
+inline typename impl::make_composite<
+    construct_13<T>, A, B, C, D, E, F, G, H, I, J, K, L, M>::type
+construct_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j,
+    K const& k, L const& l, M const& m)
+{
+    typedef
+        impl::make_composite<
+            construct_13<T>, A, B, C, D, E, F, G, H, I, J, K, L, M
+        >
+        make_composite_t;
+    typedef typename make_composite_t::type type_t;
+    typedef typename make_composite_t::composite_type composite_type_t;
+
+    return type_t(composite_type_t(construct_13<T>(), 
+        as_actor<A>::convert(a), 
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j),
+        as_actor<K>::convert(k),
+        as_actor<L>::convert(l),
+        as_actor<M>::convert(m)
+    ));
+}
+
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J, typename K,
+    typename L, typename M, typename N
+>
+inline typename impl::make_composite<
+    construct_14<T>, A, B, C, D, E, F, G, H, I, J, K, L, M>::type
+construct_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j,
+    K const& k, L const& l, M const& m, N const& n)
+{
+    typedef
+        impl::make_composite<
+            construct_14<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, N
+        >
+        make_composite_t;
+    typedef typename make_composite_t::type type_t;
+    typedef typename make_composite_t::composite_type composite_type_t;
+
+    return type_t(composite_type_t(construct_14<T>(), 
+        as_actor<A>::convert(a), 
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j),
+        as_actor<K>::convert(k),
+        as_actor<L>::convert(l),
+        as_actor<M>::convert(m),
+        as_actor<N>::convert(n)
+    ));
+}
+
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J, typename K,
+    typename L, typename M, typename N, typename O
+>
+inline typename impl::make_composite<
+    construct_15<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, O>::type
+construct_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j,
+    K const& k, L const& l, M const& m, N const& n, O const& o)
+{
+    typedef
+        impl::make_composite<
+            construct_15<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
+        >
+        make_composite_t;
+    typedef typename make_composite_t::type type_t;
+    typedef typename make_composite_t::composite_type composite_type_t;
+
+    return type_t(composite_type_t(construct_15<T>(), 
+        as_actor<A>::convert(a), 
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j),
+        as_actor<K>::convert(k),
+        as_actor<L>::convert(l),
+        as_actor<M>::convert(m),
+        as_actor<N>::convert(n),
+        as_actor<O>::convert(o)
+    ));
+}
+
+#endif
+#endif
+#endif
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+}   //  namespace phoenix
+
+#endif // PHOENIX_CASTS_HPP
diff --git a/boost/boost/spirit/phoenix/closures.hpp b/boost/boost/spirit/phoenix/closures.hpp
new file mode 100644 (file)
index 0000000..3f7c1f6
--- /dev/null
@@ -0,0 +1,422 @@
+/*=============================================================================
+    Phoenix V1.2.1
+    Copyright (c) 2001-2002 Joel de Guzman
+    MT code Copyright (c) 2002-2003 Martin Wille
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef PHOENIX_CLOSURES_HPP
+#define PHOENIX_CLOSURES_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/phoenix/actor.hpp>
+#include <cassert>
+
+#ifdef PHOENIX_THREADSAFE
+#include <boost/thread/tss.hpp>
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Adaptable closures
+//
+//      The framework will not be complete without some form of closures
+//      support. Closures encapsulate a stack frame where local
+//      variables are created upon entering a function and destructed
+//      upon exiting. Closures provide an environment for local
+//      variables to reside. Closures can hold heterogeneous types.
+//
+//      Phoenix closures are true hardware stack based closures. At the
+//      very least, closures enable true reentrancy in lambda functions.
+//      A closure provides access to a function stack frame where local
+//      variables reside. Modeled after Pascal nested stack frames,
+//      closures can be nested just like nested functions where code in
+//      inner closures may access local variables from in-scope outer
+//      closures (accessing inner scopes from outer scopes is an error
+//      and will cause a run-time assertion failure).
+//
+//      There are three (3) interacting classes:
+//
+//      1) closure:
+//
+//      At the point of declaration, a closure does not yet create a
+//      stack frame nor instantiate any variables. A closure declaration
+//      declares the types and names[note] of the local variables. The
+//      closure class is meant to be subclassed. It is the
+//      responsibility of a closure subclass to supply the names for
+//      each of the local variable in the closure. Example:
+//
+//          struct my_closure : closure<int, string, double> {
+//
+//              member1 num;        // names the 1st (int) local variable
+//              member2 message;    // names the 2nd (string) local variable
+//              member3 real;       // names the 3rd (double) local variable
+//          };
+//
+//          my_closure clos;
+//
+//      Now that we have a closure 'clos', its local variables can be
+//      accessed lazily using the dot notation. Each qualified local
+//      variable can be used just like any primitive actor (see
+//      primitives.hpp). Examples:
+//
+//          clos.num = 30
+//          clos.message = arg1
+//          clos.real = clos.num * 1e6
+//
+//      The examples above are lazily evaluated. As usual, these
+//      expressions return composite actors that will be evaluated
+//      through a second function call invocation (see operators.hpp).
+//      Each of the members (clos.xxx) is an actor. As such, applying
+//      the operator() will reveal its identity:
+//
+//          clos.num() // will return the current value of clos.num
+//
+//      *** [note] Acknowledgement: Juan Carlos Arevalo-Baeza (JCAB)
+//      introduced and initilally implemented the closure member names
+//      that uses the dot notation.
+//
+//      2) closure_member
+//
+//      The named local variables of closure 'clos' above are actually
+//      closure members. The closure_member class is an actor and
+//      conforms to its conceptual interface. member1..memberN are
+//      predefined typedefs that correspond to each of the listed types
+//      in the closure template parameters.
+//
+//      3) closure_frame
+//
+//      When a closure member is finally evaluated, it should refer to
+//      an actual instance of the variable in the hardware stack.
+//      Without doing so, the process is not complete and the evaluated
+//      member will result to an assertion failure. Remember that the
+//      closure is just a declaration. The local variables that a
+//      closure refers to must still be instantiated.
+//
+//      The closure_frame class does the actual instantiation of the
+//      local variables and links these variables with the closure and
+//      all its members. There can be multiple instances of
+//      closure_frames typically situated in the stack inside a
+//      function. Each closure_frame instance initiates a stack frame
+//      with a new set of closure local variables. Example:
+//
+//          void foo()
+//          {
+//              closure_frame<my_closure> frame(clos);
+//              /* do something */
+//          }
+//
+//      where 'clos' is an instance of our closure 'my_closure' above.
+//      Take note that the usage above precludes locally declared
+//      classes. If my_closure is a locally declared type, we can still
+//      use its self_type as a paramater to closure_frame:
+//
+//          closure_frame<my_closure::self_type> frame(clos);
+//
+//      Upon instantiation, the closure_frame links the local variables
+//      to the closure. The previous link to another closure_frame
+//      instance created before is saved. Upon destruction, the
+//      closure_frame unlinks itself from the closure and relinks the
+//      preceding closure_frame prior to this instance.
+//
+//      The local variables in the closure 'clos' above is default
+//      constructed in the stack inside function 'foo'. Once 'foo' is
+//      exited, all of these local variables are destructed. In some
+//      cases, default construction is not desirable and we need to
+//      initialize the local closure variables with some values. This
+//      can be done by passing in the initializers in a compatible
+//      tuple. A compatible tuple is one with the same number of
+//      elements as the destination and where each element from the
+//      destination can be constructed from each corresponding element
+//      in the source. Example:
+//
+//          tuple<int, char const*, int> init(123, "Hello", 1000);
+//          closure_frame<my_closure> frame(clos, init);
+//
+//      Here now, our closure_frame's variables are initialized with
+//      int: 123, char const*: "Hello" and int: 1000.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+namespace impl
+{
+    ///////////////////////////////////////////////////////////////////////
+    // closure_frame_holder is a simple class that encapsulates the
+    // storage for a frame pointer. It uses thread specific data in
+    // case when multithreading is enabled, an ordinary pointer otherwise
+    //
+    // it has get() and set() member functions. set() has to be used
+    // _after_ get(). get() contains intialisation code in the multi
+    // threading case
+    //
+    // closure_frame_holder is used by the closure<> class to store
+    // the pointer to the current frame.
+    //
+#ifndef PHOENIX_THREADSAFE
+    template <typename FrameT>
+    struct closure_frame_holder
+    {
+        typedef FrameT frame_t;
+        typedef frame_t *frame_ptr;
+
+        closure_frame_holder() : frame(0) {}
+
+        frame_ptr &get() { return frame; }
+        void set(frame_t *f) { frame = f; }
+
+    private:
+        frame_ptr frame;
+
+        // no copies, no assignments
+        closure_frame_holder(closure_frame_holder const &);
+        closure_frame_holder &operator=(closure_frame_holder const &);
+    };
+#else
+    template <typename FrameT>
+    struct closure_frame_holder
+    {
+        typedef FrameT   frame_t;
+        typedef frame_t *frame_ptr;
+
+        closure_frame_holder() : tsp_frame() {}
+
+        frame_ptr &get()
+        {
+            if (!tsp_frame.get())
+                tsp_frame.reset(new frame_ptr(0));
+            return *tsp_frame;
+        }
+        void set(frame_ptr f)
+        {
+            *tsp_frame = f;
+        }
+
+    private:
+        boost::thread_specific_ptr<frame_ptr> tsp_frame;
+
+        // no copies, no assignments
+        closure_frame_holder(closure_frame_holder const &);
+        closure_frame_holder &operator=(closure_frame_holder const &);
+    };
+#endif
+} // namespace phoenix::impl
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  closure_frame class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename ClosureT>
+class closure_frame : public ClosureT::tuple_t {
+
+public:
+
+    closure_frame(ClosureT const& clos)
+    : ClosureT::tuple_t(), save(clos.frame.get()), frame(clos.frame)
+    { clos.frame.set(this); }
+
+    template <typename TupleT>
+    closure_frame(ClosureT const& clos, TupleT const& init)
+    : ClosureT::tuple_t(init), save(clos.frame.get()), frame(clos.frame)
+    { clos.frame.set(this); }
+
+    ~closure_frame()
+    { frame.set(save); }
+
+private:
+
+    closure_frame(closure_frame const&);            // no copy
+    closure_frame& operator=(closure_frame const&); // no assign
+
+    closure_frame* save;
+    impl::closure_frame_holder<closure_frame>& frame;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  closure_member class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <int N, typename ClosureT>
+class closure_member {
+
+public:
+
+    typedef typename ClosureT::tuple_t tuple_t;
+
+    closure_member()
+    : frame(ClosureT::closure_frame_holder_ref()) {}
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename tuple_element<
+            N, typename ClosureT::tuple_t
+        >::rtype type;
+    };
+
+    template <typename TupleT>
+    typename tuple_element<N, typename ClosureT::tuple_t>::rtype
+    eval(TupleT const& /*args*/) const
+    {
+        using namespace std;
+        assert(frame.get() != 0);
+        return (*frame.get())[tuple_index<N>()];
+    }
+
+private:
+    impl::closure_frame_holder<typename ClosureT::closure_frame_t> &frame;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  closure class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+        typename T0 = nil_t
+    ,   typename T1 = nil_t
+    ,   typename T2 = nil_t
+
+#if PHOENIX_LIMIT > 3
+    ,   typename T3 = nil_t
+    ,   typename T4 = nil_t
+    ,   typename T5 = nil_t
+
+#if PHOENIX_LIMIT > 6
+    ,   typename T6 = nil_t
+    ,   typename T7 = nil_t
+    ,   typename T8 = nil_t
+
+#if PHOENIX_LIMIT > 9
+    ,   typename T9 = nil_t
+    ,   typename T10 = nil_t
+    ,   typename T11 = nil_t
+
+#if PHOENIX_LIMIT > 12
+    ,   typename T12 = nil_t
+    ,   typename T13 = nil_t
+    ,   typename T14 = nil_t
+
+#endif
+#endif
+#endif
+#endif
+>
+class closure {
+
+public:
+
+    typedef tuple<
+            T0, T1, T2
+#if PHOENIX_LIMIT > 3
+        ,   T3, T4, T5
+#if PHOENIX_LIMIT > 6
+        ,   T6, T7, T8
+#if PHOENIX_LIMIT > 9
+        ,   T9, T10, T11
+#if PHOENIX_LIMIT > 12
+        ,   T12, T13, T14
+#endif
+#endif
+#endif
+#endif
+        > tuple_t;
+
+    typedef closure<
+            T0, T1, T2
+#if PHOENIX_LIMIT > 3
+        ,   T3, T4, T5
+#if PHOENIX_LIMIT > 6
+        ,   T6, T7, T8
+#if PHOENIX_LIMIT > 9
+        ,   T9, T10, T11
+#if PHOENIX_LIMIT > 12
+        ,   T12, T13, T14
+#endif
+#endif
+#endif
+#endif
+        > self_t;
+
+    typedef closure_frame<self_t> closure_frame_t;
+
+                            closure()
+                            : frame()       { closure_frame_holder_ref(&frame); }
+    closure_frame_t&        context()       { assert(frame!=0); return frame.get(); }
+    closure_frame_t const&  context() const { assert(frame!=0); return frame.get(); }
+
+    typedef actor<closure_member<0, self_t> > member1;
+    typedef actor<closure_member<1, self_t> > member2;
+    typedef actor<closure_member<2, self_t> > member3;
+
+#if PHOENIX_LIMIT > 3
+    typedef actor<closure_member<3, self_t> > member4;
+    typedef actor<closure_member<4, self_t> > member5;
+    typedef actor<closure_member<5, self_t> > member6;
+
+#if PHOENIX_LIMIT > 6
+    typedef actor<closure_member<6, self_t> > member7;
+    typedef actor<closure_member<7, self_t> > member8;
+    typedef actor<closure_member<8, self_t> > member9;
+
+#if PHOENIX_LIMIT > 9
+    typedef actor<closure_member<9, self_t> > member10;
+    typedef actor<closure_member<10, self_t> > member11;
+    typedef actor<closure_member<11, self_t> > member12;
+
+#if PHOENIX_LIMIT > 12
+    typedef actor<closure_member<12, self_t> > member13;
+    typedef actor<closure_member<13, self_t> > member14;
+    typedef actor<closure_member<14, self_t> > member15;
+
+#endif
+#endif
+#endif
+#endif
+
+#if !defined(__MWERKS__) || (__MWERKS__ > 0x3002)
+private:
+#endif
+
+    closure(closure const&);            // no copy
+    closure& operator=(closure const&); // no assign
+
+#if !defined(__MWERKS__) || (__MWERKS__ > 0x3002)
+    template <int N, typename ClosureT>
+    friend class closure_member;
+
+    template <typename ClosureT>
+    friend class closure_frame;
+#endif
+
+    typedef impl::closure_frame_holder<closure_frame_t> holder_t;
+
+    static holder_t &
+    closure_frame_holder_ref(holder_t* holder_ = 0)
+    {
+#ifdef PHOENIX_THREADSAFE
+        static boost::thread_specific_ptr<holder_t*> tsp_frame;
+        if (!tsp_frame.get())
+            tsp_frame.reset(new holder_t *(0));
+        holder_t *& holder = *tsp_frame;
+#else
+        static holder_t* holder = 0;
+#endif
+        if (holder_ != 0)
+            holder = holder_;
+        return *holder;
+    }
+
+    mutable holder_t frame;
+};
+
+}
+   //  namespace phoenix
+
+#endif
diff --git a/boost/boost/spirit/phoenix/composite.hpp b/boost/boost/spirit/phoenix/composite.hpp
new file mode 100644 (file)
index 0000000..903d319
--- /dev/null
@@ -0,0 +1,1423 @@
+/*=============================================================================
+    Phoenix V1.2.1
+    Copyright (c) 2001-2002 Joel de Guzman
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef PHOENIX_COMPOSITE_HPP
+#define PHOENIX_COMPOSITE_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/phoenix/actor.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite class
+//
+//      A composite is an actor base class composed of zero or more
+//      actors (see actor.hpp) and an operation. A composite is itself
+//      an actor superclass and conforms to its conceptual interface.
+//      Its eval member function un-funnels the tupled actual arguments
+//      from the tuple by invoking each of the actors' eval member
+//      function. The results of each are then passed on as arguments to
+//      the operation. Specializations are provided to handle different
+//      numbers of actors.
+//
+//      Schematically:
+//
+//          actor0.eval(tupled_args) --> arg0 --> |
+//          actor1.eval(tupled_args) --> arg1 --> |
+//          actor2.eval(tupled_args) --> arg3 --> | --> operation(arg0...argN)
+//            ...                                 |
+//          actorN.eval(tupled_args) --> argN --> |
+//
+//      The operation can be any suitable functor that can accept the
+//      arguments passed in by the composite. The operation is expected
+//      to have a member operator() that carries out the actual
+//      operation. There should be a one to one correspondence between
+//      actors of the composite and the arguments of the operation's
+//      member operator().
+//
+//      The operation is also expected to have a nested template class
+//      result<T0...TN>. The nested template class result should have a
+//      typedef 'type' that reflects the return type of its member
+//      operator(). This is essentially a type computer that answers the
+//      metaprogramming question "Given arguments of type T0...TN, what
+//      will be its operator()'s return type?".
+//
+//      There is a special case for operations that accept no arguments.
+//      Such nullary operations are only required to define a typedef
+//      result_type that reflects the return type of its operator().
+//
+//      Here's an example of a simple operation that squares a number:
+//
+//          struct square {
+//
+//              template <typename ArgT>
+//              struct result { typedef ArgT type; };
+//
+//              template <typename ArgT>
+//              ArgT operator()(ArgT n) const { return n * n; }
+//          };
+//
+//      As can be seen, operations can be polymorphic. Its arguments and
+//      return type are not fixed to a particular type. The example
+//      above for example, can handle any ArgT type as long as it has a
+//      multiplication operator.
+//
+//      Composites are not created directly. Instead, there are meta-
+//      programs provided that indirectly create composites. See
+//      operators.hpp, binders.hpp and functions.hpp for examples.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename OperationT
+    ,   typename A = nil_t
+    ,   typename B = nil_t
+    ,   typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+    ,   typename D = nil_t
+    ,   typename E = nil_t
+    ,   typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+    ,   typename G = nil_t
+    ,   typename H = nil_t
+    ,   typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+    ,   typename J = nil_t
+    ,   typename K = nil_t
+    ,   typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+    ,   typename M = nil_t
+    ,   typename N = nil_t
+    ,   typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+
+    ,   typename NU = nil_t  // Not used
+>
+struct composite;
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite <0 actor> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT>
+struct composite0_result {
+
+    typedef typename OperationT::result_type type;
+};
+
+//////////////////////////////////
+template <typename OperationT>
+struct composite<OperationT,
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef composite<OperationT> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename composite0_result<
+            OperationT, TupleT
+        >::type type;
+    };
+
+    composite(OperationT const& op_)
+    :   op(op_) {}
+
+    template <typename TupleT>
+    typename OperationT::result_type
+    eval(TupleT const& /*args*/) const
+    {
+        return op();
+    }
+
+    mutable OperationT op; //  operation
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite <1 actor> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+    typename A>
+struct composite1_result {
+
+    typedef typename OperationT::template result<
+        typename actor_result<A, TupleT>::plain_type
+    >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+    typename A>
+struct composite<OperationT,
+    A, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef composite<OperationT, A> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename composite1_result<
+            OperationT, TupleT, A
+        >::type type;
+    };
+
+    composite(OperationT const& op_,
+        A const& a_)
+    :   op(op_), a(a_) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        typename actor_result<A, TupleT>::type ra = a.eval(args);
+        return op(ra);
+    }
+
+    mutable OperationT op; //  operation
+    A a; //  actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite <2 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+    typename A, typename B>
+struct composite2_result {
+
+    typedef typename OperationT::template result<
+        typename actor_result<A, TupleT>::plain_type,
+        typename actor_result<B, TupleT>::plain_type
+    >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+    typename A, typename B>
+struct composite<OperationT,
+    A, B, nil_t,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef composite<OperationT, A, B> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename composite2_result<
+            OperationT, TupleT, A, B
+        >::type type;
+    };
+
+    composite(OperationT const& op_,
+        A const& a_, B const& b_)
+    :   op(op_), a(a_), b(b_) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        typename actor_result<A, TupleT>::type ra = a.eval(args);
+        typename actor_result<B, TupleT>::type rb = b.eval(args);
+        return op(ra, rb);
+    }
+
+    mutable OperationT op; //  operation
+    A a; B b; //  actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite <3 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+    typename A, typename B, typename C>
+struct composite3_result {
+
+    typedef typename OperationT::template result<
+        typename actor_result<A, TupleT>::plain_type,
+        typename actor_result<B, TupleT>::plain_type,
+        typename actor_result<C, TupleT>::plain_type
+    >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+    typename A, typename B, typename C>
+struct composite<OperationT,
+    A, B, C,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef composite<OperationT, A, B, C> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename composite3_result<
+            OperationT, TupleT, A, B, C
+        >::type type;
+    };
+
+    composite(OperationT const& op_,
+        A const& a_, B const& b_, C const& c_)
+    :   op(op_), a(a_), b(b_), c(c_) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        typename actor_result<A, TupleT>::type ra = a.eval(args);
+        typename actor_result<B, TupleT>::type rb = b.eval(args);
+        typename actor_result<C, TupleT>::type rc = c.eval(args);
+        return op(ra, rb, rc);
+    }
+
+    mutable OperationT op; //  operation
+    A a; B b; C c; //  actors
+};
+
+#if PHOENIX_LIMIT > 3
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite <4 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+    typename A, typename B, typename C, typename D>
+struct composite4_result {
+
+    typedef typename OperationT::template result<
+        typename actor_result<A, TupleT>::plain_type,
+        typename actor_result<B, TupleT>::plain_type,
+        typename actor_result<C, TupleT>::plain_type,
+        typename actor_result<D, TupleT>::plain_type
+    >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+    typename A, typename B, typename C, typename D>
+struct composite<OperationT,
+    A, B, C, D, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef composite<OperationT, A, B, C, D> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename composite4_result<
+            OperationT, TupleT, A, B, C, D
+        >::type type;
+    };
+
+    composite(OperationT const& op_,
+        A const& a_, B const& b_, C const& c_, D const& d_)
+    :   op(op_), a(a_), b(b_), c(c_), d(d_) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        typename actor_result<A, TupleT>::type ra = a.eval(args);
+        typename actor_result<B, TupleT>::type rb = b.eval(args);
+        typename actor_result<C, TupleT>::type rc = c.eval(args);
+        typename actor_result<D, TupleT>::type rd = d.eval(args);
+        return op(ra, rb, rc, rd);
+    }
+
+    mutable OperationT op; //  operation
+    A a; B b; C c; D d; //  actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite <5 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E>
+struct composite5_result {
+
+    typedef typename OperationT::template result<
+        typename actor_result<A, TupleT>::plain_type,
+        typename actor_result<B, TupleT>::plain_type,
+        typename actor_result<C, TupleT>::plain_type,
+        typename actor_result<D, TupleT>::plain_type,
+        typename actor_result<E, TupleT>::plain_type
+    >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+    typename A, typename B, typename C, typename D, typename E>
+struct composite<OperationT,
+    A, B, C, D, E, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef composite<OperationT, A, B, C, D, E> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename composite5_result<
+            OperationT, TupleT, A, B, C, D, E
+        >::type type;
+    };
+
+    composite(OperationT const& op_,
+        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_)
+    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        typename actor_result<A, TupleT>::type ra = a.eval(args);
+        typename actor_result<B, TupleT>::type rb = b.eval(args);
+        typename actor_result<C, TupleT>::type rc = c.eval(args);
+        typename actor_result<D, TupleT>::type rd = d.eval(args);
+        typename actor_result<E, TupleT>::type re = e.eval(args);
+        return op(ra, rb, rc, rd, re);
+    }
+
+    mutable OperationT op; //  operation
+    A a; B b; C c; D d; E e; //  actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite <6 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F>
+struct composite6_result {
+
+    typedef typename OperationT::template result<
+        typename actor_result<A, TupleT>::plain_type,
+        typename actor_result<B, TupleT>::plain_type,
+        typename actor_result<C, TupleT>::plain_type,
+        typename actor_result<D, TupleT>::plain_type,
+        typename actor_result<E, TupleT>::plain_type,
+        typename actor_result<F, TupleT>::plain_type
+    >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F>
+struct composite<OperationT,
+    A, B, C, D, E, F,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef composite<OperationT, A, B, C, D, E, F> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename composite6_result<
+            OperationT, TupleT, A, B, C, D, E, F
+        >::type type;
+    };
+
+    composite(OperationT const& op_,
+        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+        F const& f_)
+    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        typename actor_result<A, TupleT>::type ra = a.eval(args);
+        typename actor_result<B, TupleT>::type rb = b.eval(args);
+        typename actor_result<C, TupleT>::type rc = c.eval(args);
+        typename actor_result<D, TupleT>::type rd = d.eval(args);
+        typename actor_result<E, TupleT>::type re = e.eval(args);
+        typename actor_result<F, TupleT>::type rf = f.eval(args);
+        return op(ra, rb, rc, rd, re, rf);
+    }
+
+    mutable OperationT op; //  operation
+    A a; B b; C c; D d; E e; F f; //  actors
+};
+
+#if PHOENIX_LIMIT > 6
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite <7 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G>
+struct composite7_result {
+
+    typedef typename OperationT::template result<
+        typename actor_result<A, TupleT>::plain_type,
+        typename actor_result<B, TupleT>::plain_type,
+        typename actor_result<C, TupleT>::plain_type,
+        typename actor_result<D, TupleT>::plain_type,
+        typename actor_result<E, TupleT>::plain_type,
+        typename actor_result<F, TupleT>::plain_type,
+        typename actor_result<G, TupleT>::plain_type
+    >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G>
+struct composite<OperationT,
+    A, B, C, D, E, F, G, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef composite<OperationT, A, B, C, D, E, F, G> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename composite7_result<
+            OperationT, TupleT, A, B, C, D, E, F, G
+        >::type type;
+    };
+
+    composite(OperationT const& op_,
+        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+        F const& f_, G const& g_)
+    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        typename actor_result<A, TupleT>::type ra = a.eval(args);
+        typename actor_result<B, TupleT>::type rb = b.eval(args);
+        typename actor_result<C, TupleT>::type rc = c.eval(args);
+        typename actor_result<D, TupleT>::type rd = d.eval(args);
+        typename actor_result<E, TupleT>::type re = e.eval(args);
+        typename actor_result<F, TupleT>::type rf = f.eval(args);
+        typename actor_result<G, TupleT>::type rg = g.eval(args);
+        return op(ra, rb, rc, rd, re, rf, rg);
+    }
+
+    mutable OperationT op; //  operation
+    A a; B b; C c; D d; E e; F f; G g; //  actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite <8 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H>
+struct composite8_result {
+
+    typedef typename OperationT::template result<
+        typename actor_result<A, TupleT>::plain_type,
+        typename actor_result<B, TupleT>::plain_type,
+        typename actor_result<C, TupleT>::plain_type,
+        typename actor_result<D, TupleT>::plain_type,
+        typename actor_result<E, TupleT>::plain_type,
+        typename actor_result<F, TupleT>::plain_type,
+        typename actor_result<G, TupleT>::plain_type,
+        typename actor_result<H, TupleT>::plain_type
+    >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H>
+struct composite<OperationT,
+    A, B, C, D, E, F, G, H, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef composite<OperationT, A, B, C, D, E, F, G, H> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename composite8_result<
+            OperationT, TupleT, A, B, C, D, E, F, G, H
+        >::type type;
+    };
+
+    composite(OperationT const& op_,
+        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+        F const& f_, G const& g_, H const& h_)
+    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_), h(h_) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        typename actor_result<A, TupleT>::type ra = a.eval(args);
+        typename actor_result<B, TupleT>::type rb = b.eval(args);
+        typename actor_result<C, TupleT>::type rc = c.eval(args);
+        typename actor_result<D, TupleT>::type rd = d.eval(args);
+        typename actor_result<E, TupleT>::type re = e.eval(args);
+        typename actor_result<F, TupleT>::type rf = f.eval(args);
+        typename actor_result<G, TupleT>::type rg = g.eval(args);
+        typename actor_result<H, TupleT>::type rh = h.eval(args);
+        return op(ra, rb, rc, rd, re, rf, rg, rh);
+    }
+
+    mutable OperationT op; //  operation
+    A a; B b; C c; D d; E e; F f; G g; H h; //  actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite <9 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I>
+struct composite9_result {
+
+    typedef typename OperationT::template result<
+        typename actor_result<A, TupleT>::plain_type,
+        typename actor_result<B, TupleT>::plain_type,
+        typename actor_result<C, TupleT>::plain_type,
+        typename actor_result<D, TupleT>::plain_type,
+        typename actor_result<E, TupleT>::plain_type,
+        typename actor_result<F, TupleT>::plain_type,
+        typename actor_result<G, TupleT>::plain_type,
+        typename actor_result<H, TupleT>::plain_type,
+        typename actor_result<I, TupleT>::plain_type
+    >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I>
+struct composite<OperationT,
+    A, B, C, D, E, F, G, H, I,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef composite<OperationT, A, B, C, D, E, F, G, H, I> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename composite9_result<
+            OperationT, TupleT, A, B, C, D, E, F, G, H, I
+        >::type type;
+    };
+
+    composite(OperationT const& op_,
+        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+        F const& f_, G const& g_, H const& h_, I const& i_)
+    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_), h(h_), i(i_) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        typename actor_result<A, TupleT>::type ra = a.eval(args);
+        typename actor_result<B, TupleT>::type rb = b.eval(args);
+        typename actor_result<C, TupleT>::type rc = c.eval(args);
+        typename actor_result<D, TupleT>::type rd = d.eval(args);
+        typename actor_result<E, TupleT>::type re = e.eval(args);
+        typename actor_result<F, TupleT>::type rf = f.eval(args);
+        typename actor_result<G, TupleT>::type rg = g.eval(args);
+        typename actor_result<H, TupleT>::type rh = h.eval(args);
+        typename actor_result<I, TupleT>::type ri = i.eval(args);
+        return op(ra, rb, rc, rd, re, rf, rg, rh, ri);
+    }
+
+    mutable OperationT op; //  operation
+    A a; B b; C c; D d; E e; F f; G g; H h; I i; //  actors
+};
+
+#if PHOENIX_LIMIT > 9
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite <10 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J>
+struct composite10_result {
+
+    typedef typename OperationT::template result<
+        typename actor_result<A, TupleT>::plain_type,
+        typename actor_result<B, TupleT>::plain_type,
+        typename actor_result<C, TupleT>::plain_type,
+        typename actor_result<D, TupleT>::plain_type,
+        typename actor_result<E, TupleT>::plain_type,
+        typename actor_result<F, TupleT>::plain_type,
+        typename actor_result<G, TupleT>::plain_type,
+        typename actor_result<H, TupleT>::plain_type,
+        typename actor_result<I, TupleT>::plain_type,
+        typename actor_result<J, TupleT>::plain_type
+    >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J>
+struct composite<OperationT,
+    A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef composite<OperationT, A, B, C, D, E, F, G, H, I, J> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename composite10_result<
+            OperationT, TupleT, A, B, C, D, E, F, G, H, I, J
+        >::type type;
+    };
+
+    composite(OperationT const& op_,
+        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+        F const& f_, G const& g_, H const& h_, I const& i_, J const& j_)
+    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_), h(h_), i(i_), j(j_) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        typename actor_result<A, TupleT>::type ra = a.eval(args);
+        typename actor_result<B, TupleT>::type rb = b.eval(args);
+        typename actor_result<C, TupleT>::type rc = c.eval(args);
+        typename actor_result<D, TupleT>::type rd = d.eval(args);
+        typename actor_result<E, TupleT>::type re = e.eval(args);
+        typename actor_result<F, TupleT>::type rf = f.eval(args);
+        typename actor_result<G, TupleT>::type rg = g.eval(args);
+        typename actor_result<H, TupleT>::type rh = h.eval(args);
+        typename actor_result<I, TupleT>::type ri = i.eval(args);
+        typename actor_result<J, TupleT>::type rj = j.eval(args);
+        return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj);
+    }
+
+    mutable OperationT op; //  operation
+    A a; B b; C c; D d; E e; F f; G g; H h; I i; J j; //  actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite <11 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K>
+struct composite11_result {
+
+    typedef typename OperationT::template result<
+        typename actor_result<A, TupleT>::plain_type,
+        typename actor_result<B, TupleT>::plain_type,
+        typename actor_result<C, TupleT>::plain_type,
+        typename actor_result<D, TupleT>::plain_type,
+        typename actor_result<E, TupleT>::plain_type,
+        typename actor_result<F, TupleT>::plain_type,
+        typename actor_result<G, TupleT>::plain_type,
+        typename actor_result<H, TupleT>::plain_type,
+        typename actor_result<I, TupleT>::plain_type,
+        typename actor_result<J, TupleT>::plain_type,
+        typename actor_result<K, TupleT>::plain_type
+    >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K>
+struct composite<OperationT,
+    A, B, C, D, E, F, G, H, I, J, K, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef composite<OperationT,
+        A, B, C, D, E, F, G, H, I, J, K> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename composite11_result<
+            OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K
+        >::type type;
+    };
+
+    composite(OperationT const& op_,
+        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+        F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
+        K const& k_)
+    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_), h(h_), i(i_), j(j_),
+        k(k_) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        typename actor_result<A, TupleT>::type ra = a.eval(args);
+        typename actor_result<B, TupleT>::type rb = b.eval(args);
+        typename actor_result<C, TupleT>::type rc = c.eval(args);
+        typename actor_result<D, TupleT>::type rd = d.eval(args);
+        typename actor_result<E, TupleT>::type re = e.eval(args);
+        typename actor_result<F, TupleT>::type rf = f.eval(args);
+        typename actor_result<G, TupleT>::type rg = g.eval(args);
+        typename actor_result<H, TupleT>::type rh = h.eval(args);
+        typename actor_result<I, TupleT>::type ri = i.eval(args);
+        typename actor_result<J, TupleT>::type rj = j.eval(args);
+        typename actor_result<K, TupleT>::type rk = k.eval(args);
+        return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk);
+    }
+
+    mutable OperationT op; //  operation
+    A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
+    K k;//  actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite <12 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L>
+struct composite12_result {
+
+    typedef typename OperationT::template result<
+        typename actor_result<A, TupleT>::plain_type,
+        typename actor_result<B, TupleT>::plain_type,
+        typename actor_result<C, TupleT>::plain_type,
+        typename actor_result<D, TupleT>::plain_type,
+        typename actor_result<E, TupleT>::plain_type,
+        typename actor_result<F, TupleT>::plain_type,
+        typename actor_result<G, TupleT>::plain_type,
+        typename actor_result<H, TupleT>::plain_type,
+        typename actor_result<I, TupleT>::plain_type,
+        typename actor_result<J, TupleT>::plain_type,
+        typename actor_result<K, TupleT>::plain_type,
+        typename actor_result<L, TupleT>::plain_type
+    >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L>
+struct composite<OperationT,
+    A, B, C, D, E, F, G, H, I, J, K, L,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+    nil_t   //  Unused
+> {
+
+    typedef composite<OperationT,
+        A, B, C, D, E, F, G, H, I, J, K, L> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename composite12_result<
+            OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L
+        >::type type;
+    };
+
+    composite(OperationT const& op_,
+        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+        F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
+        K const& k_, L const& l_)
+    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_), h(h_), i(i_), j(j_),
+        k(k_), l(l_) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        typename actor_result<A, TupleT>::type ra = a.eval(args);
+        typename actor_result<B, TupleT>::type rb = b.eval(args);
+        typename actor_result<C, TupleT>::type rc = c.eval(args);
+        typename actor_result<D, TupleT>::type rd = d.eval(args);
+        typename actor_result<E, TupleT>::type re = e.eval(args);
+        typename actor_result<F, TupleT>::type rf = f.eval(args);
+        typename actor_result<G, TupleT>::type rg = g.eval(args);
+        typename actor_result<H, TupleT>::type rh = h.eval(args);
+        typename actor_result<I, TupleT>::type ri = i.eval(args);
+        typename actor_result<J, TupleT>::type rj = j.eval(args);
+        typename actor_result<K, TupleT>::type rk = k.eval(args);
+        typename actor_result<L, TupleT>::type rl = l.eval(args);
+        return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl);
+    }
+
+    mutable OperationT op; //  operation
+    A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
+    K k; L l;//  actors
+};
+
+#if PHOENIX_LIMIT > 12
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite <13 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M>
+struct composite13_result {
+
+    typedef typename OperationT::template result<
+        typename actor_result<A, TupleT>::plain_type,
+        typename actor_result<B, TupleT>::plain_type,
+        typename actor_result<C, TupleT>::plain_type,
+        typename actor_result<D, TupleT>::plain_type,
+        typename actor_result<E, TupleT>::plain_type,
+        typename actor_result<F, TupleT>::plain_type,
+        typename actor_result<G, TupleT>::plain_type,
+        typename actor_result<H, TupleT>::plain_type,
+        typename actor_result<I, TupleT>::plain_type,
+        typename actor_result<J, TupleT>::plain_type,
+        typename actor_result<K, TupleT>::plain_type,
+        typename actor_result<L, TupleT>::plain_type,
+        typename actor_result<M, TupleT>::plain_type
+    >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M>
+struct composite<OperationT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t
+> {
+
+    typedef composite<OperationT,
+        A, B, C, D, E, F, G, H, I, J, K, L, M> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename composite13_result<
+            OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M
+        >::type type;
+    };
+
+    composite(OperationT const& op_,
+        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+        F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
+        K const& k_, L const& l_, M const& m_)
+    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_), h(h_), i(i_), j(j_),
+        k(k_), l(l_), m(m_) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        typename actor_result<A, TupleT>::type ra = a.eval(args);
+        typename actor_result<B, TupleT>::type rb = b.eval(args);
+        typename actor_result<C, TupleT>::type rc = c.eval(args);
+        typename actor_result<D, TupleT>::type rd = d.eval(args);
+        typename actor_result<E, TupleT>::type re = e.eval(args);
+        typename actor_result<F, TupleT>::type rf = f.eval(args);
+        typename actor_result<G, TupleT>::type rg = g.eval(args);
+        typename actor_result<H, TupleT>::type rh = h.eval(args);
+        typename actor_result<I, TupleT>::type ri = i.eval(args);
+        typename actor_result<J, TupleT>::type rj = j.eval(args);
+        typename actor_result<K, TupleT>::type rk = k.eval(args);
+        typename actor_result<L, TupleT>::type rl = l.eval(args);
+        typename actor_result<M, TupleT>::type rm = m.eval(args);
+        return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm);
+    }
+
+    mutable OperationT op; //  operation
+    A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
+    K k; L l; M m; //  actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite <14 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N>
+struct composite14_result {
+
+    typedef typename OperationT::template result<
+        typename actor_result<A, TupleT>::plain_type,
+        typename actor_result<B, TupleT>::plain_type,
+        typename actor_result<C, TupleT>::plain_type,
+        typename actor_result<D, TupleT>::plain_type,
+        typename actor_result<E, TupleT>::plain_type,
+        typename actor_result<F, TupleT>::plain_type,
+        typename actor_result<G, TupleT>::plain_type,
+        typename actor_result<H, TupleT>::plain_type,
+        typename actor_result<I, TupleT>::plain_type,
+        typename actor_result<J, TupleT>::plain_type,
+        typename actor_result<K, TupleT>::plain_type,
+        typename actor_result<L, TupleT>::plain_type,
+        typename actor_result<M, TupleT>::plain_type,
+        typename actor_result<N, TupleT>::plain_type
+    >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N>
+struct composite<OperationT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t
+> {
+
+    typedef composite<OperationT,
+        A, B, C, D, E, F, G, H, I, J, K, L, M, N> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename composite14_result<
+            OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M, N
+        >::type type;
+    };
+
+    composite(OperationT const& op_,
+        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+        F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
+        K const& k_, L const& l_, M const& m_, N const& n_)
+    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_), h(h_), i(i_), j(j_),
+        k(k_), l(l_), m(m_), n(n_) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        typename actor_result<A, TupleT>::type ra = a.eval(args);
+        typename actor_result<B, TupleT>::type rb = b.eval(args);
+        typename actor_result<C, TupleT>::type rc = c.eval(args);
+        typename actor_result<D, TupleT>::type rd = d.eval(args);
+        typename actor_result<E, TupleT>::type re = e.eval(args);
+        typename actor_result<F, TupleT>::type rf = f.eval(args);
+        typename actor_result<G, TupleT>::type rg = g.eval(args);
+        typename actor_result<H, TupleT>::type rh = h.eval(args);
+        typename actor_result<I, TupleT>::type ri = i.eval(args);
+        typename actor_result<J, TupleT>::type rj = j.eval(args);
+        typename actor_result<K, TupleT>::type rk = k.eval(args);
+        typename actor_result<L, TupleT>::type rl = l.eval(args);
+        typename actor_result<M, TupleT>::type rm = m.eval(args);
+        typename actor_result<N, TupleT>::type rn = n.eval(args);
+        return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm, rn);
+    }
+
+    mutable OperationT op; //  operation
+    A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
+    K k; L l; M m; N n; //  actors
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  composite <15 actors> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N, typename O>
+struct composite15_result {
+
+    typedef typename OperationT::template result<
+        typename actor_result<A, TupleT>::plain_type,
+        typename actor_result<B, TupleT>::plain_type,
+        typename actor_result<C, TupleT>::plain_type,
+        typename actor_result<D, TupleT>::plain_type,
+        typename actor_result<E, TupleT>::plain_type,
+        typename actor_result<F, TupleT>::plain_type,
+        typename actor_result<G, TupleT>::plain_type,
+        typename actor_result<H, TupleT>::plain_type,
+        typename actor_result<I, TupleT>::plain_type,
+        typename actor_result<J, TupleT>::plain_type,
+        typename actor_result<K, TupleT>::plain_type,
+        typename actor_result<L, TupleT>::plain_type,
+        typename actor_result<M, TupleT>::plain_type,
+        typename actor_result<N, TupleT>::plain_type,
+        typename actor_result<O, TupleT>::plain_type
+    >::type type;
+};
+
+//////////////////////////////////
+template <typename OperationT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N, typename O>
+struct composite<OperationT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t
+> {
+
+    typedef composite<OperationT,
+        A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename composite15_result<
+            OperationT, TupleT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
+        >::type type;
+    };
+
+    composite(OperationT const& op_,
+        A const& a_, B const& b_, C const& c_, D const& d_, E const& e_,
+        F const& f_, G const& g_, H const& h_, I const& i_, J const& j_,
+        K const& k_, L const& l_, M const& m_, N const& n_, O const& o_)
+    :   op(op_), a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_), h(h_), i(i_), j(j_),
+        k(k_), l(l_), m(m_), n(n_), o(o_) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        typename actor_result<A, TupleT>::type ra = a.eval(args);
+        typename actor_result<B, TupleT>::type rb = b.eval(args);
+        typename actor_result<C, TupleT>::type rc = c.eval(args);
+        typename actor_result<D, TupleT>::type rd = d.eval(args);
+        typename actor_result<E, TupleT>::type re = e.eval(args);
+        typename actor_result<F, TupleT>::type rf = f.eval(args);
+        typename actor_result<G, TupleT>::type rg = g.eval(args);
+        typename actor_result<H, TupleT>::type rh = h.eval(args);
+        typename actor_result<I, TupleT>::type ri = i.eval(args);
+        typename actor_result<J, TupleT>::type rj = j.eval(args);
+        typename actor_result<K, TupleT>::type rk = k.eval(args);
+        typename actor_result<L, TupleT>::type rl = l.eval(args);
+        typename actor_result<M, TupleT>::type rm = m.eval(args);
+        typename actor_result<N, TupleT>::type rn = n.eval(args);
+        typename actor_result<O, TupleT>::type ro = o.eval(args);
+        return op(ra, rb, rc, rd, re, rf, rg, rh, ri, rj, rk, rl, rm, rn, ro);
+    }
+
+    mutable OperationT op; //  operation
+    A a; B b; C c; D d; E e; F f; G g; H h; I i; J j;
+    K k; L l; M m; N n; O o; //  actors
+};
+
+#endif
+#endif
+#endif
+#endif
+
+namespace impl {
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //      make_composite is basically a type computer that answers the
+    //      question "Given types T0..TN, what composite type should I
+    //      create <composite_type> and if I were to generate an actual
+    //      composite, what type <type> should I return?"
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <
+        typename OperationT
+        ,   typename A = nil_t
+        ,   typename B = nil_t
+        ,   typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+        ,   typename D = nil_t
+        ,   typename E = nil_t
+        ,   typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+        ,   typename G = nil_t
+        ,   typename H = nil_t
+        ,   typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+        ,   typename J = nil_t
+        ,   typename K = nil_t
+        ,   typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+        ,   typename M = nil_t
+        ,   typename N = nil_t
+        ,   typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+    >
+    struct make_composite {
+
+        typedef composite<OperationT
+            ,   typename as_actor<A>::type
+            ,   typename as_actor<B>::type
+            ,   typename as_actor<C>::type
+
+#if PHOENIX_LIMIT > 3
+            ,   typename as_actor<D>::type
+            ,   typename as_actor<E>::type
+            ,   typename as_actor<F>::type
+
+#if PHOENIX_LIMIT > 6
+            ,   typename as_actor<G>::type
+            ,   typename as_actor<H>::type
+            ,   typename as_actor<I>::type
+
+#if PHOENIX_LIMIT > 9
+            ,   typename as_actor<J>::type
+            ,   typename as_actor<K>::type
+            ,   typename as_actor<L>::type
+
+#if PHOENIX_LIMIT > 12
+            ,   typename as_actor<M>::type
+            ,   typename as_actor<N>::type
+            ,   typename as_actor<O>::type
+
+#endif
+#endif
+#endif
+#endif
+        > composite_type;
+
+        typedef actor<composite_type> type;
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //      make_unary, make_binary, make_binary1, make_binary2 and
+    //      make_binary3 utilities are provided here for easy creation of
+    //      unary and binary composites.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+
+    //////////////////////////////////  input is an actor
+    template <typename OperationT, typename BaseT>
+    struct make_unary {
+
+        typedef typename make_composite
+            <OperationT, actor<BaseT> >::type type;
+
+        static type
+        construct(actor<BaseT> const& _0)
+        {
+            typedef typename make_composite
+                    <OperationT, actor<BaseT> >::composite_type
+                ret_t;
+
+            return ret_t(OperationT(), _0);
+        }
+    };
+
+    //////////////////////////////////  LHS is an actor, RHS is unknown
+    template <typename OperationT, typename BaseT, typename B>
+    struct make_binary1 {
+
+        typedef typename make_composite
+            <OperationT, actor<BaseT>, B>::type type;
+
+        static type
+        construct(actor<BaseT> const& _0, B const& _1)
+        {
+            typedef typename make_composite
+                    <OperationT, actor<BaseT>, B>::composite_type
+                ret_t;
+            
+            return ret_t(OperationT(), _0, as_actor<B>::convert(_1));
+        }
+    };
+
+    //////////////////////////////////  LHS is unknown, RHS is an actor
+    template <typename OperationT, typename A, typename BaseT>
+    struct make_binary2 {
+
+        typedef typename make_composite
+            <OperationT, A, actor<BaseT> >::type type;
+
+        static type
+        construct(A const& _0, actor<BaseT> const& _1)
+        {
+            typedef typename make_composite
+                    <OperationT, A, actor<BaseT> >::composite_type
+                ret_t;
+
+            return ret_t(OperationT(), as_actor<A>::convert(_0), _1);
+        }
+    };
+
+    //////////////////////////////////  Both LHS and RHS are actors
+    template <typename OperationT, typename BaseA, typename BaseB>
+    struct make_binary3 {
+
+        typedef typename make_composite
+            <OperationT, actor<BaseA>, actor<BaseB> >::type type;
+
+        static type
+        construct(actor<BaseA> const& _0, actor<BaseB> const& _1)
+        {
+            typedef typename make_composite
+                    <OperationT, actor<BaseA>, actor<BaseB> >::composite_type
+                ret_t;
+
+            return ret_t(OperationT(), _0, _1);
+        }
+    };
+
+}   // namespace impl
+
+}   //  namespace phoenix
+
+#endif
diff --git a/boost/boost/spirit/phoenix/functions.hpp b/boost/boost/spirit/phoenix/functions.hpp
new file mode 100644 (file)
index 0000000..dc13485
--- /dev/null
@@ -0,0 +1,761 @@
+/*=============================================================================
+    Phoenix V1.2.1
+    Copyright (c) 2001-2002 Joel de Guzman
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef PHOENIX_FUNCTIONS_HPP
+#define PHOENIX_FUNCTIONS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/phoenix/actor.hpp>
+#include <boost/spirit/phoenix/composite.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  function class
+//
+//      Lazy functions
+//
+//      This class provides a mechanism for lazily evaluating functions.
+//      Syntactically, a lazy function looks like an ordinary C/C++
+//      function. The function call looks the same. However, unlike
+//      ordinary functions, the actual function execution is deferred.
+//      (see actor.hpp, primitives.hpp and composite.hpp for an
+//      overview). For example here are sample factorial function calls:
+//
+//          factorial(4)
+//          factorial(arg1)
+//          factorial(arg1 * 6)
+//
+//      These functions are automatically lazily bound unlike ordinary
+//      function pointers or functor objects that need to be explicitly
+//      bound through the bind function (see binders.hpp).
+//
+//      A lazy function works in conjunction with a user defined functor
+//      (as usual with a member operator()). Only special forms of
+//      functor objects are allowed. This is required to enable true
+//      polymorphism (STL style monomorphic functors and function
+//      pointers can still be used through the bind facility in
+//      binders.hpp).
+//
+//      This special functor is expected to have a nested template class
+//      result<A...TN> (where N is the number of arguments of its
+//      member operator()). The nested template class result should have
+//      a typedef 'type' that reflects the return type of its member
+//      operator(). This is essentially a type computer that answers the
+//      metaprogramming question "Given arguments of type A...TN, what
+//      will be the operator()'s return type?".
+//
+//      There is a special case for functors that accept no arguments.
+//      Such nullary functors are only required to define a typedef
+//      result_type that reflects the return type of its operator().
+//
+//      Here's an example of a simple functor that computes the
+//      factorial of a number:
+//
+//          struct factorial_impl {
+//
+//              template <typename Arg>
+//              struct result { typedef Arg type; };
+//
+//              template <typename Arg>
+//              Arg operator()(Arg n) const
+//              { return (n <= 0) ? 1 : n * this->operator()(n-1); }
+//          };
+//
+//      As can be seen, the functor can be polymorphic. Its arguments
+//      and return type are not fixed to a particular type. The example
+//      above for example, can handle any type as long as it can carry
+//      out the required operations (i.e. <=, * and -).
+//
+//      We can now declare and instantiate a lazy 'factorial' function:
+//
+//          function<factorial_impl> factorial;
+//
+//      Invoking a lazy function 'factorial' does not immediately
+//      execute the functor factorial_impl. Instead, a composite (see
+//      composite.hpp) object is created and returned to the caller.
+//      Example:
+//
+//          factorial(arg1)
+//
+//      does nothing more than return a composite. A second function
+//      call will invoke the actual factorial function. Example:
+//
+//          int i = 4;
+//          cout << factorial(arg1)(i);
+//
+//      will print out "24".
+//
+//      Take note that in certain cases (e.g. for functors with state),
+//      an instance may be passed on to the constructor. Example:
+//
+//          function<factorial_impl> factorial(ftor);
+//
+//      where ftor is an instance of factorial_impl (this is not
+//      necessary in this case since factorial is a simple stateless
+//      functor). Take care though when using functors with state
+//      because the functors are taken in by value. It is best to keep
+//      the data manipulated by a functor outside the functor itself and
+//      keep a reference to this data inside the functor. Also, it is
+//      best to keep functors as small as possible.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT>
+struct function {
+
+    function() : op() {}
+    function(OperationT const& op_) : op(op_) {}
+
+    actor<composite<OperationT> >
+    operator()() const;
+
+    template <typename A>
+    typename impl::make_composite<OperationT, A>::type
+    operator()(A const& a) const;
+
+    template <typename A, typename B>
+    typename impl::make_composite<OperationT, A, B>::type
+    operator()(A const& a, B const& b) const;
+
+    template <typename A, typename B, typename C>
+    typename impl::make_composite<OperationT, A, B, C>::type
+    operator()(A const& a, B const& b, C const& c) const;
+
+#if PHOENIX_LIMIT > 3
+
+    template <typename A, typename B, typename C, typename D>
+    typename impl::make_composite<OperationT, A, B, C, D>::type
+    operator()(A const& a, B const& b, C const& c, D const& d) const;
+
+    template <typename A, typename B, typename C, typename D, typename E>
+    typename impl::make_composite<
+        OperationT, A, B, C, D, E
+    >::type
+    operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e
+    ) const;
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F
+    >
+    typename impl::make_composite<
+        OperationT, A, B, C, D, E, F
+    >::type
+    operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f
+    ) const;
+
+#if PHOENIX_LIMIT > 6
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G
+    >
+    typename impl::make_composite<
+        OperationT, A, B, C, D, E, F, G
+    >::type
+    operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g
+    ) const;
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H
+    >
+    typename impl::make_composite<
+        OperationT, A, B, C, D, E, F, G, H
+    >::type
+    operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h
+    ) const;
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I
+    >
+    typename impl::make_composite<
+        OperationT, A, B, C, D, E, F, G, H, I
+    >::type
+    operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i
+    ) const;
+
+#if PHOENIX_LIMIT > 9
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J
+    >
+    typename impl::make_composite<
+        OperationT, A, B, C, D, E, F, G, H, I, J
+    >::type
+    operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j
+    ) const;
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K
+    >
+    typename impl::make_composite<
+        OperationT, A, B, C, D, E, F, G, H, I, J, K
+    >::type
+    operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k
+    ) const;
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L
+    >
+    typename impl::make_composite<
+        OperationT, A, B, C, D, E, F, G, H, I, J, K, L
+    >::type
+    operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l
+    ) const;
+
+#if PHOENIX_LIMIT > 12
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M
+    >
+    typename impl::make_composite<
+        OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M
+    >::type
+    operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l, M const& m
+    ) const;
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M, typename N
+    >
+    typename impl::make_composite<
+        OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N
+    >::type
+    operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l, M const& m, N const& n
+    ) const;
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M, typename N, typename O
+    >
+    typename impl::make_composite<
+        OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
+    >::type
+    operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l, M const& m, N const& n, O const& o
+    ) const;
+
+#endif
+#endif
+#endif
+#endif
+
+    OperationT op;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  function class implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename OperationT>
+inline actor<composite<OperationT> >
+function<OperationT>::operator()() const
+{
+    return actor<composite<OperationT> >(op);
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <typename A>
+inline typename impl::make_composite<OperationT, A>::type
+function<OperationT>::operator()(A const& a) const
+{
+    typedef typename impl::make_composite<OperationT, A>::composite_type ret_t;
+    return ret_t
+    (
+        op,
+        as_actor<A>::convert(a)
+    );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <typename A, typename B>
+inline typename impl::make_composite<OperationT, A, B>::type
+function<OperationT>::operator()(A const& a, B const& b) const
+{
+    typedef 
+        typename impl::make_composite<OperationT, A, B>::composite_type 
+        ret_t;
+        
+    return ret_t(
+        op,
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b)
+    );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <typename A, typename B, typename C>
+inline typename impl::make_composite<OperationT, A, B, C>::type
+function<OperationT>::operator()(A const& a, B const& b, C const& c) const
+{
+    typedef 
+        typename impl::make_composite<OperationT, A, B, C>::composite_type
+        ret_t;
+        
+    return ret_t(
+        op,
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c)
+    );
+}
+
+#if PHOENIX_LIMIT > 3
+//////////////////////////////////
+template <typename OperationT>
+template <
+    typename A, typename B, typename C, typename D
+>
+inline typename impl::make_composite<
+    OperationT, A, B, C, D
+>::type
+function<OperationT>::operator()(
+    A const& a, B const& b, C const& c, D const& d
+) const
+{
+    typedef typename impl::make_composite<
+            OperationT, A, B, C, D
+        >::composite_type ret_t;
+        
+    return ret_t(
+        op,
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d)
+    );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+    typename A, typename B, typename C, typename D, typename E
+>
+inline typename impl::make_composite<
+    OperationT, A, B, C, D, E
+>::type
+function<OperationT>::operator()(
+    A const& a, B const& b, C const& c, D const& d, E const& e
+) const
+{
+    typedef typename impl::make_composite<
+            OperationT, A, B, C, D, E
+        >::composite_type ret_t;
+
+    return ret_t(
+        op,
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e)
+    );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F
+>
+inline typename impl::make_composite<
+    OperationT, A, B, C, D, E, F
+>::type
+function<OperationT>::operator()(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f
+) const
+{
+    typedef typename impl::make_composite<
+            OperationT, A, B, C, D, E, F
+        >::composite_type ret_t;
+
+    return ret_t(
+        op,
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f)
+    );
+}
+
+#if PHOENIX_LIMIT > 6
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G
+>
+inline typename impl::make_composite<
+    OperationT, A, B, C, D, E, F, G
+>::type
+function<OperationT>::operator()(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g
+) const
+{
+    typedef typename impl::make_composite<
+            OperationT, A, B, C, D, E, F, G
+        >::composite_type ret_t;
+
+    return ret_t(
+        op,
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g)
+    );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H
+>
+inline typename impl::make_composite<
+    OperationT, A, B, C, D, E, F, G, H
+>::type
+function<OperationT>::operator()(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h
+) const
+{
+    typedef typename impl::make_composite<
+            OperationT, A, B, C, D, E, F, G, H
+        >::composite_type ret_t;
+        
+    return ret_t(
+        op,
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h)
+    );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I
+>
+inline typename impl::make_composite<
+    OperationT, A, B, C, D, E, F, G, H, I
+>::type
+function<OperationT>::operator()(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i
+) const
+{
+    typedef typename impl::make_composite<
+            OperationT, A, B, C, D, E, F, G, H, I
+        >::composite_type ret_t;
+        
+    return ret_t(
+        op,
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i)
+    );
+}
+
+#if PHOENIX_LIMIT > 9
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J
+>
+inline typename impl::make_composite<
+    OperationT, A, B, C, D, E, F, G, H, I, J
+>::type
+function<OperationT>::operator()(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j
+) const
+{
+    typedef typename impl::make_composite<
+            OperationT, A, B, C, D, E, F, G, H, I, J
+        >::composite_type ret_t;
+        
+    return ret_t(
+        op,
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j)
+    );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K
+>
+inline typename impl::make_composite<
+    OperationT, A, B, C, D, E, F, G, H, I, J, K
+>::type
+function<OperationT>::operator()(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j,
+    K const& k
+) const
+{
+    typedef typename impl::make_composite<
+            OperationT, A, B, C, D, E, F, G, H, I, J, K
+        >::composite_type ret_t;
+        
+    return ret_t(
+        op,
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j),
+        as_actor<K>::convert(k)
+    );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L
+>
+inline typename impl::make_composite<
+    OperationT, A, B, C, D, E, F, G, H, I, J, K, L
+>::type
+function<OperationT>::operator()(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j,
+    K const& k, L const& l
+) const
+{
+    typedef typename impl::make_composite<
+            OperationT, A, B, C, D, E, F, G, H, I, J, K, L
+        >::composite_type ret_t;
+        
+    return ret_t(
+        op,
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j),
+        as_actor<K>::convert(k),
+        as_actor<L>::convert(l)
+    );
+}
+
+#if PHOENIX_LIMIT > 12
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M
+>
+inline typename impl::make_composite<
+    OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M
+>::type
+function<OperationT>::operator()(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j,
+    K const& k, L const& l, M const& m
+) const
+{
+    typedef typename impl::make_composite<
+            OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M
+        >::composite_type ret_t;
+        
+    return ret_t(
+        op,
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j),
+        as_actor<K>::convert(k),
+        as_actor<L>::convert(l),
+        as_actor<M>::convert(m)
+    );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N
+>
+inline typename impl::make_composite<
+    OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N
+>::type
+function<OperationT>::operator()(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j,
+    K const& k, L const& l, M const& m, N const& n
+) const
+{
+    typedef typename impl::make_composite<
+            OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N
+        >::composite_type ret_t;
+
+    return ret_t(
+        op,
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j),
+        as_actor<K>::convert(k),
+        as_actor<L>::convert(l),
+        as_actor<M>::convert(m),
+        as_actor<N>::convert(n)
+    );
+}
+
+//////////////////////////////////
+template <typename OperationT>
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N, typename O
+>
+inline typename impl::make_composite<
+    OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
+>::type
+function<OperationT>::operator()(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j,
+    K const& k, L const& l, M const& m, N const& n, O const& o
+) const
+{
+    typedef typename impl::make_composite<
+            OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
+        >::composite_type ret_t;
+        
+    return ret_t(
+        op,
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j),
+        as_actor<K>::convert(k),
+        as_actor<L>::convert(l),
+        as_actor<M>::convert(m),
+        as_actor<N>::convert(n),
+        as_actor<O>::convert(o)
+    );
+}
+
+#endif
+#endif
+#endif
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+}   //  namespace phoenix
+
+#endif
diff --git a/boost/boost/spirit/phoenix/new.hpp b/boost/boost/spirit/phoenix/new.hpp
new file mode 100644 (file)
index 0000000..61d5dc7
--- /dev/null
@@ -0,0 +1,1285 @@
+/*=============================================================================
+    Phoenix V1.2.1
+    Copyright (c) 2001-2003 Joel de Guzman
+    Copyright (c) 2001-2003 Hartmut Kaiser
+    Copyright (c) 2003 Vaclav Vesely
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#ifndef PHOENIX_NEW_HPP
+#define PHOENIX_NEW_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/phoenix/actor.hpp>
+#include <boost/spirit/phoenix/composite.hpp>
+#include <boost/static_assert.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Phoenix predefined maximum new_ limit. This limit defines the maximum
+//  number of parameters supported for calles to the set of new_ template
+//  functions (lazy object construction, see below). This number defaults to 3.
+//  The actual maximum is rounded up in multiples of 3. Thus, if this value
+//  is 4, the actual limit is 6. The ultimate maximum limit in this
+//  implementation is 15.
+//  PHOENIX_CONSTRUCT_LIMIT should NOT be greater than PHOENIX_LIMIT!
+
+#if !defined(PHOENIX_CONSTRUCT_LIMIT)
+#define PHOENIX_CONSTRUCT_LIMIT PHOENIX_LIMIT
+#endif
+
+// ensure PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT
+BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT);
+
+// ensure PHOENIX_CONSTRUCT_LIMIT <= 15
+BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= 15);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  new_
+//
+//      Lazy object construction
+//
+//      The set of new_<> template classes and functions provide a way
+//      of lazily constructing certain object from a arbitrary set of
+//      actors during parsing.
+//      The new_ templates are (syntactically) used very much like
+//      the well known C++ casts:
+//
+//          A *a = new_<A>(...arbitrary list of actors...);
+//
+//      where the given parameters are submitted as parameters to the
+//      contructor of the object of type A. (This certainly implies, that
+//      type A has a constructor with a fitting set of parameter types
+//      defined.)
+//
+//      The maximum number of needed parameters is controlled through the
+//      preprocessor constant PHOENIX_CONSTRUCT_LIMIT. Note though, that this
+//      limit should not be greater than PHOENIX_LIMIT.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename T>
+struct new_l_0
+{
+    typedef T* result_type;
+
+    T* operator()() const
+    {
+        return new T();
+    }
+};
+
+template <typename T>
+struct new_l {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+
+#if PHOENIX_CONSTRUCT_LIMIT > 3
+        ,   typename D
+        ,   typename E
+        ,   typename F
+
+#if PHOENIX_CONSTRUCT_LIMIT > 6
+        ,   typename G
+        ,   typename H
+        ,   typename I
+
+#if PHOENIX_CONSTRUCT_LIMIT > 9
+        ,   typename J
+        ,   typename K
+        ,   typename L
+
+#if PHOENIX_CONSTRUCT_LIMIT > 12
+        ,   typename M
+        ,   typename N
+        ,   typename O
+#endif
+#endif
+#endif
+#endif
+    >
+    struct result { typedef T* type; };
+
+    T* operator()() const {
+        return new T();
+    }
+
+    template <typename A>
+    T* operator()(A const& a) const {
+        return new T(a);
+    }
+
+    template <typename A, typename B>
+    T* operator()(A const& a, B const& b) const {
+        return new T(a, b);
+    }
+
+    template <typename A, typename B, typename C>
+    T* operator()(A const& a, B const& b, C const& c) const {
+        return new T(a, b, c);
+    }
+
+#if PHOENIX_CONSTRUCT_LIMIT > 3
+    template <
+        typename A, typename B, typename C, typename D
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d) const
+    {
+        return new T(a, b, c, d);
+    }
+
+    template <
+        typename A, typename B, typename C, typename D, typename E
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e) const
+    {
+        return new T(a, b, c, d, e);
+    }
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f) const
+    {
+        return new T(a, b, c, d, e, f);
+    }
+
+#if PHOENIX_CONSTRUCT_LIMIT > 6
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g) const
+    {
+        return new T(a, b, c, d, e, f, g);
+    }
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h) const
+    {
+        return new T(a, b, c, d, e, f, g, h);
+    }
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i) const
+    {
+        return new T(a, b, c, d, e, f, g, h, i);
+    }
+
+#if PHOENIX_CONSTRUCT_LIMIT > 9
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j) const
+    {
+        return new T(a, b, c, d, e, f, g, h, i, j);
+    }
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k) const
+    {
+        return new T(a, b, c, d, e, f, g, h, i, j, k);
+    }
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l) const
+    {
+        return new T(a, b, c, d, e, f, g, h, i, j, k, l);
+    }
+
+#if PHOENIX_CONSTRUCT_LIMIT > 12
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l, M const& m) const
+    {
+        return new T(a, b, c, d, e, f, g, h, i, j, k, l, m);
+    }
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M, typename N
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l, M const& m, N const& n) const
+    {
+        return new T(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
+    }
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M, typename N, typename O
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l, M const& m, N const& n, O const& o) const
+    {
+        return new T(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
+    }
+
+#endif
+#endif
+#endif
+#endif
+};
+
+template <typename T>
+struct new_1 {
+
+    template <
+            typename A
+    >
+    struct result { typedef T* type; };
+
+    template <typename A>
+    T* operator()(A const& a) const {
+        return new T(a);
+    }
+
+};
+
+template <typename T>
+struct new_2 {
+
+    template <
+            typename A
+        ,   typename B
+    >
+    struct result { typedef T* type; };
+
+    template <typename A, typename B>
+    T* operator()(A const& a, B const& b) const {
+        return new T(a, b);
+    }
+
+};
+
+template <typename T>
+struct new_3 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+    >
+    struct result { typedef T* type; };
+
+    template <typename A, typename B, typename C>
+    T* operator()(A const& a, B const& b, C const& c) const {
+        return new T(a, b, c);
+    }
+};
+
+#if PHOENIX_CONSTRUCT_LIMIT > 3
+template <typename T>
+struct new_4 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+    >
+    struct result { typedef T* type; };
+
+
+    template <
+        typename A, typename B, typename C, typename D
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d) const
+    {
+        return new T(a, b, c, d);
+    }
+};
+
+
+template <typename T>
+struct new_5 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+    >
+    struct result { typedef T* type; };
+
+    template <
+        typename A, typename B, typename C, typename D, typename E
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e) const
+    {
+        return new T(a, b, c, d, e);
+    }
+};
+
+
+template <typename T>
+struct new_6 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+    >
+    struct result { typedef T* type; };
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f) const
+    {
+        return new T(a, b, c, d, e, f);
+    }
+};
+#endif
+
+
+#if PHOENIX_CONSTRUCT_LIMIT > 6
+template <typename T>
+struct new_7 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+    >
+    struct result { typedef T* type; };
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g) const
+    {
+        return new T(a, b, c, d, e, f, g);
+    }
+};
+
+template <typename T>
+struct new_8 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+        ,   typename H
+    >
+    struct result { typedef T* type; };
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h) const
+    {
+        return new T(a, b, c, d, e, f, g, h);
+    }
+};
+
+template <typename T>
+struct new_9 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+        ,   typename H
+        ,   typename I
+    >
+    struct result { typedef T* type; };
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i) const
+    {
+        return new T(a, b, c, d, e, f, g, h, i);
+    }
+};
+#endif
+
+
+#if PHOENIX_CONSTRUCT_LIMIT > 9
+template <typename T>
+struct new_10 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+        ,   typename H
+        ,   typename I
+        ,   typename J
+    >
+    struct result { typedef T* type; };
+
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j) const
+    {
+        return new T(a, b, c, d, e, f, g, h, i, j);
+    }
+};
+
+template <typename T>
+struct new_11 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+        ,   typename H
+        ,   typename I
+        ,   typename J
+        ,   typename K
+    >
+    struct result { typedef T* type; };
+
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k) const
+    {
+        return new T(a, b, c, d, e, f, g, h, i, j, k);
+    }
+
+};
+
+template <typename T>
+struct new_12 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+        ,   typename H
+        ,   typename I
+        ,   typename J
+        ,   typename K
+        ,   typename L
+    >
+    struct result { typedef T* type; };
+
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l) const
+    {
+        return new T(a, b, c, d, f, e, g, h, i, j, k, l);
+    }
+};
+#endif
+
+#if PHOENIX_CONSTRUCT_LIMIT > 12
+template <typename T>
+struct new_13 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+        ,   typename H
+        ,   typename I
+        ,   typename J
+        ,   typename K
+        ,   typename L
+        ,   typename M
+    >
+    struct result { typedef T* type; };
+
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l, M const& m) const
+    {
+        return new T(a, b, c, d, e, f, g, h, i, j, k, l, m);
+    }
+};
+
+template <typename T>
+struct new_14 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+        ,   typename H
+        ,   typename I
+        ,   typename J
+        ,   typename K
+        ,   typename L
+        ,   typename M
+        ,   typename N
+    >
+    struct result { typedef T* type; };
+
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M, typename N
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l, M const& m, N const& n) const
+    {
+        return new T(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
+    }
+
+};
+
+template <typename T>
+struct new_15 {
+
+    template <
+            typename A
+        ,   typename B
+        ,   typename C
+        ,   typename D
+        ,   typename E
+        ,   typename F
+        ,   typename G
+        ,   typename H
+        ,   typename I
+        ,   typename J
+        ,   typename K
+        ,   typename L
+        ,   typename M
+        ,   typename N
+        ,   typename O
+    >
+    struct result { typedef T* type; };
+
+
+    template <
+        typename A, typename B, typename C, typename D, typename E,
+        typename F, typename G, typename H, typename I, typename J,
+        typename K, typename L, typename M, typename N, typename O
+    >
+    T* operator()(
+        A const& a, B const& b, C const& c, D const& d, E const& e,
+        F const& f, G const& g, H const& h, I const& i, J const& j,
+        K const& k, L const& l, M const& m, N const& n, O const& o) const
+    {
+        return new T(a, b, c, d, f, e, g, h, i, j, k, l, m, n, o);
+    }
+
+};
+#endif
+
+
+#if defined(__BORLANDC__) || (defined(__MWERKS__) && (__MWERKS__ <= 0x3002))
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The following specializations are needed because Borland and CodeWarrior
+//  does not accept default template arguments in nested template classes in
+//  classes (i.e new_l::result)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T, typename TupleT>
+struct composite0_result<new_l_0<T>, TupleT> {
+
+    typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A>
+struct composite1_result<new_l<T>, TupleT, A> {
+
+    typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B>
+struct composite2_result<new_l<T>, TupleT, A, B> {
+
+    typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C>
+struct composite3_result<new_l<T>, TupleT, A, B, C> {
+
+    typedef T* type;
+};
+
+#if PHOENIX_LIMIT > 3
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D>
+struct composite4_result<new_l<T>, TupleT,
+    A, B, C, D> {
+
+    typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E>
+struct composite5_result<new_l<T>, TupleT,
+    A, B, C, D, E> {
+
+    typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F>
+struct composite6_result<new_l<T>, TupleT,
+    A, B, C, D, E, F> {
+
+    typedef T* type;
+};
+
+#if PHOENIX_LIMIT > 6
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G>
+struct composite7_result<new_l<T>, TupleT,
+    A, B, C, D, E, F, G> {
+
+    typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H>
+struct composite8_result<new_l<T>, TupleT,
+    A, B, C, D, E, F, G, H> {
+
+    typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I>
+struct composite9_result<new_l<T>, TupleT,
+    A, B, C, D, E, F, G, H, I> {
+
+    typedef T* type;
+};
+
+#if PHOENIX_LIMIT > 9
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J>
+struct composite10_result<new_l<T>, TupleT,
+    A, B, C, D, E, F, G, H, I, J> {
+
+    typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K>
+struct composite11_result<new_l<T>, TupleT,
+    A, B, C, D, E, F, G, H, I, J, K> {
+
+    typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L>
+struct composite12_result<new_l<T>, TupleT,
+    A, B, C, D, E, F, G, H, I, J, K, L> {
+
+    typedef T* type;
+};
+
+#if PHOENIX_LIMIT > 12
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M>
+struct composite13_result<new_l<T>, TupleT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M> {
+
+    typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N>
+struct composite14_result<new_l<T>, TupleT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, N> {
+
+    typedef T* type;
+};
+
+//////////////////////////////////
+template <typename T, typename TupleT,
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N, typename O>
+struct composite15_result<new_l<T>, TupleT,
+    A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> {
+
+    typedef T* type;
+};
+
+#endif
+#endif
+#endif
+#endif
+#endif
+
+//////////////////////////////////
+template <typename T>
+inline typename impl::make_composite<new_l_0<T> >::type
+new_()
+{
+    typedef impl::make_composite<new_l_0<T> > make_composite_t;
+
+    return make_composite_t::type(
+        make_composite_t::composite_type(new_l_0<T>()));
+}
+
+//////////////////////////////////
+template <typename T, typename A>
+inline typename impl::make_composite<new_1<T>, A>::type
+new_(A const& a)
+{
+    typedef impl::make_composite<new_1<T>, A> make_composite_t;
+
+    return make_composite_t::type(make_composite_t::composite_type(new_1<T>(), 
+        as_actor<A>::convert(a)
+    ));
+}
+
+//////////////////////////////////
+template <typename T, typename A, typename B>
+inline typename impl::make_composite<new_2<T>, A, B>::type
+new_(A const& a, B const& b)
+{
+    typedef impl::make_composite<new_2<T>, A, B> make_composite_t;
+
+    return make_composite_t::type(make_composite_t::composite_type(new_2<T>(),
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b)
+    ));
+}
+
+//////////////////////////////////
+template <typename T, typename A, typename B, typename C>
+inline typename impl::make_composite<new_3<T>, A, B, C>::type
+new_(A const& a, B const& b, C const& c)
+{
+    typedef impl::make_composite<new_3<T>, A, B, C> make_composite_t;
+
+    return make_composite_t::type(make_composite_t::composite_type(new_3<T>(),
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c)
+    ));
+}
+
+#if PHOENIX_CONSTRUCT_LIMIT > 3
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D
+>
+inline typename impl::make_composite<new_4<T>, A, B, C, D>::type
+new_(
+    A const& a, B const& b, C const& c, D const& d)
+{
+    typedef
+        impl::make_composite<new_4<T>, A, B, C, D>
+        make_composite_t;
+
+    return make_composite_t::type(make_composite_t::composite_type(new_4<T>(), 
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d)
+    ));
+}
+
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E
+>
+inline typename impl::make_composite<new_5<T>, A, B, C, D, E>::type
+new_(
+    A const& a, B const& b, C const& c, D const& d, E const& e)
+{
+    typedef
+        impl::make_composite<new_5<T>, A, B, C, D, E>
+        make_composite_t;
+
+    return make_composite_t::type(make_composite_t::composite_type(new_5<T>(), 
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e)
+    ));
+}
+
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F
+>
+inline typename impl::make_composite<new_6<T>, A, B, C, D, E, F>::type
+new_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f)
+{
+    typedef
+        impl::make_composite<new_6<T>, A, B, C, D, E, F>
+        make_composite_t;
+
+    return make_composite_t::type(make_composite_t::composite_type(new_6<T>(), 
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f)
+    ));
+}
+
+#if PHOENIX_CONSTRUCT_LIMIT > 6
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G
+>
+inline typename impl::make_composite<new_7<T>, A, B, C, D, E, F, G>::type
+new_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g)
+{
+    typedef
+        impl::make_composite<new_7<T>, A, B, C, D, E, F, G>
+        make_composite_t;
+
+    return make_composite_t::type(make_composite_t::composite_type(new_7<T>(), 
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g)
+    ));
+}
+
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H
+>
+inline typename impl::make_composite<new_8<T>, A, B, C, D, E, F, G, H>::type
+new_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h)
+{
+    typedef
+        impl::make_composite<new_8<T>, A, B, C, D, E, F, G, H>
+        make_composite_t;
+
+    return make_composite_t::type(make_composite_t::composite_type(new_8<T>(),
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h)
+    ));
+}
+
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I
+>
+inline typename impl::make_composite<new_9<T>, A, B, C, D, E, F, G, H, I>::type
+new_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i)
+{
+    typedef
+        impl::make_composite<new_9<T>, A, B, C, D, E, F, G, H, I>
+        make_composite_t;
+
+    return make_composite_t::type(make_composite_t::composite_type(new_9<T>(), 
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i)
+    ));
+}
+
+#if PHOENIX_CONSTRUCT_LIMIT > 9
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J
+>
+inline typename impl::make_composite<
+    new_10<T>, A, B, C, D, E, F, G, H, I, J>::type
+new_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j)
+{
+    typedef
+        impl::make_composite<
+            new_10<T>, A, B, C, D, E, F, G, H, I, J
+        >
+        make_composite_t;
+
+    return make_composite_t::type(make_composite_t::composite_type(new_10<T>(), 
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j)
+    ));
+}
+
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J, typename K
+>
+inline typename impl::make_composite<
+    new_11<T>, A, B, C, D, E, F, G, H, I, J, K>::type
+new_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j,
+    K const& k)
+{
+    typedef
+        impl::make_composite<
+            new_11<T>, A, B, C, D, E, F, G, H, I, J, K
+        >
+        make_composite_t;
+
+    return make_composite_t::type(make_composite_t::composite_type(new_11<T>(), 
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j),
+        as_actor<K>::convert(k)
+    ));
+}
+
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J, typename K,
+    typename L
+>
+inline typename impl::make_composite<
+    new_12<T>, A, B, C, D, E, F, G, H, I, J, K, L>::type
+new_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j,
+    K const& k, L const& l)
+{
+    typedef
+        impl::make_composite<
+            new_12<T>, A, B, C, D, E, F, G, H, I, J, K, L
+        >
+        make_composite_t;
+
+    return make_composite_t::type(make_composite_t::composite_type(new_12<T>(), 
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j),
+        as_actor<K>::convert(k),
+        as_actor<L>::convert(l)
+    ));
+}
+
+#if PHOENIX_CONSTRUCT_LIMIT > 12
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J, typename K,
+    typename L, typename M
+>
+inline typename impl::make_composite<
+    new_13<T>, A, B, C, D, E, F, G, H, I, J, K, L, M>::type
+new_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j,
+    K const& k, L const& l, M const& m)
+{
+    typedef
+        impl::make_composite<
+            new_13<T>, A, B, C, D, E, F, G, H, I, J, K, L, M
+        >
+        make_composite_t;
+
+    return make_composite_t::type(make_composite_t::composite_type(new_13<T>(), 
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j),
+        as_actor<K>::convert(k),
+        as_actor<L>::convert(l),
+        as_actor<M>::convert(m)
+    ));
+}
+
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J, typename K,
+    typename L, typename M, typename N
+>
+inline typename impl::make_composite<
+    new_14<T>, A, B, C, D, E, F, G, H, I, J, K, L, M>::type
+new_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j,
+    K const& k, L const& l, M const& m, N const& n)
+{
+    typedef
+        impl::make_composite<
+            new_14<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, N
+        >
+        make_composite_t;
+
+    return make_composite_t::type(make_composite_t::composite_type(new_14<T>(), 
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j),
+        as_actor<K>::convert(k),
+        as_actor<L>::convert(l),
+        as_actor<M>::convert(m),
+        as_actor<N>::convert(n)
+    ));
+}
+
+//////////////////////////////////
+template <
+    typename T, typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J, typename K,
+    typename L, typename M, typename N, typename O
+>
+inline typename impl::make_composite<
+    new_15<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, O>::type
+new_(
+    A const& a, B const& b, C const& c, D const& d, E const& e,
+    F const& f, G const& g, H const& h, I const& i, J const& j,
+    K const& k, L const& l, M const& m, N const& n, O const& o)
+{
+    typedef
+        impl::make_composite<
+            new_15<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
+        >
+        make_composite_t;
+
+    return make_composite_t::type(make_composite_t::composite_type(new_15<T>(), 
+        as_actor<A>::convert(a),
+        as_actor<B>::convert(b),
+        as_actor<C>::convert(c),
+        as_actor<D>::convert(d),
+        as_actor<E>::convert(e),
+        as_actor<F>::convert(f),
+        as_actor<G>::convert(g),
+        as_actor<H>::convert(h),
+        as_actor<I>::convert(i),
+        as_actor<J>::convert(j),
+        as_actor<K>::convert(k),
+        as_actor<L>::convert(l),
+        as_actor<M>::convert(m),
+        as_actor<N>::convert(n),
+        as_actor<O>::convert(o)
+    ));
+}
+
+#endif
+#endif
+#endif
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+}   //  namespace phoenix
+
+#endif // PHOENIX_NEW_HPP
diff --git a/boost/boost/spirit/phoenix/operators.hpp b/boost/boost/spirit/phoenix/operators.hpp
new file mode 100644 (file)
index 0000000..6d2d03b
--- /dev/null
@@ -0,0 +1,2214 @@
+/*=============================================================================
+    Phoenix V1.2.1
+    Copyright (c) 2001-2002 Joel de Guzman
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef PHOENIX_OPERATORS_HPP
+#define PHOENIX_OPERATORS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_NO_CWCTYPE)
+    #include <cwctype>
+#endif
+
+#if defined(__BORLANDC__) || (defined(__ICL) && __ICL >= 700)
+#define CREF const&
+#else
+#define CREF
+#endif
+
+#include <boost/spirit/phoenix/actor.hpp>
+#include <boost/spirit/phoenix/composite.hpp>
+#include <boost/config.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Operators
+//
+//      Lazy operators
+//
+//      This class provides a mechanism for lazily evaluating operators.
+//      Syntactically, a lazy operator looks like an ordinary C/C++
+//      infix, prefix or postfix operator. The operator application
+//      looks the same. However, unlike ordinary operators, the actual
+//      operator execution is deferred. (see actor.hpp, primitives.hpp
+//      and composite.hpp for an overview). Samples:
+//
+//          arg1 + arg2
+//          1 + arg1 * arg2
+//          1 / -arg1
+//          arg1 < 150
+//
+//      T1 set of classes implement all the C++ free operators. Like
+//      lazy functions (see functions.hpp), lazy operators are not
+//      immediately executed when invoked. Instead, a composite (see
+//      composite.hpp) object is created and returned to the caller.
+//      Example:
+//
+//          (arg1 + arg2) * arg3
+//
+//      does nothing more than return a composite. T1 second function
+//      call will evaluate the actual operators. Example:
+//
+//          int i = 4, j = 5, k = 6;
+//          cout << ((arg1 + arg2) * arg3)(i, j, k);
+//
+//      will print out "54".
+//
+//      Arbitrarily complex expressions can be lazily evaluated
+//      following three simple rules:
+//
+//          1) Lazy evaluated binary operators apply when at least one
+//          of the operands is an actor object (see actor.hpp and
+//          primitives.hpp). Consequently, if an operand is not an actor
+//          object, it is implicitly converted to an object of type
+//          actor<value<T> > (where T is the original type of the
+//          operand).
+//
+//          2) Lazy evaluated unary operators apply only to operands
+//          which are actor objects.
+//
+//          3) The result of a lazy operator is a composite actor object
+//          that can in turn apply to rule 1.
+//
+//      Example:
+//
+//          arg1 + 3
+//
+//      is a lazy expression involving the operator+. Following rule 1,
+//      lazy evaluation is triggered since arg1 is an instance of an
+//      actor<argument<N> > class (see primitives.hpp). The right
+//      operand <3> is implicitly converted to an actor<value<int> >.
+//      The result of this binary + expression is a composite object,
+//      following rule 3.
+//
+//      Take note that although at least one of the operands must be a
+//      valid actor class in order for lazy evaluation to take effect,
+//      if this is not the case and we still want to lazily evaluate an
+//      expression, we can use var(x), val(x) or cref(x) to transform
+//      the operand into a valid action object (see primitives.hpp).
+//      Example:
+//
+//          val(1) << 3;
+//
+//      Supported operators:
+//
+//          Unary operators:
+//
+//              prefix:   ~, !, -, +, ++, --, & (reference), * (dereference)
+//              postfix:  ++, --
+//
+//          Binary operators:
+//
+//              =, [], +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
+//              +, -, *, /, %, &, |, ^, <<, >>
+//              ==, !=, <, >, <=, >=
+//              &&, ||
+//
+//      Each operator has a special tag type associated with it. For
+//      example the binary + operator has a plus_op tag type associated
+//      with it. This is used to specialize either the unary_operator or
+//      binary_operator template classes (see unary_operator and
+//      binary_operator below). Specializations of these unary_operator
+//      and binary_operator are the actual workhorses that implement the
+//      operations. The behavior of each lazy operator depends on these
+//      unary_operator and binary_operator specializations. 'preset'
+//      specializations conform to the canonical operator rules modeled
+//      by the behavior of integers and pointers:
+//
+//          Prefix -, + and ~ accept constant arguments and return an
+//          object by value.
+//
+//          The ! accept constant arguments and returns a boolean
+//          result.
+//
+//          The & (address-of), * (dereference) both return a reference
+//          to an object.
+//
+//          Prefix ++ returns a reference to its mutable argument after
+//          it is incremented.
+//
+//          Postfix ++ returns the mutable argument by value before it
+//          is incremented.
+//
+//          The += and its family accept mutable right hand side (rhs)
+//          operand and return a reference to the rhs operand.
+//
+//          Infix + and its family accept constant arguments and return
+//          an object by value.
+//
+//          The == and its family accept constant arguments and return a
+//          boolean result.
+//
+//          Operators && and || accept constant arguments and return a
+//          boolean result and are short circuit evaluated as expected.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Operator tags
+//
+//      Each C++ operator has a corresponding tag type. This is
+//      used as a means for specializing the unary_operator and
+//      binary_operator (see below). The tag also serves as the
+//      lazy operator type compatible as a composite operation
+//      see (composite.hpp).
+//
+///////////////////////////////////////////////////////////////////////////////
+
+//  Unary operator tags
+
+struct negative_op;         struct positive_op;
+struct logical_not_op;      struct invert_op;
+struct reference_op;        struct dereference_op;
+struct pre_incr_op;         struct pre_decr_op;
+struct post_incr_op;        struct post_decr_op;
+
+//  Binary operator tags
+
+struct assign_op;           struct index_op;
+struct plus_assign_op;      struct minus_assign_op;
+struct times_assign_op;     struct divide_assign_op;    struct mod_assign_op;
+struct and_assign_op;       struct or_assign_op;        struct xor_assign_op;
+struct shift_l_assign_op;   struct shift_r_assign_op;
+
+struct plus_op;             struct minus_op;
+struct times_op;            struct divide_op;           struct mod_op;
+struct and_op;              struct or_op;               struct xor_op;
+struct shift_l_op;          struct shift_r_op;
+
+struct eq_op;               struct not_eq_op;
+struct lt_op;               struct lt_eq_op;
+struct gt_op;               struct gt_eq_op;
+struct logical_and_op;      struct logical_or_op;
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  unary_operator<TagT, T>
+//
+//      The unary_operator class implements most of the C++ unary
+//      operators. Each specialization is basically a simple static eval
+//      function plus a result_type typedef that determines the return
+//      type of the eval function.
+//
+//      TagT is one of the unary operator tags above and T is the data
+//      type (argument) involved in the operation.
+//
+//      Only the behavior of C/C++ built-in types are taken into account
+//      in the specializations provided below. For user-defined types,
+//      these specializations may still be used provided that the
+//      operator overloads of such types adhere to the standard behavior
+//      of built-in types.
+//
+//      T1 separate special_ops.hpp file implements more stl savvy
+//      specializations. Other more specialized unary_operator
+//      implementations may be defined by the client for specific
+//      unary operator tags/data types.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename TagT, typename T>
+struct unary_operator;
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<negative_op, T> {
+
+    typedef T const result_type;
+    static result_type eval(T const& v)
+    { return -v; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<positive_op, T> {
+
+    typedef T const result_type;
+    static result_type eval(T const& v)
+    { return +v; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<logical_not_op, T> {
+
+    typedef bool result_type;
+    static result_type eval(T const& v)
+    { return !v; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<invert_op, T> {
+
+    typedef T const result_type;
+    static result_type eval(T const& v)
+    { return ~v; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<reference_op, T> {
+
+    typedef T* result_type;
+    static result_type eval(T& v)
+    { return &v; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<dereference_op, T*> {
+
+    typedef T& result_type;
+    static result_type eval(T* v)
+    { return *v; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<dereference_op, T* const> {
+
+    typedef T& result_type;
+    static result_type eval(T* const v)
+    { return *v; }
+};
+
+//////////////////////////////////
+template <>
+struct unary_operator<dereference_op, nil_t> {
+
+    //  G++ eager template instantiation
+    //  somehow requires this.
+    typedef nil_t result_type;
+};
+
+//////////////////////////////////
+#ifndef __BORLANDC__
+template <>
+struct unary_operator<dereference_op, nil_t const> {
+
+    //  G++ eager template instantiation
+    //  somehow requires this.
+    typedef nil_t result_type;
+};
+#endif
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<pre_incr_op, T> {
+
+    typedef T& result_type;
+    static result_type eval(T& v)
+    { return ++v; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<pre_decr_op, T> {
+
+    typedef T& result_type;
+    static result_type eval(T& v)
+    { return --v; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<post_incr_op, T> {
+
+    typedef T const result_type;
+    static result_type eval(T& v)
+    { T t(v); ++v; return t; }
+};
+
+//////////////////////////////////
+template <typename T>
+struct unary_operator<post_decr_op, T> {
+
+    typedef T const result_type;
+    static result_type eval(T& v)
+    { T t(v); --v; return t; }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  rank<T>
+//
+//      rank<T> class has a static int constant 'value' that defines the
+//      absolute rank of a type. rank<T> is used to choose the result
+//      type of binary operators such as +. The type with the higher
+//      rank wins and is used as the operator's return type. T1 generic
+//      user defined type has a very high rank and always wins when
+//      compared against a user defined type. If this is not desireable,
+//      one can write a rank specialization for the type.
+//
+//      Take note that ranks 0..9999 are reserved for the framework.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+struct rank { static int const value = INT_MAX; };
+
+template <> struct rank<void>               { static int const value = 0; };
+template <> struct rank<bool>               { static int const value = 10; };
+
+template <> struct rank<char>               { static int const value = 20; };
+template <> struct rank<signed char>        { static int const value = 20; };
+template <> struct rank<unsigned char>      { static int const value = 30; };
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+template <> struct rank<wchar_t>            { static int const value = 40; };
+#endif // !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+
+template <> struct rank<short>              { static int const value = 50; };
+template <> struct rank<unsigned short>     { static int const value = 60; };
+
+template <> struct rank<int>                { static int const value = 70; };
+template <> struct rank<unsigned int>       { static int const value = 80; };
+
+template <> struct rank<long>               { static int const value = 90; };
+template <> struct rank<unsigned long>      { static int const value = 100; };
+
+#ifdef BOOST_HAS_LONG_LONG
+template <> struct rank< ::boost::long_long_type>          { static int const value = 110; };
+template <> struct rank< ::boost::ulong_long_type> { static int const value = 120; };
+#endif
+
+template <> struct rank<float>              { static int const value = 130; };
+template <> struct rank<double>             { static int const value = 140; };
+template <> struct rank<long double>        { static int const value = 150; };
+
+template <typename T> struct rank<T*>
+{ static int const value = 160; };
+
+template <typename T> struct rank<T* const>
+{ static int const value = 160; };
+
+template <typename T, int N> struct rank<T[N]>
+{ static int const value = 160; };
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  higher_rank<T0, T1>
+//
+//      Chooses the type (T0 or T1) with the higher rank.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T0, typename T1>
+struct higher_rank {
+
+    enum {
+
+        rank1 = rank<T0>::value,
+        rank2 = rank<T1>::value,
+
+#if defined __BORLANDC__ && __BORLANDC__ >= 0x561
+        siz = (rank<T0>::value < rank<T1>::value) ? 1 : 2
+#else
+        siz = (rank1 < rank2) ? 1 : 2
+#endif
+    };
+
+    typedef char compare_rank[siz];
+    typedef typename impl::if_t<compare_rank, T1, T0>::type type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  binary_operator<TagT, T0, T1>
+//
+//      The binary_operator class implements most of the C++ binary
+//      operators. Each specialization is basically a simple static eval
+//      function plus a result_type typedef that determines the return
+//      type of the eval function.
+//
+//      TagT is one of the binary operator tags above T0 and T1 are the
+//      (arguments') data types involved in the operation.
+//
+//      Only the behavior of C/C++ built-in types are taken into account
+//      in the specializations provided below. For user-defined types,
+//      these specializations may still be used provided that the
+//      operator overloads of such types adhere to the standard behavior
+//      of built-in types.
+//
+//      T1 separate special_ops.hpp file implements more stl savvy
+//      specializations. Other more specialized unary_operator
+//      implementations may be defined by the client for specific
+//      unary operator tags/data types.
+//
+//      All binary_operator except the logical_and_op and logical_or_op
+//      have an eval static function that carries out the actual operation.
+//      The logical_and_op and logical_or_op d are special because these
+//      two operators are short-circuit evaluated.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename TagT, typename T0, typename T1>
+struct binary_operator;
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<assign_op, T0, T1> {
+
+    typedef T0& result_type;
+    static result_type eval(T0& lhs, T1 const& rhs)
+    { return lhs = rhs; }
+};
+
+//////////////////////////////////
+template <typename T1>
+struct binary_operator<index_op, nil_t, T1> {
+
+    //  G++ eager template instantiation
+    //  somehow requires this.
+    typedef nil_t result_type;
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<index_op, T0*, T1> {
+
+    typedef T0& result_type;
+    static result_type eval(T0* ptr, T1 const& index)
+    { return ptr[index]; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<index_op, T0* const, T1> {
+
+    typedef T0& result_type;
+    static result_type eval(T0* const ptr, T1 const& index)
+    { return ptr[index]; }
+};
+
+//////////////////////////////////
+template <typename T0, int N, typename T1>
+struct binary_operator<index_op, T0[N], T1> {
+
+    typedef T0& result_type;
+    static result_type eval(T0* ptr, T1 const& index)
+    { return ptr[index]; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<plus_assign_op, T0, T1> {
+
+    typedef T0& result_type;
+    static result_type eval(T0& lhs, T1 const& rhs)
+    { return lhs += rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<minus_assign_op, T0, T1> {
+
+    typedef T0& result_type;
+    static result_type eval(T0& lhs, T1 const& rhs)
+    { return lhs -= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<times_assign_op, T0, T1> {
+
+    typedef T0& result_type;
+    static result_type eval(T0& lhs, T1 const& rhs)
+    { return lhs *= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<divide_assign_op, T0, T1> {
+
+    typedef T0& result_type;
+    static result_type eval(T0& lhs, T1 const& rhs)
+    { return lhs /= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<mod_assign_op, T0, T1> {
+
+    typedef T0& result_type;
+    static result_type eval(T0& lhs, T1 const& rhs)
+    { return lhs %= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<and_assign_op, T0, T1> {
+
+    typedef T0& result_type;
+    static result_type eval(T0& lhs, T1 const& rhs)
+    { return lhs &= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<or_assign_op, T0, T1> {
+
+    typedef T0& result_type;
+    static result_type eval(T0& lhs, T1 const& rhs)
+    { return lhs |= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<xor_assign_op, T0, T1> {
+
+    typedef T0& result_type;
+    static result_type eval(T0& lhs, T1 const& rhs)
+    { return lhs ^= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<shift_l_assign_op, T0, T1> {
+
+    typedef T0& result_type;
+    static result_type eval(T0& lhs, T1 const& rhs)
+    { return lhs <<= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<shift_r_assign_op, T0, T1> {
+
+    typedef T0& result_type;
+    static result_type eval(T0& lhs, T1 const& rhs)
+    { return lhs >>= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<plus_op, T0, T1> {
+
+    typedef typename higher_rank<T0, T1>::type const result_type;
+    static result_type eval(T0 const& lhs, T1 const& rhs)
+    { return lhs + rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<minus_op, T0, T1> {
+
+    typedef typename higher_rank<T0, T1>::type const result_type;
+    static result_type eval(T0 const& lhs, T1 const& rhs)
+    { return lhs - rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<times_op, T0, T1> {
+
+    typedef typename higher_rank<T0, T1>::type const result_type;
+    static result_type eval(T0 const& lhs, T1 const& rhs)
+    { return lhs * rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<divide_op, T0, T1> {
+
+    typedef typename higher_rank<T0, T1>::type const result_type;
+    static result_type eval(T0 const& lhs, T1 const& rhs)
+    { return lhs / rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<mod_op, T0, T1> {
+
+    typedef typename higher_rank<T0, T1>::type const result_type;
+    static result_type eval(T0 const& lhs, T1 const& rhs)
+    { return lhs % rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<and_op, T0, T1> {
+
+    typedef typename higher_rank<T0, T1>::type const result_type;
+    static result_type eval(T0 const& lhs, T1 const& rhs)
+    { return lhs & rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<or_op, T0, T1> {
+
+    typedef typename higher_rank<T0, T1>::type const result_type;
+    static result_type eval(T0 const& lhs, T1 const& rhs)
+    { return lhs | rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<xor_op, T0, T1> {
+
+    typedef typename higher_rank<T0, T1>::type const result_type;
+    static result_type eval(T0 const& lhs, T1 const& rhs)
+    { return lhs ^ rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<shift_l_op, T0, T1> {
+
+    typedef T0 const result_type;
+    static result_type eval(T0 const& lhs, T1 const& rhs)
+    { return lhs << rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<shift_r_op, T0, T1> {
+
+    typedef T0 const result_type;
+    static result_type eval(T0 const& lhs, T1 const& rhs)
+    { return lhs >> rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<eq_op, T0, T1> {
+
+    typedef bool result_type;
+    static result_type eval(T0 const& lhs, T1 const& rhs)
+    { return lhs == rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<not_eq_op, T0, T1> {
+
+    typedef bool result_type;
+    static result_type eval(T0 const& lhs, T1 const& rhs)
+    { return lhs != rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<lt_op, T0, T1> {
+
+    typedef bool result_type;
+    static result_type eval(T0 const& lhs, T1 const& rhs)
+    { return lhs < rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<lt_eq_op, T0, T1> {
+
+    typedef bool result_type;
+    static result_type eval(T0 const& lhs, T1 const& rhs)
+    { return lhs <= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<gt_op, T0, T1> {
+
+    typedef bool result_type;
+    static result_type eval(T0 const& lhs, T1 const& rhs)
+    { return lhs > rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<gt_eq_op, T0, T1> {
+
+    typedef bool result_type;
+    static result_type eval(T0 const& lhs, T1 const& rhs)
+    { return lhs >= rhs; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<logical_and_op, T0, T1> {
+
+    typedef bool result_type;
+    //  no eval function, see comment above.
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<logical_or_op, T0, T1> {
+
+    typedef bool result_type;
+    //  no eval function, see comment above.
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  negative lazy operator (prefix -)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct negative_op {
+
+    template <typename T0>
+    struct result {
+
+        typedef typename unary_operator<negative_op, T0>::result_type type;
+    };
+
+    template <typename T0>
+    typename unary_operator<negative_op, T0>::result_type
+    operator()(T0& _0) const
+    { return unary_operator<negative_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<negative_op, BaseT>::type
+operator-(actor<BaseT> const& _0)
+{
+    return impl::make_unary<negative_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  positive lazy operator (prefix +)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct positive_op {
+
+    template <typename T0>
+    struct result {
+
+        typedef typename unary_operator<positive_op, T0>::result_type type;
+    };
+
+    template <typename T0>
+    typename unary_operator<positive_op, T0>::result_type
+    operator()(T0& _0) const
+    { return unary_operator<positive_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<positive_op, BaseT>::type
+operator+(actor<BaseT> const& _0)
+{
+    return impl::make_unary<positive_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  logical not lazy operator (prefix !)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct logical_not_op {
+
+    template <typename T0>
+    struct result {
+
+        typedef typename unary_operator<logical_not_op, T0>::result_type type;
+    };
+
+    template <typename T0>
+    typename unary_operator<logical_not_op, T0>::result_type
+    operator()(T0& _0) const
+    { return unary_operator<logical_not_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<logical_not_op, BaseT>::type
+operator!(actor<BaseT> const& _0)
+{
+    return impl::make_unary<logical_not_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  invert lazy operator (prefix ~)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct invert_op {
+
+    template <typename T0>
+    struct result {
+
+        typedef typename unary_operator<invert_op, T0>::result_type type;
+    };
+
+    template <typename T0>
+    typename unary_operator<invert_op, T0>::result_type
+    operator()(T0& _0) const
+    { return unary_operator<invert_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<invert_op, BaseT>::type
+operator~(actor<BaseT> const& _0)
+{
+    return impl::make_unary<invert_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  reference lazy operator (prefix &)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct reference_op {
+
+    template <typename T0>
+    struct result {
+
+        typedef typename unary_operator<reference_op, T0>::result_type type;
+    };
+
+    template <typename T0>
+    typename unary_operator<reference_op, T0>::result_type
+    operator()(T0& _0) const
+    { return unary_operator<reference_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<reference_op, BaseT>::type
+operator&(actor<BaseT> const& _0)
+{
+    return impl::make_unary<reference_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  dereference lazy operator (prefix *)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct dereference_op {
+
+    template <typename T0>
+    struct result {
+
+        typedef typename unary_operator<dereference_op, T0>::result_type type;
+    };
+
+    template <typename T0>
+    typename unary_operator<dereference_op, T0>::result_type
+    operator()(T0& _0) const
+    { return unary_operator<dereference_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<dereference_op, BaseT>::type
+operator*(actor<BaseT> const& _0)
+{
+    return impl::make_unary<dereference_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  pre increment lazy operator (prefix ++)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct pre_incr_op {
+
+    template <typename T0>
+    struct result {
+
+        typedef typename unary_operator<pre_incr_op, T0>::result_type type;
+    };
+
+    template <typename T0>
+    typename unary_operator<pre_incr_op, T0>::result_type
+    operator()(T0& _0) const
+    { return unary_operator<pre_incr_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<pre_incr_op, BaseT>::type
+operator++(actor<BaseT> const& _0)
+{
+    return impl::make_unary<pre_incr_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  pre decrement lazy operator (prefix --)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct pre_decr_op {
+
+    template <typename T0>
+    struct result {
+
+        typedef typename unary_operator<pre_decr_op, T0>::result_type type;
+    };
+
+    template <typename T0>
+    typename unary_operator<pre_decr_op, T0>::result_type
+    operator()(T0& _0) const
+    { return unary_operator<pre_decr_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<pre_decr_op, BaseT>::type
+operator--(actor<BaseT> const& _0)
+{
+    return impl::make_unary<pre_decr_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  post increment lazy operator (postfix ++)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct post_incr_op {
+
+    template <typename T0>
+    struct result {
+
+        typedef typename unary_operator<post_incr_op, T0>::result_type type;
+    };
+
+    template <typename T0>
+    typename unary_operator<post_incr_op, T0>::result_type
+    operator()(T0& _0) const
+    { return unary_operator<post_incr_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<post_incr_op, BaseT>::type
+operator++(actor<BaseT> const& _0, int)
+{
+    return impl::make_unary<post_incr_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  post decrement lazy operator (postfix --)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct post_decr_op {
+
+    template <typename T0>
+    struct result {
+
+        typedef typename unary_operator<post_decr_op, T0>::result_type type;
+    };
+
+    template <typename T0>
+    typename unary_operator<post_decr_op, T0>::result_type
+    operator()(T0& _0) const
+    { return unary_operator<post_decr_op, T0>::eval(_0); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_unary<post_decr_op, BaseT>::type
+operator--(actor<BaseT> const& _0, int)
+{
+    return impl::make_unary<post_decr_op, BaseT>::construct(_0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  assignment lazy operator (infix =)
+//  The acual lazy operator is a member of the actor class.
+//
+///////////////////////////////////////////////////////////////////////////////
+struct assign_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<assign_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<assign_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+template <typename B>
+inline typename impl::make_binary1<assign_op, BaseT, B>::type
+actor<BaseT>::operator=(B const& _1) const
+{
+    return impl::make_binary1<assign_op, BaseT, B>::construct(*this, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  index lazy operator (array index [])
+//  The acual lazy operator is a member of the actor class.
+//
+///////////////////////////////////////////////////////////////////////////////
+struct index_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<index_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<index_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<index_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+template <typename B>
+inline typename impl::make_binary1<index_op, BaseT, B>::type
+actor<BaseT>::operator[](B const& _1) const
+{
+    return impl::make_binary1<index_op, BaseT, B>::construct(*this, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  plus assign lazy operator (infix +=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct plus_assign_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<plus_assign_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<plus_assign_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<plus_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<plus_assign_op, BaseT, T1>::type
+operator+=(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<plus_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  minus assign lazy operator (infix -=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct minus_assign_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<minus_assign_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<minus_assign_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<minus_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<minus_assign_op, BaseT, T1>::type
+operator-=(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<minus_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  times assign lazy operator (infix *=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct times_assign_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<times_assign_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<times_assign_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<times_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<times_assign_op, BaseT, T1>::type
+operator*=(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<times_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  divide assign lazy operator (infix /=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct divide_assign_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<divide_assign_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<divide_assign_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<divide_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<divide_assign_op, BaseT, T1>::type
+operator/=(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<divide_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  mod assign lazy operator (infix %=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct mod_assign_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<mod_assign_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<mod_assign_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<mod_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<mod_assign_op, BaseT, T1>::type
+operator%=(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<mod_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  and assign lazy operator (infix &=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct and_assign_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<and_assign_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<and_assign_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<and_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<and_assign_op, BaseT, T1>::type
+operator&=(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<and_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  or assign lazy operator (infix |=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct or_assign_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<or_assign_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<or_assign_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<or_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<or_assign_op, BaseT, T1>::type
+operator|=(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<or_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  xor assign lazy operator (infix ^=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct xor_assign_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<xor_assign_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<xor_assign_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<xor_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<xor_assign_op, BaseT, T1>::type
+operator^=(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<xor_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  shift left assign lazy operator (infix <<=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct shift_l_assign_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<shift_l_assign_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<shift_l_assign_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<shift_l_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<shift_l_assign_op, BaseT, T1>::type
+operator<<=(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<shift_l_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  shift right assign lazy operator (infix >>=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct shift_r_assign_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<shift_r_assign_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<shift_r_assign_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<shift_r_assign_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<shift_r_assign_op, BaseT, T1>::type
+operator>>=(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<shift_r_assign_op, BaseT, T1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  plus lazy operator (infix +)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct plus_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<plus_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<plus_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<plus_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<plus_op, BaseT, T1>::type
+operator+(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<plus_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<plus_op, T0, BaseT>::type
+operator+(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary2<plus_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<plus_op, BaseT0, BaseT1>::type
+operator+(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return impl::make_binary3<plus_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  minus lazy operator (infix -)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct minus_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<minus_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<minus_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<minus_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<minus_op, BaseT, T1>::type
+operator-(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<minus_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<minus_op, T0, BaseT>::type
+operator-(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary2<minus_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<minus_op, BaseT0, BaseT1>::type
+operator-(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return impl::make_binary3<minus_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  times lazy operator (infix *)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct times_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<times_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<times_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<times_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<times_op, BaseT, T1>::type
+operator*(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<times_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<times_op, T0, BaseT>::type
+operator*(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary2<times_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<times_op, BaseT0, BaseT1>::type
+operator*(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return impl::make_binary3<times_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  divide lazy operator (infix /)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct divide_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<divide_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<divide_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<divide_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<divide_op, BaseT, T1>::type
+operator/(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<divide_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<divide_op, T0, BaseT>::type
+operator/(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary2<divide_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<divide_op, BaseT0, BaseT1>::type
+operator/(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return impl::make_binary3<divide_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  mod lazy operator (infix %)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct mod_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<mod_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<mod_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<mod_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<mod_op, BaseT, T1>::type
+operator%(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<mod_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<mod_op, T0, BaseT>::type
+operator%(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary2<mod_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<mod_op, BaseT0, BaseT1>::type
+operator%(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return impl::make_binary3<mod_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  and lazy operator (infix &)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct and_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<and_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<and_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<and_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<and_op, BaseT, T1>::type
+operator&(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<and_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<and_op, T0, BaseT>::type
+operator&(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary2<and_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<and_op, BaseT0, BaseT1>::type
+operator&(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return impl::make_binary3<and_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  or lazy operator (infix |)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct or_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<or_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<or_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<or_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<or_op, BaseT, T1>::type
+operator|(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<or_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<or_op, T0, BaseT>::type
+operator|(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary2<or_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<or_op, BaseT0, BaseT1>::type
+operator|(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return impl::make_binary3<or_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  xor lazy operator (infix ^)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct xor_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<xor_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<xor_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<xor_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<xor_op, BaseT, T1>::type
+operator^(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<xor_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<xor_op, T0, BaseT>::type
+operator^(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary2<xor_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<xor_op, BaseT0, BaseT1>::type
+operator^(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return impl::make_binary3<xor_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  shift left lazy operator (infix <<)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct shift_l_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<shift_l_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<shift_l_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<shift_l_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<shift_l_op, BaseT, T1>::type
+operator<<(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<shift_l_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<shift_l_op, T0, BaseT>::type
+operator<<(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary2<shift_l_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<shift_l_op, BaseT0, BaseT1>::type
+operator<<(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return impl::make_binary3<shift_l_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  shift right lazy operator (infix >>)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct shift_r_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<shift_r_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<shift_r_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<shift_r_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<shift_r_op, BaseT, T1>::type
+operator>>(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<shift_r_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<shift_r_op, T0, BaseT>::type
+operator>>(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary2<shift_r_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<shift_r_op, BaseT0, BaseT1>::type
+operator>>(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return impl::make_binary3<shift_r_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  equal lazy operator (infix ==)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct eq_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<eq_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<eq_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<eq_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<eq_op, BaseT, T1>::type
+operator==(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<eq_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<eq_op, T0, BaseT>::type
+operator==(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary2<eq_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<eq_op, BaseT0, BaseT1>::type
+operator==(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return impl::make_binary3<eq_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  not equal lazy operator (infix !=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct not_eq_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<not_eq_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<not_eq_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<not_eq_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<not_eq_op, BaseT, T1>::type
+operator!=(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<not_eq_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<not_eq_op, T0, BaseT>::type
+operator!=(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary2<not_eq_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<not_eq_op, BaseT0, BaseT1>::type
+operator!=(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return impl::make_binary3<not_eq_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  less than lazy operator (infix <)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct lt_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<lt_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<lt_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<lt_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<lt_op, BaseT, T1>::type
+operator<(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<lt_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<lt_op, T0, BaseT>::type
+operator<(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary2<lt_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<lt_op, BaseT0, BaseT1>::type
+operator<(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return impl::make_binary3<lt_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  less than equal lazy operator (infix <=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct lt_eq_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<lt_eq_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<lt_eq_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<lt_eq_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<lt_eq_op, BaseT, T1>::type
+operator<=(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<lt_eq_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<lt_eq_op, T0, BaseT>::type
+operator<=(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary2<lt_eq_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<lt_eq_op, BaseT0, BaseT1>::type
+operator<=(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return impl::make_binary3<lt_eq_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  greater than lazy operator (infix >)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct gt_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<gt_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<gt_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<gt_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<gt_op, BaseT, T1>::type
+operator>(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<gt_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<gt_op, T0, BaseT>::type
+operator>(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary2<gt_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<gt_op, BaseT0, BaseT1>::type
+operator>(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return impl::make_binary3<gt_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  greater than equal lazy operator (infix >=)
+//
+///////////////////////////////////////////////////////////////////////////////
+struct gt_eq_op {
+
+    template <typename T0, typename T1>
+    struct result {
+
+        typedef typename binary_operator<gt_eq_op, T0, T1>
+            ::result_type type;
+    };
+
+    template <typename T0, typename T1>
+    typename binary_operator<gt_eq_op, T0, T1>::result_type
+    operator()(T0& _0, T1& _1) const
+    { return binary_operator<gt_eq_op, T0, T1>::eval(_0, _1); }
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline typename impl::make_binary1<gt_eq_op, BaseT, T1>::type
+operator>=(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return impl::make_binary1<gt_eq_op, BaseT, T1>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline typename impl::make_binary2<gt_eq_op, T0, BaseT>::type
+operator>=(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary2<gt_eq_op, T0, BaseT>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline typename impl::make_binary3<gt_eq_op, BaseT0, BaseT1>::type
+operator>=(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return impl::make_binary3<gt_eq_op, BaseT0, BaseT1>::construct(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  logical and lazy operator (infix &&)
+//
+//  The logical_and_composite class and its corresponding generators are
+//  provided to allow short-circuit evaluation of the operator's
+//  operands.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A0, typename A1>
+struct logical_and_composite {
+
+    typedef logical_and_composite<A0, A1> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename binary_operator<logical_and_op,
+            typename actor_result<A0, TupleT>::plain_type,
+            typename actor_result<A1, TupleT>::plain_type
+        >::result_type type;
+    };
+
+    logical_and_composite(A0 const& _0, A1 const& _1)
+    :   a0(_0), a1(_1) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        return a0.eval(args) && a1.eval(args);
+    }
+
+    A0 a0; A1 a1; //  actors
+};
+
+#if !(defined(__ICL) && __ICL <= 500)
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline actor<logical_and_composite
+<actor<BaseT>, typename as_actor<T1>::type> >
+operator&&(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return logical_and_composite
+        <actor<BaseT>, typename as_actor<T1>::type>
+        (_0, as_actor<T1>::convert(_1));
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline actor<logical_and_composite
+<typename as_actor<T0>::type, actor<BaseT> > >
+operator&&(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return logical_and_composite
+        <typename as_actor<T0>::type, actor<BaseT> >
+        (as_actor<T0>::convert(_0), _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline actor<logical_and_composite
+<actor<BaseT0>, actor<BaseT1> > >
+operator&&(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return logical_and_composite
+        <actor<BaseT0>, actor<BaseT1> >
+        (_0, _1);
+}
+#else
+//////////////////////////////////
+template <typename T0, typename T1>
+inline actor<logical_and_composite
+<typename as_actor<T0>::type, typename as_actor<T1>::type> >
+operator&&(T0 CREF _0, T1 CREF _1)
+{
+    return logical_and_composite
+        <typename as_actor<T0>::type, typename as_actor<T1>::type>
+        (as_actor<T0>::convert(_0), as_actor<T1>::convert(_1));
+}
+#endif // !(__ICL && __ICL <= 500)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  logical or lazy operator (infix ||)
+//
+//  The logical_or_composite class and its corresponding generators are
+//  provided to allow short-circuit evaluation of the operator's
+//  operands.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A0, typename A1>
+struct logical_or_composite {
+
+    typedef logical_or_composite<A0, A1> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef typename binary_operator<logical_or_op,
+            typename actor_result<A0, TupleT>::plain_type,
+            typename actor_result<A1, TupleT>::plain_type
+        >::result_type type;
+    };
+
+    logical_or_composite(A0 const& _0, A1 const& _1)
+    :   a0(_0), a1(_1) {}
+
+    template <typename TupleT>
+    typename actor_result<self_t, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        return a0.eval(args) || a1.eval(args);
+    }
+
+    A0 a0; A1 a1; //  actors
+};
+
+//////////////////////////////////
+template <typename BaseT, typename T1>
+inline actor<logical_or_composite
+<actor<BaseT>, typename as_actor<T1>::type> >
+operator||(actor<BaseT> const& _0, T1 CREF _1)
+{
+    return logical_or_composite
+        <actor<BaseT>, typename as_actor<T1>::type>
+        (_0, as_actor<T1>::convert(_1));
+}
+
+//////////////////////////////////
+template <typename T0, typename BaseT>
+inline actor<logical_or_composite
+<typename as_actor<T0>::type, actor<BaseT> > >
+operator||(T0 CREF _0, actor<BaseT> const& _1)
+{
+    return logical_or_composite
+        <typename as_actor<T0>::type, actor<BaseT> >
+        (as_actor<T0>::convert(_0), _1);
+}
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline actor<logical_or_composite
+<actor<BaseT0>, actor<BaseT1> > >
+operator||(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return logical_or_composite
+        <actor<BaseT0>, actor<BaseT1> >
+        (_0, _1);
+}
+
+}   //  namespace phoenix
+
+#undef CREF
+#endif
diff --git a/boost/boost/spirit/phoenix/primitives.hpp b/boost/boost/spirit/phoenix/primitives.hpp
new file mode 100644 (file)
index 0000000..16d5925
--- /dev/null
@@ -0,0 +1,248 @@
+/*=============================================================================
+    Phoenix V1.2.1
+    Copyright (c) 2001-2002 Joel de Guzman
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef PHOENIX_PRIMITIVES_HPP
+#define PHOENIX_PRIMITIVES_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/phoenix/actor.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  argument class
+//
+//      Lazy arguments
+//
+//      An actor base class that extracts and returns the Nth argument
+//      from the argument list passed in the 'args' tuple in the eval
+//      member function (see actor.hpp). There are some predefined
+//      argument constants that can be used as actors (arg1..argN).
+//
+//      The argument actor is a place-holder for the actual arguments
+//      passed by the client. For example, wherever arg1 is seen placed
+//      in a lazy function (see functions.hpp) or lazy operator (see
+//      operators.hpp), this will be replaced by the actual first
+//      argument in the actual function evaluation. Argument actors are
+//      essentially lazy arguments. A lazy argument is a full actor in
+//      its own right and can be evaluated through the actor's operator().
+//
+//      Example:
+//
+//          char        c = 'A';
+//          int         i = 123;
+//          const char* s = "Hello World";
+//
+//          cout << arg1(c) << ' ';
+//          cout << arg1(i, s) << ' ';
+//          cout << arg2(i, s) << ' ';
+//
+//       will print out "A 123 Hello World"
+//
+///////////////////////////////////////////////////////////////////////////////
+template <int N>
+struct argument {
+
+    template <typename TupleT>
+    struct result { typedef typename tuple_element<N, TupleT>::type type; };
+
+    template <typename TupleT>
+    typename tuple_element<N, TupleT>::type
+    eval(TupleT const& args) const
+    {
+        return args[tuple_index<N>()];
+    }
+};
+
+//////////////////////////////////
+actor<argument<0> > const arg1 = argument<0>();
+actor<argument<1> > const arg2 = argument<1>();
+actor<argument<2> > const arg3 = argument<2>();
+
+#if PHOENIX_LIMIT > 3
+actor<argument<3> > const arg4 = argument<3>();
+actor<argument<4> > const arg5 = argument<4>();
+actor<argument<5> > const arg6 = argument<5>();
+
+#if PHOENIX_LIMIT > 6
+actor<argument<6> > const arg7 = argument<6>();
+actor<argument<7> > const arg8 = argument<7>();
+actor<argument<8> > const arg9 = argument<8>();
+
+#if PHOENIX_LIMIT > 9
+actor<argument<9> > const arg10 = argument<9>();
+actor<argument<10> > const arg11 = argument<10>();
+actor<argument<11> > const arg12 = argument<11>();
+
+#if PHOENIX_LIMIT > 12
+actor<argument<12> > const arg13 = argument<12>();
+actor<argument<13> > const arg14 = argument<13>();
+actor<argument<14> > const arg15 = argument<14>();
+
+#endif
+#endif
+#endif
+#endif
+///////////////////////////////////////////////////////////////////////////////
+//
+//  value class
+//
+//      Lazy values
+//
+//      A bound actual parameter is kept in a value class for deferred
+//      access later when needed. A value object is immutable. Value
+//      objects are typically created through the val(x) free function
+//      which returns a value<T> with T deduced from the type of x. x is
+//      held in the value<T> object by value.
+//
+//      Lazy values are actors. As such, lazy values can be evaluated
+//      through the actor's operator(). Such invocation gives the value's
+//      identity. Example:
+//
+//          cout << val(3)() << val("Hello World")();
+//
+//      prints out "3 Hello World"
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+struct value {
+
+    typedef typename boost::remove_reference<T>::type plain_t;
+
+    template <typename TupleT>
+    struct result { typedef plain_t const type; };
+
+    value(plain_t val_)
+    :   val(val_) {}
+
+    template <typename TupleT>
+    plain_t const
+    eval(TupleT const& /*args*/) const
+    {
+        return val;
+    }
+
+    plain_t val;
+};
+
+//////////////////////////////////
+template <typename T>
+inline actor<value<T> > const
+val(T v)
+{
+    return value<T>(v);
+}
+
+//////////////////////////////////
+template <typename BaseT>
+void
+val(actor<BaseT> const& v);     //  This is undefined and not allowed.
+
+///////////////////////////////////////////////////////////////////////////
+//
+//  Arbitrary types T are typically converted to a actor<value<T> >
+//  (see as_actor<T> in actor.hpp). A specialization is also provided
+//  for arrays. T[N] arrays are converted to actor<value<T const*> >.
+//
+///////////////////////////////////////////////////////////////////////////
+template <typename T>
+struct as_actor {
+
+    typedef actor<value<T> > type;
+    static type convert(T const& x)
+    { return value<T>(x); }
+};
+
+//////////////////////////////////
+template <typename T, int N>
+struct as_actor<T[N]> {
+
+    typedef actor<value<T const*> > type;
+    static type convert(T const x[N])
+    { return value<T const*>(x); }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  variable class
+//
+//      Lazy variables
+//
+//      A bound actual parameter may also be held by non-const reference
+//      in a variable class for deferred access later when needed. A
+//      variable object is mutable, i.e. its referenced variable can be
+//      modified. Variable objects are typically created through the
+//      var(x) free function which returns a variable<T> with T deduced
+//      from the type of x. x is held in the value<T> object by
+//      reference.
+//
+//      Lazy variables are actors. As such, lazy variables can be
+//      evaluated through the actor's operator(). Such invocation gives
+//      the variables's identity. Example:
+//
+//          int i = 3;
+//          char const* s = "Hello World";
+//          cout << var(i)() << var(s)();
+//
+//      prints out "3 Hello World"
+//
+//      Another free function const_(x) may also be used. const_(x) creates
+//      a variable<T const&> object using a constant reference.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+struct variable {
+
+    template <typename TupleT>
+    struct result { typedef T& type; };
+
+    variable(T& var_)
+    :   var(var_) {}
+
+    template <typename TupleT>
+    T&
+    eval(TupleT const& /*args*/) const
+    {
+        return var;
+    }
+
+    T& var;
+};
+
+//////////////////////////////////
+template <typename T>
+inline actor<variable<T> > const
+var(T& v)
+{
+    return variable<T>(v);
+}
+
+//////////////////////////////////
+template <typename T>
+inline actor<variable<T const> > const
+const_(T const& v)
+{
+    return variable<T const>(v);
+}
+
+//////////////////////////////////
+template <typename BaseT>
+void
+var(actor<BaseT> const& v);     //  This is undefined and not allowed.
+
+//////////////////////////////////
+template <typename BaseT>
+void
+const_(actor<BaseT> const& v);  //  This is undefined and not allowed.
+
+///////////////////////////////////////////////////////////////////////////////
+}   //  namespace phoenix
+
+#endif
diff --git a/boost/boost/spirit/phoenix/special_ops.hpp b/boost/boost/spirit/phoenix/special_ops.hpp
new file mode 100644 (file)
index 0000000..47cd947
--- /dev/null
@@ -0,0 +1,342 @@
+/*=============================================================================
+    Phoenix V1.2.1
+    Copyright (c) 2001-2002 Joel de Guzman
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef PHOENIX_SPECIAL_OPS_HPP
+#define PHOENIX_SPECIAL_OPS_HPP
+
+#include <boost/config.hpp>
+#ifdef BOOST_NO_STRINGSTREAM
+#include <strstream>
+#define PHOENIX_SSTREAM strstream
+#else
+#include <sstream>
+#define PHOENIX_SSTREAM stringstream
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/phoenix/operators.hpp>
+#include <iosfwd>
+
+///////////////////////////////////////////////////////////////////////////////
+#if defined(_STLPORT_VERSION) && defined(__STL_USE_OWN_NAMESPACE)
+#define PHOENIX_STD _STLP_STD
+#define PHOENIX_NO_STD_NAMESPACE
+#else
+#define PHOENIX_STD std
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//#if !defined(PHOENIX_NO_STD_NAMESPACE)
+namespace PHOENIX_STD
+{
+//#endif
+
+    template<typename T> class complex;
+
+//#if !defined(PHOENIX_NO_STD_NAMESPACE)
+}
+//#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix
+{
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  The following specializations take into account the C++ standard
+//  library components. There are a couple of issues that have to be
+//  dealt with to enable lazy operator overloads for the standard
+//  library classes.
+//
+//      *iostream (e.g. cout, cin, strstream/ stringstream) uses non-
+//      canonical shift operator overloads where the lhs is taken in
+//      by reference.
+//
+//      *I/O manipulators overloads for the RHS of the << and >>
+//      operators.
+//
+//      *STL iterators can be objects that conform to pointer semantics.
+//      Some operators need to be specialized for these.
+//
+//      *std::complex is given a rank (see rank class in operators.hpp)
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  specialization for rank<std::complex>
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T> struct rank<PHOENIX_STD::complex<T> >
+{ static int const value = 170 + rank<T>::value; };
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  specializations for std::istream
+//
+///////////////////////////////////////////////////////////////////////////////
+#if defined(__GNUC__) && (__GNUC__ < 3)
+    #if defined(_STLPORT_VERSION)
+        #define PHOENIX_ISTREAM _IO_istream_withassign
+    #else
+        #define PHOENIX_ISTREAM PHOENIX_STD::_IO_istream_withassign
+    #endif
+#else
+//    #if (defined(__ICL) && defined(_STLPORT_VERSION))
+//        #define PHOENIX_ISTREAM istream_withassign
+//    #else
+        #define PHOENIX_ISTREAM PHOENIX_STD::istream
+//    #endif
+#endif
+
+//////////////////////////////////
+#if defined(__GNUC__) && (__GNUC__ < 3)
+//    || (defined(__ICL) && defined(_STLPORT_VERSION))
+template <typename T1>
+struct binary_operator<shift_r_op, PHOENIX_ISTREAM, T1>
+{
+    typedef PHOENIX_STD::istream& result_type;
+    static result_type eval(PHOENIX_STD::istream& out, T1& rhs)
+    { return out >> rhs; }
+};
+#endif
+
+//////////////////////////////////
+template <typename T1>
+struct binary_operator<shift_r_op, PHOENIX_STD::istream, T1>
+{
+    typedef PHOENIX_STD::istream& result_type;
+    static result_type eval(PHOENIX_STD::istream& out, T1& rhs)
+    { return out >> rhs; }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_binary3
+    <shift_r_op, variable<PHOENIX_ISTREAM>, BaseT>::type
+operator>>(PHOENIX_ISTREAM& _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary3
+    <shift_r_op, variable<PHOENIX_ISTREAM>, BaseT>
+    ::construct(var(_0), _1);
+}
+
+#undef PHOENIX_ISTREAM
+///////////////////////////////////////////////////////////////////////////////
+//
+//  specializations for std::ostream
+//
+///////////////////////////////////////////////////////////////////////////////
+#if defined(__GNUC__) && (__GNUC__ < 3)
+    #if defined(_STLPORT_VERSION)
+        #define PHOENIX_OSTREAM _IO_ostream_withassign
+    #else
+        #define PHOENIX_OSTREAM PHOENIX_STD::_IO_ostream_withassign
+    #endif
+#else
+//    #if (defined(__ICL) && defined(_STLPORT_VERSION))
+//        #define PHOENIX_OSTREAM ostream_withassign
+//    #else
+        #define PHOENIX_OSTREAM PHOENIX_STD::ostream
+//    #endif
+#endif
+
+//////////////////////////////////
+#if defined(__GNUC__) && (__GNUC__ < 3)
+//    || (defined(__ICL) && defined(_STLPORT_VERSION))
+template <typename T1>
+struct binary_operator<shift_l_op, PHOENIX_OSTREAM, T1>
+{
+    typedef PHOENIX_STD::ostream& result_type;
+    static result_type eval(PHOENIX_STD::ostream& out, T1 const& rhs)
+    { return out << rhs; }
+};
+#endif
+
+//////////////////////////////////
+template <typename T1>
+struct binary_operator<shift_l_op, PHOENIX_STD::ostream, T1>
+{
+    typedef PHOENIX_STD::ostream& result_type;
+    static result_type eval(PHOENIX_STD::ostream& out, T1 const& rhs)
+    { return out << rhs; }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_binary3
+    <shift_l_op, variable<PHOENIX_OSTREAM>, BaseT>::type
+operator<<(PHOENIX_OSTREAM& _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary3
+    <shift_l_op, variable<PHOENIX_OSTREAM>, BaseT>
+    ::construct(var(_0), _1);
+}
+
+#undef PHOENIX_OSTREAM
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  specializations for std::strstream / stringstream
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T1>
+struct binary_operator<shift_r_op, PHOENIX_STD::PHOENIX_SSTREAM, T1>
+{
+    typedef PHOENIX_STD::istream& result_type;
+    static result_type eval(PHOENIX_STD::istream& out, T1& rhs)
+    { return out >> rhs; }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_binary3
+    <shift_r_op, variable<PHOENIX_STD::PHOENIX_SSTREAM>, BaseT>::type
+operator>>(PHOENIX_STD::PHOENIX_SSTREAM& _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary3
+    <shift_r_op, variable<PHOENIX_STD::PHOENIX_SSTREAM>, BaseT>
+    ::construct(var(_0), _1);
+}
+
+//////////////////////////////////
+template <typename T1>
+struct binary_operator<shift_l_op, PHOENIX_STD::PHOENIX_SSTREAM, T1>
+{
+    typedef PHOENIX_STD::ostream& result_type;
+    static result_type eval(PHOENIX_STD::ostream& out, T1 const& rhs)
+    { return out << rhs; }
+};
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_binary3
+    <shift_l_op, variable<PHOENIX_STD::PHOENIX_SSTREAM>, BaseT>::type
+operator<<(PHOENIX_STD::PHOENIX_SSTREAM& _0, actor<BaseT> const& _1)
+{
+    return impl::make_binary3
+    <shift_l_op, variable<PHOENIX_STD::PHOENIX_SSTREAM>, BaseT>
+    ::construct(var(_0), _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//      I/O manipulator specializations
+//
+///////////////////////////////////////////////////////////////////////////////
+#if (!defined(__GNUC__) || (__GNUC__ > 2))
+//    && !(defined(__ICL) && defined(_STLPORT_VERSION))
+
+typedef PHOENIX_STD::ios_base&  (*iomanip_t)(PHOENIX_STD::ios_base&);
+typedef PHOENIX_STD::istream&   (*imanip_t)(PHOENIX_STD::istream&);
+typedef PHOENIX_STD::ostream&   (*omanip_t)(PHOENIX_STD::ostream&);
+
+#if defined(__BORLANDC__)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//      Borland does not like i/o manipulators functions such as endl to
+//      be the rhs of a lazy << operator (Borland incorrectly reports
+//      ambiguity). To get around the problem, we provide function
+//      pointer versions of the same name with a single trailing
+//      underscore.
+//
+//      You can use the same trick for other i/o manipulators.
+//      Alternatively, you can prefix the manipulator with a '&'
+//      operator. Example:
+//
+//          cout << arg1 << &endl
+//
+///////////////////////////////////////////////////////////////////////////////
+
+imanip_t    ws_     = &PHOENIX_STD::ws;
+iomanip_t   dec_    = &PHOENIX_STD::dec;
+iomanip_t   hex_    = &PHOENIX_STD::hex;
+iomanip_t   oct_    = &PHOENIX_STD::oct;
+omanip_t    endl_   = &PHOENIX_STD::endl;
+omanip_t    ends_   = &PHOENIX_STD::ends;
+omanip_t    flush_  = &PHOENIX_STD::flush;
+
+#else // __BORLANDC__
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//      The following are overloads for I/O manipulators.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_binary1<shift_l_op, BaseT, imanip_t>::type
+operator>>(actor<BaseT> const& _0, imanip_t _1)
+{
+    return impl::make_binary1<shift_l_op, BaseT, imanip_t>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_binary1<shift_l_op, BaseT, iomanip_t>::type
+operator>>(actor<BaseT> const& _0, iomanip_t _1)
+{
+    return impl::make_binary1<shift_l_op, BaseT, iomanip_t>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_binary1<shift_l_op, BaseT, omanip_t>::type
+operator<<(actor<BaseT> const& _0, omanip_t _1)
+{
+    return impl::make_binary1<shift_l_op, BaseT, omanip_t>::construct(_0, _1);
+}
+
+//////////////////////////////////
+template <typename BaseT>
+inline typename impl::make_binary1<shift_l_op, BaseT, iomanip_t>::type
+operator<<(actor<BaseT> const& _0, iomanip_t _1)
+{
+    return impl::make_binary1<shift_l_op, BaseT, iomanip_t>::construct(_0, _1);
+}
+
+#endif // __BORLANDC__
+#endif // !defined(__GNUC__) || (__GNUC__ > 2)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  specializations for stl iterators and containers
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+struct unary_operator<dereference_op, T>
+{
+    typedef typename T::reference result_type;
+    static result_type eval(T const& iter)
+    { return *iter; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<index_op, T0, T1>
+{
+    typedef typename T0::reference result_type;
+    static result_type eval(T0& container, T1 const& index)
+    { return container[index]; }
+};
+
+//////////////////////////////////
+template <typename T0, typename T1>
+struct binary_operator<index_op, T0 const, T1>
+{
+    typedef typename T0::const_reference result_type;
+    static result_type eval(T0 const& container, T1 const& index)
+    { return container[index]; }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+}   //  namespace phoenix
+
+#undef PHOENIX_SSTREAM
+#undef PHOENIX_STD
+#endif
diff --git a/boost/boost/spirit/phoenix/statements.hpp b/boost/boost/spirit/phoenix/statements.hpp
new file mode 100644 (file)
index 0000000..d20d199
--- /dev/null
@@ -0,0 +1,444 @@
+/*=============================================================================
+    Phoenix V1.2.1
+    Copyright (c) 2001-2002 Joel de Guzman
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef PHOENIX_STATEMENTS_HPP
+#define PHOENIX_STATEMENTS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/phoenix/composite.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  sequential_composite
+//
+//      Two or more actors separated by the comma generates a
+//      sequential_composite which is a composite actor. Example:
+//
+//          actor,
+//          actor,
+//          actor
+//
+//      The actors are evaluated sequentially. The result type of this
+//      is void. Note that the last actor should not have a trailing
+//      comma.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A0, typename A1>
+struct sequential_composite {
+
+    typedef sequential_composite<A0, A1> self_t;
+
+    template <typename TupleT>
+    struct result { typedef void type; };
+
+    sequential_composite(A0 const& _0, A1 const& _1)
+    :   a0(_0), a1(_1) {}
+
+    template <typename TupleT>
+    void
+    eval(TupleT const& args) const
+    {
+        a0.eval(args);
+        a1.eval(args);
+    }
+
+    A0 a0; A1 a1; //  actors
+};
+
+//////////////////////////////////
+template <typename BaseT0, typename BaseT1>
+inline actor<sequential_composite<actor<BaseT0>, actor<BaseT1> > >
+operator,(actor<BaseT0> const& _0, actor<BaseT1> const& _1)
+{
+    return sequential_composite<actor<BaseT0>, actor<BaseT1> >(_0, _1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  if_then_else_composite
+//
+//      This composite has two (2) forms:
+//
+//          if_(condition)
+//          [
+//              statement
+//          ]
+//
+//      and
+//
+//          if_(condition)
+//          [
+//              true_statement
+//          ]
+//          .else_
+//          [
+//              false_statement
+//          ]
+//
+//      where condition is an actor that evaluates to bool. If condition
+//      is true, the true_statement (again an actor) is executed
+//      otherwise, the false_statement (another actor) is executed. The
+//      result type of this is void. Note the trailing underscore after
+//      if_ and the the leading dot and the trailing underscore before
+//      and after .else_.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CondT, typename ThenT, typename ElseT>
+struct if_then_else_composite {
+
+    typedef if_then_else_composite<CondT, ThenT, ElseT> self_t;
+
+    template <typename TupleT>
+    struct result {
+
+        typedef void type;
+    };
+
+    if_then_else_composite(
+        CondT const& cond_,
+        ThenT const& then_,
+        ElseT const& else__)
+    :   cond(cond_), then(then_), else_(else__) {}
+
+    template <typename TupleT>
+    void eval(TupleT const& args) const
+    {
+        if (cond.eval(args))
+            then.eval(args);
+        else
+            else_.eval(args);
+    }
+
+    CondT cond; ThenT then; ElseT else_; //  actors
+};
+
+//////////////////////////////////
+template <typename CondT, typename ThenT>
+struct else_gen {
+
+    else_gen(CondT const& cond_, ThenT const& then_)
+    :   cond(cond_), then(then_) {}
+
+    template <typename ElseT>
+    actor<if_then_else_composite<CondT, ThenT,
+        typename as_actor<ElseT>::type> >
+    operator[](ElseT const& else_)
+    {
+        typedef if_then_else_composite<CondT, ThenT,
+            typename as_actor<ElseT>::type>
+        result;
+
+        return result(cond, then, as_actor<ElseT>::convert(else_));
+    }
+
+    CondT cond; ThenT then;
+};
+
+//////////////////////////////////
+template <typename CondT, typename ThenT>
+struct if_then_composite {
+
+    typedef if_then_composite<CondT, ThenT> self_t;
+
+    template <typename TupleT>
+    struct result { typedef void type; };
+
+    if_then_composite(CondT const& cond_, ThenT const& then_)
+    :   cond(cond_), then(then_), else_(cond, then) {}
+
+    template <typename TupleT>
+    void eval(TupleT const& args) const
+    {
+        if (cond.eval(args))
+            then.eval(args);
+    }
+
+    CondT cond; ThenT then; //  actors
+    else_gen<CondT, ThenT> else_;
+};
+
+//////////////////////////////////
+template <typename CondT>
+struct if_gen {
+
+    if_gen(CondT const& cond_)
+    :   cond(cond_) {}
+
+    template <typename ThenT>
+    actor<if_then_composite<
+        typename as_actor<CondT>::type,
+        typename as_actor<ThenT>::type> >
+    operator[](ThenT const& then) const
+    {
+        typedef if_then_composite<
+            typename as_actor<CondT>::type,
+            typename as_actor<ThenT>::type>
+        result;
+
+        return result(
+            as_actor<CondT>::convert(cond),
+            as_actor<ThenT>::convert(then));
+    }
+
+    CondT cond;
+};
+
+//////////////////////////////////
+template <typename CondT>
+inline if_gen<CondT>
+if_(CondT const& cond)
+{
+    return if_gen<CondT>(cond);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  while_composite
+//
+//      This composite has the form:
+//
+//          while_(condition)
+//          [
+//              statement
+//          ]
+//
+//      While the condition (an actor) evaluates to true, statement
+//      (another actor) is executed. The result type of this is void.
+//      Note the trailing underscore after while_.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CondT, typename DoT>
+struct while_composite {
+
+    typedef while_composite<CondT, DoT> self_t;
+
+    template <typename TupleT>
+    struct result { typedef void type; };
+
+    while_composite(CondT const& cond_, DoT const& do__)
+    :   cond(cond_), do_(do__) {}
+
+    template <typename TupleT>
+    void eval(TupleT const& args) const
+    {
+        while (cond.eval(args))
+            do_.eval(args);
+    }
+
+    CondT cond;
+    DoT do_;
+};
+
+//////////////////////////////////
+template <typename CondT>
+struct while_gen {
+
+    while_gen(CondT const& cond_)
+    :   cond(cond_) {}
+
+    template <typename DoT>
+    actor<while_composite<
+        typename as_actor<CondT>::type,
+        typename as_actor<DoT>::type> >
+    operator[](DoT const& do_) const
+    {
+        typedef while_composite<
+            typename as_actor<CondT>::type,
+            typename as_actor<DoT>::type>
+        result;
+
+        return result(
+            as_actor<CondT>::convert(cond),
+            as_actor<DoT>::convert(do_));
+    }
+
+    CondT cond;
+};
+
+//////////////////////////////////
+template <typename CondT>
+inline while_gen<CondT>
+while_(CondT const& cond)
+{
+    return while_gen<CondT>(cond);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  do_composite
+//
+//      This composite has the form:
+//
+//          do_
+//          [
+//              statement
+//          ]
+//          .while_(condition)
+//
+//      While the condition (an actor) evaluates to true, statement
+//      (another actor) is executed. The statement is executed at least
+//      once. The result type of this is void. Note the trailing
+//      underscore after do_ and the the leading dot and the trailing
+//      underscore before and after .while_.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename DoT, typename CondT>
+struct do_composite {
+
+    typedef do_composite<DoT, CondT> self_t;
+
+    template <typename TupleT>
+    struct result { typedef void type; };
+
+    do_composite(DoT const& do__, CondT const& cond_)
+    :   do_(do__), cond(cond_) {}
+
+    template <typename TupleT>
+    void eval(TupleT const& args) const
+    {
+        do
+            do_.eval(args);
+        while (cond.eval(args));
+    }
+
+    DoT do_;
+    CondT cond;
+};
+
+////////////////////////////////////
+template <typename DoT>
+struct do_gen2 {
+
+    do_gen2(DoT const& do__)
+    :   do_(do__) {}
+
+    template <typename CondT>
+    actor<do_composite<
+        typename as_actor<DoT>::type,
+        typename as_actor<CondT>::type> >
+    while_(CondT const& cond) const
+    {
+        typedef do_composite<
+            typename as_actor<DoT>::type,
+            typename as_actor<CondT>::type>
+        result;
+
+        return result(
+            as_actor<DoT>::convert(do_),
+            as_actor<CondT>::convert(cond));
+    }
+
+    DoT do_;
+};
+
+////////////////////////////////////
+struct do_gen {
+
+    template <typename DoT>
+    do_gen2<DoT>
+    operator[](DoT const& do_) const
+    {
+        return do_gen2<DoT>(do_);
+    }
+};
+
+do_gen const do_ = do_gen();
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  for_composite
+//
+//      This statement has the form:
+//
+//          for_(init, condition, step)
+//          [
+//              statement
+//          ]
+//
+//      Where init, condition, step and statement are all actors. init
+//      is executed once before entering the for-loop. The for-loop
+//      exits once condition evaluates to false. At each loop iteration,
+//      step and statement is called. The result of this statement is
+//      void. Note the trailing underscore after for_.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename InitT, typename CondT, typename StepT, typename DoT>
+struct for_composite {
+
+    typedef composite<InitT, CondT, StepT, DoT> self_t;
+
+    template <typename TupleT>
+    struct result { typedef void type; };
+
+    for_composite(
+        InitT const& init_,
+        CondT const& cond_,
+        StepT const& step_,
+        DoT const& do__)
+    :   init(init_), cond(cond_), step(step_), do_(do__) {}
+
+    template <typename TupleT>
+    void
+    eval(TupleT const& args) const
+    {
+        for (init.eval(args); cond.eval(args); step.eval(args))
+            do_.eval(args);
+    }
+
+    InitT init; CondT cond; StepT step; DoT do_; //  actors
+};
+
+//////////////////////////////////
+template <typename InitT, typename CondT, typename StepT>
+struct for_gen {
+
+    for_gen(
+        InitT const& init_,
+        CondT const& cond_,
+        StepT const& step_)
+    :   init(init_), cond(cond_), step(step_) {}
+
+    template <typename DoT>
+    actor<for_composite<
+        typename as_actor<InitT>::type,
+        typename as_actor<CondT>::type,
+        typename as_actor<StepT>::type,
+        typename as_actor<DoT>::type> >
+    operator[](DoT const& do_) const
+    {
+        typedef for_composite<
+            typename as_actor<InitT>::type,
+            typename as_actor<CondT>::type,
+            typename as_actor<StepT>::type,
+            typename as_actor<DoT>::type>
+        result;
+
+        return result(
+            as_actor<InitT>::convert(init),
+            as_actor<CondT>::convert(cond),
+            as_actor<StepT>::convert(step),
+            as_actor<DoT>::convert(do_));
+    }
+
+    InitT init; CondT cond; StepT step;
+};
+
+//////////////////////////////////
+template <typename InitT, typename CondT, typename StepT>
+inline for_gen<InitT, CondT, StepT>
+for_(InitT const& init, CondT const& cond, StepT const& step)
+{
+    return for_gen<InitT, CondT, StepT>(init, cond, step);
+}
+
+}   //  namespace phoenix
+
+#endif
diff --git a/boost/boost/spirit/phoenix/tuple_helpers.hpp b/boost/boost/spirit/phoenix/tuple_helpers.hpp
new file mode 100644 (file)
index 0000000..f8875e0
--- /dev/null
@@ -0,0 +1,1076 @@
+/*=============================================================================
+    Phoenix V1.2.1
+    Copyright (c) 2002 Joel de Guzman
+    Copyright (c) 2002-2003 Hartmut Kaiser
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef PHOENIX_TUPLEHELPERS_HPP
+#define PHOENIX_TUPLEHELPERS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <cassert>
+#include <boost/spirit/phoenix/tuples.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix
+{
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  make_tuple template class
+//
+//      This template class is used to calculate a tuple type required to hold
+//      the given template parameter type
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+//  normal (non-tuple types are wrapped into a tuple)
+template <typename ResultT>
+struct make_tuple {
+
+    typedef tuple<ResultT> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//  nil_t is converted to an empty tuple type
+template <>
+struct make_tuple<nil_t> {
+
+    typedef tuple<> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//  tuple types are left alone without any refactoring
+template <
+      typename A, typename B, typename C
+#if PHOENIX_LIMIT > 3
+    , typename D, typename E, typename F
+#if PHOENIX_LIMIT > 6
+    , typename G, typename H, typename I
+#if PHOENIX_LIMIT > 9
+    , typename J, typename K, typename L
+#if PHOENIX_LIMIT > 12
+    , typename M, typename N, typename O
+#endif
+#endif
+#endif
+#endif
+>
+struct make_tuple<tuple<A, B, C
+#if PHOENIX_LIMIT > 3
+    , D, E, F
+#if PHOENIX_LIMIT > 6
+    , G, H, I
+#if PHOENIX_LIMIT > 9
+    , J, K, L
+#if PHOENIX_LIMIT > 12
+    , M, N, O
+#endif
+#endif
+#endif
+#endif
+    > > {
+
+// the tuple parameter itself is the required tuple type
+    typedef tuple<A, B, C
+#if PHOENIX_LIMIT > 3
+        , D, E, F
+#if PHOENIX_LIMIT > 6
+        , G, H, I
+#if PHOENIX_LIMIT > 9
+        , J, K, L
+#if PHOENIX_LIMIT > 12
+        , M, N, O
+#endif
+#endif
+#endif
+#endif
+        > type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat_tuple type computer
+//
+//      This class returns the type of a tuple, which is constructed by
+//      concatenating a tuple with a given type
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename TupleT, typename AppendT>
+struct concat_tuple;
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat tuple <0 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename AppendT>
+struct concat_tuple<tuple<>, AppendT> {
+
+    typedef tuple<AppendT> type;
+};
+
+template <>
+struct concat_tuple<tuple<>, nil_t> {
+
+    typedef tuple<> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat tuple <1 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A, typename AppendT>
+struct concat_tuple<tuple<A>, AppendT> {
+
+    typedef tuple<A, AppendT> type;
+};
+
+template <typename A>
+struct concat_tuple<tuple<A>, nil_t> {
+
+    typedef tuple<A> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat tuple <2 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A, typename B, typename AppendT>
+struct concat_tuple<tuple<A, B>, AppendT> {
+
+    typedef tuple<A, B, AppendT> type;
+};
+
+template <typename A, typename B>
+struct concat_tuple<tuple<A, B>, nil_t> {
+
+    typedef tuple<A, B> type;
+};
+
+#if PHOENIX_LIMIT > 3
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat tuple <3 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C,
+    typename AppendT
+>
+struct concat_tuple<tuple<A, B, C>, AppendT> {
+
+    typedef tuple<A, B, C, AppendT> type;
+};
+
+template <
+    typename A, typename B, typename C
+>
+struct concat_tuple<tuple<A, B, C>, nil_t> {
+
+    typedef tuple<A, B, C> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat tuple <4 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D,
+    typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D>, AppendT> {
+
+    typedef tuple<A, B, C, D, AppendT> type;
+};
+
+template <
+    typename A, typename B, typename C, typename D
+>
+struct concat_tuple<tuple<A, B, C, D>, nil_t> {
+
+    typedef tuple<A, B, C, D> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat tuple <5 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E>, AppendT> {
+
+    typedef tuple<A, B, C, D, E, AppendT> type;
+};
+
+template <
+    typename A, typename B, typename C, typename D, typename E
+>
+struct concat_tuple<tuple<A, B, C, D, E>, nil_t> {
+
+    typedef tuple<A, B, C, D, E> type;
+};
+
+#if PHOENIX_LIMIT > 6
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat tuple <6 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F>, AppendT> {
+
+    typedef tuple<A, B, C, D, E, F, AppendT> type;
+};
+
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F
+>
+struct concat_tuple<tuple<A, B, C, D, E, F>, nil_t> {
+
+    typedef tuple<A, B, C, D, E, F> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat tuple <7 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename G,
+    typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G>, AppendT> {
+
+    typedef tuple<A, B, C, D, E, F, G, AppendT> type;
+};
+
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename G
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G>, nil_t> {
+
+    typedef tuple<A, B, C, D, E, F, G> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat tuple <8 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename G, typename H,
+    typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H>, AppendT> {
+
+    typedef tuple<A, B, C, D, E, F, G, H, AppendT> type;
+};
+
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename G, typename H
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H>, nil_t> {
+
+    typedef tuple<A, B, C, D, E, F, G, H> type;
+};
+
+#if PHOENIX_LIMIT > 9
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat tuple <9 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename G, typename H, typename I,
+    typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I>, AppendT> {
+
+    typedef tuple<A, B, C, D, E, F, G, H, I, AppendT> type;
+};
+
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename G, typename H, typename I
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I>, nil_t> {
+
+    typedef tuple<A, B, C, D, E, F, G, H, I> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat tuple <10 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename G, typename H, typename I, typename J,
+    typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J>, AppendT> {
+
+    typedef tuple<A, B, C, D, E, F, G, H, I, J, AppendT> type;
+};
+
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename G, typename H, typename I, typename J
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J>, nil_t> {
+
+    typedef tuple<A, B, C, D, E, F, G, H, I, J> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat tuple <11 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename G, typename H, typename I, typename J, typename K,
+    typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K>, AppendT> {
+
+    typedef tuple<A, B, C, D, E, F, G, H, I, J, K, AppendT> type;
+};
+
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename G, typename H, typename I, typename J, typename K
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K>, nil_t> {
+
+    typedef tuple<A, B, C, D, E, F, G, H, I, J, K> type;
+};
+
+#if PHOENIX_LIMIT > 12
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat tuple <12 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename G, typename H, typename I, typename J, typename K, typename L,
+    typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L>, AppendT> {
+
+    typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, AppendT> type;
+};
+
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename G, typename H, typename I, typename J, typename K, typename L
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L>, nil_t> {
+
+    typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat tuple <13 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename G, typename H, typename I, typename J, typename K, typename L,
+    typename M,
+    typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L, M>, AppendT> {
+
+    typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, AppendT> type;
+};
+
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename G, typename H, typename I, typename J, typename K, typename L,
+    typename M
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L, M>, nil_t> {
+
+    typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, M> type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat tuple <14 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename G, typename H, typename I, typename J, typename K, typename L,
+    typename M, typename N,
+    typename AppendT
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N>, AppendT> {
+
+    typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, AppendT> type;
+};
+
+template <
+    typename A, typename B, typename C, typename D, typename E, typename F,
+    typename G, typename H, typename I, typename J, typename K, typename L,
+    typename M, typename N
+>
+struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N>, nil_t> {
+
+    typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N> type;
+};
+
+#endif
+#endif
+#endif
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  concat_tuples type computer
+//
+//      This template class returns the type of a tuple built from the
+//      concatenation of two given tuples.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename TupleT1, typename TupleT2, int N, typename AppendT>
+struct concat_tuple_element {
+
+    typedef
+        typename concat_tuple_element<
+                typename concat_tuple<TupleT1, AppendT>::type, TupleT2, N+1,
+                typename tuple_element<N+1, TupleT2>::type
+            >::type
+        type;
+};
+
+template <typename TupleT1, typename TupleT2, int N>
+struct concat_tuple_element<TupleT1, TupleT2, N, nil_t> {
+
+    typedef TupleT1 type;
+};
+
+template <typename TupleT1, typename TupleT2>
+struct concat_tuples {
+
+    typedef
+        typename concat_tuple_element<
+                TupleT1, TupleT2, 0,
+                typename tuple_element<0, TupleT2>::type
+            >::type
+        type;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  convert_actors template function
+//
+//      The convert_actors template functions constructs a new tuple object
+//      composed of the elements returned by the actors contained in the
+//      input tuple. (i.e. the given tuple type 'actor_tuple' contains a set
+//      of actors to evaluate and the resulting tuple contains the results of
+//      evaluating the actors.)
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename ActorT, typename TupleT>
+struct actor_result; // forward declaration
+
+namespace impl
+{
+    template <unsigned N>
+    struct convert_actors_ {};
+}
+
+template <typename TupleResultT, typename ActorTupleT>
+TupleResultT
+convert_actors(ActorTupleT const& actor_tuple)
+{
+    BOOST_STATIC_ASSERT(ActorTupleT::length <= TupleResultT::length);
+    BOOST_STATIC_CONSTANT(int, length = TupleResultT::length);
+    return impl::convert_actors_<length>
+        ::template apply<TupleResultT, ActorTupleT>::do_(actor_tuple);
+}
+
+namespace impl
+{
+    template <int N, typename TupleResultT, typename ActorTupleT>
+    struct convert_actor
+    {
+        typedef typename tuple_element<N, TupleResultT>::type type;
+
+        template <bool C>
+        struct is_default_t {};
+        typedef is_default_t<true>  is_default;
+        typedef is_default_t<false> is_not_default;
+
+        static type
+        actor_element(ActorTupleT const& /*actor_tuple*/, is_default)
+        {
+            return type(); // default construct
+        }
+
+        static type
+        actor_element(ActorTupleT const& actor_tuple, is_not_default)
+        {
+            BOOST_STATIC_ASSERT(ActorTupleT::length <= TupleResultT::length);
+            return actor_tuple[tuple_index<N>()](); // apply the actor
+        }
+
+        static type
+        do_(ActorTupleT const& actor_tuple)
+        {
+            return actor_element(
+                actor_tuple, is_default_t<(N >= ActorTupleT::length)>());
+        }
+    };
+
+    ///////////////////////////////////////
+    template <>
+    struct convert_actors_<1>
+    {
+        template <typename TupleResultT, typename ActorTupleT>
+        struct apply
+        {
+            static TupleResultT
+            do_(ActorTupleT const& actor_tuple)
+            {
+                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+
+                return TupleResultT(
+                    converter0::do_(actor_tuple)
+                );
+            }
+        };
+    };
+
+    ///////////////////////////////////////
+    template <>
+    struct convert_actors_<2>
+    {
+        template <typename TupleResultT, typename ActorTupleT>
+        struct apply
+        {
+            static TupleResultT
+            do_(ActorTupleT const& actor_tuple)
+            {
+                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+
+                using namespace tuple_index_names;
+                return TupleResultT(
+                        converter0::do_(actor_tuple)
+                    ,   converter1::do_(actor_tuple)
+                );
+            }
+        };
+    };
+
+    ///////////////////////////////////////
+    template <>
+    struct convert_actors_<3>
+    {
+        template <typename TupleResultT, typename ActorTupleT>
+        struct apply
+        {
+            static TupleResultT
+            do_(ActorTupleT const& actor_tuple)
+            {
+                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+
+                using namespace tuple_index_names;
+                return TupleResultT(
+                        converter0::do_(actor_tuple)
+                    ,   converter1::do_(actor_tuple)
+                    ,   converter2::do_(actor_tuple)
+                );
+            }
+        };
+    };
+
+    #if PHOENIX_LIMIT > 3
+
+    /////////////////////////////////////
+    template <>
+    struct convert_actors_<4>
+    {
+        template <typename TupleResultT, typename ActorTupleT>
+        struct apply
+        {
+            static TupleResultT
+            do_(ActorTupleT const& actor_tuple)
+            {
+                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+                typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+
+                using namespace tuple_index_names;
+                return TupleResultT(
+                        converter0::do_(actor_tuple)
+                    ,   converter1::do_(actor_tuple)
+                    ,   converter2::do_(actor_tuple)
+                    ,   converter3::do_(actor_tuple)
+                );
+            }
+        };
+    };
+
+    /////////////////////////////////////
+    template <>
+    struct convert_actors_<5>
+    {
+        template <typename TupleResultT, typename ActorTupleT>
+        struct apply
+        {
+            static TupleResultT
+            do_(ActorTupleT const& actor_tuple)
+            {
+                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+                typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+                typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+
+                using namespace tuple_index_names;
+                return TupleResultT(
+                        converter0::do_(actor_tuple)
+                    ,   converter1::do_(actor_tuple)
+                    ,   converter2::do_(actor_tuple)
+                    ,   converter3::do_(actor_tuple)
+                    ,   converter4::do_(actor_tuple)
+                );
+            }
+        };
+    };
+
+    /////////////////////////////////////
+    template <>
+    struct convert_actors_<6>
+    {
+        template <typename TupleResultT, typename ActorTupleT>
+        struct apply
+        {
+            static TupleResultT
+            do_(ActorTupleT const& actor_tuple)
+            {
+                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+                typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+                typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+                typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+
+                using namespace tuple_index_names;
+                return TupleResultT(
+                        converter0::do_(actor_tuple)
+                    ,   converter1::do_(actor_tuple)
+                    ,   converter2::do_(actor_tuple)
+                    ,   converter3::do_(actor_tuple)
+                    ,   converter4::do_(actor_tuple)
+                    ,   converter5::do_(actor_tuple)
+                );
+            }
+        };
+    };
+
+    #if PHOENIX_LIMIT > 6
+
+    /////////////////////////////////////
+    template <>
+    struct convert_actors_<7>
+    {
+        template <typename TupleResultT, typename ActorTupleT>
+        struct apply
+        {
+            static TupleResultT
+            do_(ActorTupleT const& actor_tuple)
+            {
+                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+                typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+                typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+                typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+                typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+
+                using namespace tuple_index_names;
+                return TupleResultT(
+                        converter0::do_(actor_tuple)
+                    ,   converter1::do_(actor_tuple)
+                    ,   converter2::do_(actor_tuple)
+                    ,   converter3::do_(actor_tuple)
+                    ,   converter4::do_(actor_tuple)
+                    ,   converter5::do_(actor_tuple)
+                    ,   converter6::do_(actor_tuple)
+                );
+            }
+        };
+    };
+
+    /////////////////////////////////////
+    template <>
+    struct convert_actors_<8>
+    {
+        template <typename TupleResultT, typename ActorTupleT>
+        struct apply
+        {
+            static TupleResultT
+            do_(ActorTupleT const& actor_tuple)
+            {
+                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+                typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+                typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+                typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+                typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+                typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
+
+                using namespace tuple_index_names;
+                return TupleResultT(
+                        converter0::do_(actor_tuple)
+                    ,   converter1::do_(actor_tuple)
+                    ,   converter2::do_(actor_tuple)
+                    ,   converter3::do_(actor_tuple)
+                    ,   converter4::do_(actor_tuple)
+                    ,   converter5::do_(actor_tuple)
+                    ,   converter6::do_(actor_tuple)
+                    ,   converter7::do_(actor_tuple)
+                );
+            }
+        };
+    };
+
+    /////////////////////////////////////
+    template <>
+    struct convert_actors_<9>
+    {
+        template <typename TupleResultT, typename ActorTupleT>
+        struct apply
+        {
+            static TupleResultT
+            do_(ActorTupleT const& actor_tuple)
+            {
+                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+                typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+                typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+                typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+                typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+                typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
+                typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
+
+                using namespace tuple_index_names;
+                return TupleResultT(
+                        converter0::do_(actor_tuple)
+                    ,   converter1::do_(actor_tuple)
+                    ,   converter2::do_(actor_tuple)
+                    ,   converter3::do_(actor_tuple)
+                    ,   converter4::do_(actor_tuple)
+                    ,   converter5::do_(actor_tuple)
+                    ,   converter6::do_(actor_tuple)
+                    ,   converter7::do_(actor_tuple)
+                    ,   converter8::do_(actor_tuple)
+                );
+            }
+        };
+    };
+
+    #if PHOENIX_LIMIT > 9
+
+    /////////////////////////////////////
+    template <>
+    struct convert_actors_<10>
+    {
+        template <typename TupleResultT, typename ActorTupleT>
+        struct apply
+        {
+            static TupleResultT
+            do_(ActorTupleT const& actor_tuple)
+            {
+                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+                typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+                typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+                typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+                typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+                typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
+                typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
+                typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
+
+                using namespace tuple_index_names;
+                return TupleResultT(
+                        converter0::do_(actor_tuple)
+                    ,   converter1::do_(actor_tuple)
+                    ,   converter2::do_(actor_tuple)
+                    ,   converter3::do_(actor_tuple)
+                    ,   converter4::do_(actor_tuple)
+                    ,   converter5::do_(actor_tuple)
+                    ,   converter6::do_(actor_tuple)
+                    ,   converter7::do_(actor_tuple)
+                    ,   converter8::do_(actor_tuple)
+                    ,   converter9::do_(actor_tuple)
+                );
+            }
+        };
+    };
+
+    /////////////////////////////////////
+    template <>
+    struct convert_actors_<11>
+    {
+        template <typename TupleResultT, typename ActorTupleT>
+        struct apply
+        {
+            static TupleResultT
+            do_(ActorTupleT const& actor_tuple)
+            {
+                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+                typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+                typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+                typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+                typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+                typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
+                typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
+                typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
+                typedef impl::convert_actor<10, TupleResultT, ActorTupleT> converter10;
+
+                using namespace tuple_index_names;
+                return TupleResultT(
+                        converter0::do_(actor_tuple)
+                    ,   converter1::do_(actor_tuple)
+                    ,   converter2::do_(actor_tuple)
+                    ,   converter3::do_(actor_tuple)
+                    ,   converter4::do_(actor_tuple)
+                    ,   converter5::do_(actor_tuple)
+                    ,   converter6::do_(actor_tuple)
+                    ,   converter7::do_(actor_tuple)
+                    ,   converter8::do_(actor_tuple)
+                    ,   converter9::do_(actor_tuple)
+                    ,   converter10::do_(actor_tuple)
+                );
+            }
+        };
+    };
+
+    /////////////////////////////////////
+    template <>
+    struct convert_actors_<12>
+    {
+        template <typename TupleResultT, typename ActorTupleT>
+        struct apply
+        {
+            static TupleResultT
+            do_(ActorTupleT const& actor_tuple)
+            {
+                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+                typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+                typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+                typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+                typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+                typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
+                typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
+                typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
+                typedef impl::convert_actor<10, TupleResultT, ActorTupleT> converter10;
+                typedef impl::convert_actor<11, TupleResultT, ActorTupleT> converter11;
+
+                using namespace tuple_index_names;
+                return TupleResultT(
+                        converter0::do_(actor_tuple)
+                    ,   converter1::do_(actor_tuple)
+                    ,   converter2::do_(actor_tuple)
+                    ,   converter3::do_(actor_tuple)
+                    ,   converter4::do_(actor_tuple)
+                    ,   converter5::do_(actor_tuple)
+                    ,   converter6::do_(actor_tuple)
+                    ,   converter7::do_(actor_tuple)
+                    ,   converter8::do_(actor_tuple)
+                    ,   converter9::do_(actor_tuple)
+                    ,   converter10::do_(actor_tuple)
+                    ,   converter11::do_(actor_tuple)
+                );
+            }
+        };
+    };
+
+    #if PHOENIX_LIMIT > 12
+
+    /////////////////////////////////////
+    template <>
+    struct convert_actors_<13>
+    {
+        template <typename TupleResultT, typename ActorTupleT>
+        struct apply
+        {
+            static TupleResultT
+            do_(ActorTupleT const& actor_tuple)
+            {
+                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+                typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+                typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+                typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+                typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+                typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
+                typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
+                typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
+                typedef impl::convert_actor<10, TupleResultT, ActorTupleT> converter10;
+                typedef impl::convert_actor<11, TupleResultT, ActorTupleT> converter11;
+                typedef impl::convert_actor<12, TupleResultT, ActorTupleT> converter12;
+
+                using namespace tuple_index_names;
+                return TupleResultT(
+                        converter0::do_(actor_tuple)
+                    ,   converter1::do_(actor_tuple)
+                    ,   converter2::do_(actor_tuple)
+                    ,   converter3::do_(actor_tuple)
+                    ,   converter4::do_(actor_tuple)
+                    ,   converter5::do_(actor_tuple)
+                    ,   converter6::do_(actor_tuple)
+                    ,   converter7::do_(actor_tuple)
+                    ,   converter8::do_(actor_tuple)
+                    ,   converter9::do_(actor_tuple)
+                    ,   converter10::do_(actor_tuple)
+                    ,   converter11::do_(actor_tuple)
+                    ,   converter12::do_(actor_tuple)
+                );
+            }
+        };
+    };
+
+    ///////////////////////////////////////
+    template <>
+    struct convert_actors_<14>
+    {
+        template <typename TupleResultT, typename ActorTupleT>
+        struct apply
+        {
+            static TupleResultT
+            do_(ActorTupleT const& actor_tuple)
+            {
+                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+                typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+                typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+                typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+                typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+                typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
+                typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
+                typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
+                typedef impl::convert_actor<10, TupleResultT, ActorTupleT> converter10;
+                typedef impl::convert_actor<11, TupleResultT, ActorTupleT> converter11;
+                typedef impl::convert_actor<12, TupleResultT, ActorTupleT> converter12;
+                typedef impl::convert_actor<13, TupleResultT, ActorTupleT> converter13;
+
+                using namespace tuple_index_names;
+                return TupleResultT(
+                        converter0::do_(actor_tuple)
+                    ,   converter1::do_(actor_tuple)
+                    ,   converter2::do_(actor_tuple)
+                    ,   converter3::do_(actor_tuple)
+                    ,   converter4::do_(actor_tuple)
+                    ,   converter5::do_(actor_tuple)
+                    ,   converter6::do_(actor_tuple)
+                    ,   converter7::do_(actor_tuple)
+                    ,   converter8::do_(actor_tuple)
+                    ,   converter9::do_(actor_tuple)
+                    ,   converter10::do_(actor_tuple)
+                    ,   converter11::do_(actor_tuple)
+                    ,   converter12::do_(actor_tuple)
+                    ,   converter13::do_(actor_tuple)
+                );
+            }
+        };
+    };
+
+    ///////////////////////////////////////
+    template <>
+    struct convert_actors_<15>
+    {
+        template <typename TupleResultT, typename ActorTupleT>
+        struct apply
+        {
+            static TupleResultT
+            do_(ActorTupleT const& actor_tuple)
+            {
+                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;
+                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;
+                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;
+                typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;
+                typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;
+                typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;
+                typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;
+                typedef impl::convert_actor<7, TupleResultT, ActorTupleT> converter7;
+                typedef impl::convert_actor<8, TupleResultT, ActorTupleT> converter8;
+                typedef impl::convert_actor<9, TupleResultT, ActorTupleT> converter9;
+                typedef impl::convert_actor<10, TupleResultT, ActorTupleT> converter10;
+                typedef impl::convert_actor<11, TupleResultT, ActorTupleT> converter11;
+                typedef impl::convert_actor<12, TupleResultT, ActorTupleT> converter12;
+                typedef impl::convert_actor<13, TupleResultT, ActorTupleT> converter13;
+                typedef impl::convert_actor<14, TupleResultT, ActorTupleT> converter14;
+
+                using namespace tuple_index_names;
+                return TupleResultT(
+                        converter0::do_(actor_tuple)
+                    ,   converter1::do_(actor_tuple)
+                    ,   converter2::do_(actor_tuple)
+                    ,   converter3::do_(actor_tuple)
+                    ,   converter4::do_(actor_tuple)
+                    ,   converter5::do_(actor_tuple)
+                    ,   converter6::do_(actor_tuple)
+                    ,   converter7::do_(actor_tuple)
+                    ,   converter8::do_(actor_tuple)
+                    ,   converter9::do_(actor_tuple)
+                    ,   converter10::do_(actor_tuple)
+                    ,   converter11::do_(actor_tuple)
+                    ,   converter12::do_(actor_tuple)
+                    ,   converter13::do_(actor_tuple)
+                    ,   converter14::do_(actor_tuple)
+                );
+            }
+        };
+    };
+
+    #endif
+    #endif
+    #endif
+    #endif
+}   //  namespace impl
+
+
+///////////////////////////////////////////////////////////////////////////////
+}   //  namespace phoenix
+
+#endif // PHOENIX_TUPLEHELPERS_HPP
diff --git a/boost/boost/spirit/phoenix/tuples.hpp b/boost/boost/spirit/phoenix/tuples.hpp
new file mode 100644 (file)
index 0000000..0cde041
--- /dev/null
@@ -0,0 +1,1330 @@
+/*=============================================================================
+    Phoenix V1.2.1
+    Copyright (c) 2001-2002 Joel de Guzman
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef PHOENIX_TUPLES_HPP
+#define PHOENIX_TUPLES_HPP
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300)
+#error "Sorry, Phoenix does not support VC6 and VC7. Please upgrade to at least VC7.1"
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Phoenix predefined maximum limit. This limit defines the maximum
+//  number of elements a tuple can hold. This number defaults to 3. The
+//  actual maximum is rounded up in multiples of 3. Thus, if this value
+//  is 4, the actual limit is 6. The ultimate maximum limit in this
+//  implementation is 15.
+//
+///////////////////////////////////////////////////////////////////////////////
+#ifndef PHOENIX_LIMIT
+#define PHOENIX_LIMIT 3
+#endif
+
+#if defined(__BORLANDC__) && (__BORLANDC__ <= 0x561)
+namespace phoenix { namespace borland_only
+{
+    namespace ftors
+    {
+        //  We define these dummy template functions. Borland complains when
+        //  a template class has the same name as a template function,
+        //  regardless if they are in different namespaces.
+
+        template <typename T> void if_(T) {}
+        template <typename T> void for_(T) {}
+        template <typename T> void while_(T) {}
+        template <typename T> void do_(T) {}
+    }
+
+    namespace tmpls
+    {
+        //  We define these dummy template functions. Borland complains when
+        //  a template class has the same name as a template function,
+        //  regardless if they are in different namespaces.
+
+        template <typename T> struct if_ {};
+        template <typename T> struct for_ {};
+        template <typename T> struct while_ {};
+        template <typename T> struct do_ {};
+    }
+
+}} // namespace phoenix::borland_only
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/static_assert.hpp>
+#include <boost/call_traits.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace phoenix {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple
+//
+//      Tuples hold heterogeneous types up to a predefined maximum. Only
+//      the most basic functionality needed is provided. Unlike other
+//      recursive list-like tuple implementations, this tuple
+//      implementation uses simple structs similar to std::pair with
+//      specialization for 0 to N tuple elements.
+//
+//          1)  Construction
+//              Here are examples on how to construct tuples:
+//
+//                  typedef tuple<int, char> t1_t;
+//                  typedef tuple<int, std::string, double> t2_t;
+//
+//                  // this tuple has an int and char members
+//                  t1_t t1(3, 'c');
+//
+//                  // this tuple has an int, std::string and double members
+//                  t2_t t2(3, "hello", 3.14);
+//
+//              Tuples can also be constructed from other tuples. The
+//              source and destination tuples need not have exactly the
+//              same element types. The only requirement is that the
+//              source tuple have the same number of elements as the
+//              destination and that each element slot in the
+//              destination can be copy constructed from the source
+//              element. For example:
+//
+//                  tuple<double, double> t3(t1); // OK. Compatible tuples
+//                  tuple<double, double> t4(t2); // Error! Incompatible tuples
+//
+//          2)  Member access
+//                  A member in a tuple can be accessed using the
+//                  tuple's [] operator by specifying the Nth
+//                  tuple_index. Here are some examples:
+//
+//                      tuple_index<0> ix0; // 0th index == 1st item
+//                      tuple_index<1> ix1; // 1st index == 2nd item
+//                      tuple_index<2> ix2; // 2nd index == 3rd item
+//
+//                      t1[ix0] = 33;  // sets the int member of the tuple t1
+//                      t2[ix2] = 6e6; // sets the double member of the tuple t2
+//                      t1[ix1] = 'a'; // sets the char member of the tuple t1
+//
+//                  There are some predefined names are provided in sub-
+//                  namespace tuple_index_names:
+//
+//                      tuple_index<0> _1;
+//                      tuple_index<1> _2;
+//                      ...
+//                      tuple_index<N> _N;
+//
+//                  These indexes may be used by 'using' namespace
+//                  phoenix::tuple_index_names.
+//
+//                  Access to out of bound indexes returns a nil_t value.
+//
+//          3)  Member type inquiry
+//                  The type of an individual member can be queried.
+//                  Example:
+//
+//                      tuple_element<1, t2_t>::type
+//
+//                  Refers to the type of the second member (note zero based,
+//                  thus 0 = 1st item, 1 = 2nd item) of the tuple.
+//
+//                  Aside from tuple_element<N, T>::type, there are two
+//                  more types that tuple_element provides: rtype and
+//                  crtype. While 'type' is the plain underlying type,
+//                  'rtype' is the reference type, or type& and 'crtype'
+//                  is the constant reference type or type const&. The
+//                  latter two are provided to make it easy for the
+//                  client in dealing with the possibility of reference
+//                  to reference when type is already a reference, which
+//                  is illegal in C++.
+//
+//                  Access to out of bound indexes returns a nil_t type.
+//
+//          4)  Tuple length
+//                  The number of elements in a tuple can be queried.
+//                  Example:
+//
+//                      int n = t1.length;
+//
+//                  gets the number of elements in tuple t1.
+//
+//                  length is a static constant. Thus, TupleT::length
+//                  also works. Example:
+//
+//                      int n = t1_t::length;
+//
+///////////////////////////////////////////////////////////////////////////////
+struct nil_t {};
+using boost::remove_reference;
+using boost::call_traits;
+
+//////////////////////////////////
+namespace impl {
+
+    template <typename T>
+    struct access {
+
+        typedef const T& ctype;
+        typedef T& type;
+    };
+
+    template <typename T>
+    struct access<T&> {
+
+        typedef T& ctype;
+        typedef T& type;
+    };
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple_element
+//
+//      A query class that gets the Nth element inside a tuple.
+//      Examples:
+//
+//          tuple_element<1, tuple<int, char, void*> >::type    //  plain
+//          tuple_element<1, tuple<int, char, void*> >::rtype   //  ref
+//          tuple_element<1, tuple<int, char, void*> >::crtype  //  const ref
+//
+//      Has type char which is the 2nd type in the tuple
+//      (note zero based, thus 0 = 1st item, 1 = 2nd item).
+//
+//          Given a tuple object, the static function tuple_element<N,
+//          TupleT>::get(tuple) gets the Nth element in the tuple. The
+//          tuple class' tuple::operator[] uses this to get its Nth
+//          element.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <int N, typename TupleT>
+struct tuple_element
+{
+    typedef nil_t type;
+    typedef nil_t& rtype;
+    typedef nil_t const& crtype;
+
+    static nil_t    get(TupleT const& t)    { return nil_t(); }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<0, TupleT>
+{
+    typedef typename TupleT::a_type type;
+    typedef typename impl::access<type>::type rtype;
+    typedef typename impl::access<type>::ctype crtype;
+
+    static rtype    get(TupleT& t)          { return t.a; }
+    static crtype   get(TupleT const& t)    { return t.a; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<1, TupleT>
+{
+    typedef typename TupleT::b_type type;
+    typedef typename impl::access<type>::type rtype;
+    typedef typename impl::access<type>::ctype crtype;
+
+    static rtype    get(TupleT& t)          { return t.b; }
+    static crtype   get(TupleT const& t)    { return t.b; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<2, TupleT>
+{
+    typedef typename TupleT::c_type type;
+    typedef typename impl::access<type>::type rtype;
+    typedef typename impl::access<type>::ctype crtype;
+
+    static rtype    get(TupleT& t)          { return t.c; }
+    static crtype   get(TupleT const& t)    { return t.c; }
+};
+
+#if PHOENIX_LIMIT > 3
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<3, TupleT>
+{
+    typedef typename TupleT::d_type type;
+    typedef typename impl::access<type>::type rtype;
+    typedef typename impl::access<type>::ctype crtype;
+
+    static rtype    get(TupleT& t)          { return t.d; }
+    static crtype   get(TupleT const& t)    { return t.d; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<4, TupleT>
+{
+    typedef typename TupleT::e_type type;
+    typedef typename impl::access<type>::type rtype;
+    typedef typename impl::access<type>::ctype crtype;
+
+    static rtype    get(TupleT& t)          { return t.e; }
+    static crtype   get(TupleT const& t)    { return t.e; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<5, TupleT>
+{
+    typedef typename TupleT::f_type type;
+    typedef typename impl::access<type>::type rtype;
+    typedef typename impl::access<type>::ctype crtype;
+
+    static rtype    get(TupleT& t)          { return t.f; }
+    static crtype   get(TupleT const& t)    { return t.f; }
+};
+
+#if PHOENIX_LIMIT > 6
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<6, TupleT>
+{
+    typedef typename TupleT::g_type type;
+    typedef typename impl::access<type>::type rtype;
+    typedef typename impl::access<type>::ctype crtype;
+
+    static rtype    get(TupleT& t)          { return t.g; }
+    static crtype   get(TupleT const& t)    { return t.g; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<7, TupleT>
+{
+    typedef typename TupleT::h_type type;
+    typedef typename impl::access<type>::type rtype;
+    typedef typename impl::access<type>::ctype crtype;
+
+    static rtype    get(TupleT& t)          { return t.h; }
+    static crtype   get(TupleT const& t)    { return t.h; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<8, TupleT>
+{
+    typedef typename TupleT::i_type type;
+    typedef typename impl::access<type>::type rtype;
+    typedef typename impl::access<type>::ctype crtype;
+
+    static rtype    get(TupleT& t)          { return t.i; }
+    static crtype   get(TupleT const& t)    { return t.i; }
+};
+
+#if PHOENIX_LIMIT > 9
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<9, TupleT>
+{
+    typedef typename TupleT::j_type type;
+    typedef typename impl::access<type>::type rtype;
+    typedef typename impl::access<type>::ctype crtype;
+
+    static rtype    get(TupleT& t)          { return t.j; }
+    static crtype   get(TupleT const& t)    { return t.j; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<10, TupleT>
+{
+    typedef typename TupleT::k_type type;
+    typedef typename impl::access<type>::type rtype;
+    typedef typename impl::access<type>::ctype crtype;
+
+    static rtype    get(TupleT& t)          { return t.k; }
+    static crtype   get(TupleT const& t)    { return t.k; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<11, TupleT>
+{
+    typedef typename TupleT::l_type type;
+    typedef typename impl::access<type>::type rtype;
+    typedef typename impl::access<type>::ctype crtype;
+
+    static rtype    get(TupleT& t)          { return t.l; }
+    static crtype   get(TupleT const& t)    { return t.l; }
+};
+
+#if PHOENIX_LIMIT > 12
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<12, TupleT>
+{
+    typedef typename TupleT::m_type type;
+    typedef typename impl::access<type>::type rtype;
+    typedef typename impl::access<type>::ctype crtype;
+
+    static rtype    get(TupleT& t)          { return t.m; }
+    static crtype   get(TupleT const& t)    { return t.m; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<13, TupleT>
+{
+    typedef typename TupleT::n_type type;
+    typedef typename impl::access<type>::type rtype;
+    typedef typename impl::access<type>::ctype crtype;
+
+    static rtype    get(TupleT& t)          { return t.n; }
+    static crtype   get(TupleT const& t)    { return t.n; }
+};
+
+//////////////////////////////////
+template <typename TupleT>
+struct tuple_element<14, TupleT>
+{
+    typedef typename TupleT::o_type type;
+    typedef typename impl::access<type>::type rtype;
+    typedef typename impl::access<type>::ctype crtype;
+
+    static rtype    get(TupleT& t)          { return t.o; }
+    static crtype   get(TupleT const& t)    { return t.o; }
+};
+
+#endif
+#endif
+#endif
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple forward declaration.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+        typename A = nil_t
+    ,   typename B = nil_t
+    ,   typename C = nil_t
+
+#if PHOENIX_LIMIT > 3
+    ,   typename D = nil_t
+    ,   typename E = nil_t
+    ,   typename F = nil_t
+
+#if PHOENIX_LIMIT > 6
+    ,   typename G = nil_t
+    ,   typename H = nil_t
+    ,   typename I = nil_t
+
+#if PHOENIX_LIMIT > 9
+    ,   typename J = nil_t
+    ,   typename K = nil_t
+    ,   typename L = nil_t
+
+#if PHOENIX_LIMIT > 12
+    ,   typename M = nil_t
+    ,   typename N = nil_t
+    ,   typename O = nil_t
+
+#endif
+#endif
+#endif
+#endif
+
+    ,   typename NU = nil_t  // Not used
+>
+struct tuple;
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple_index
+//
+//      This class wraps an integer in a type to be used for indexing
+//      the Nth element in a tuple. See tuple operator[]. Some
+//      predefined names are provided in sub-namespace
+//      tuple_index_names.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <int N>
+struct tuple_index {};
+
+//////////////////////////////////
+namespace tuple_index_names {
+
+    tuple_index<0> const _1 = tuple_index<0>();
+    tuple_index<1> const _2 = tuple_index<1>();
+    tuple_index<2> const _3 = tuple_index<2>();
+
+#if PHOENIX_LIMIT > 3
+    tuple_index<3> const _4 = tuple_index<3>();
+    tuple_index<4> const _5 = tuple_index<4>();
+    tuple_index<5> const _6 = tuple_index<5>();
+
+#if PHOENIX_LIMIT > 6
+    tuple_index<6> const _7 = tuple_index<6>();
+    tuple_index<7> const _8 = tuple_index<7>();
+    tuple_index<8> const _9 = tuple_index<8>();
+
+#if PHOENIX_LIMIT > 9
+    tuple_index<9> const _10 = tuple_index<9>();
+    tuple_index<10> const _11 = tuple_index<10>();
+    tuple_index<11> const _12 = tuple_index<11>();
+
+#if PHOENIX_LIMIT > 12
+    tuple_index<12> const _13 = tuple_index<12>();
+    tuple_index<13> const _14 = tuple_index<13>();
+    tuple_index<14> const _15 = tuple_index<14>();
+
+#endif
+#endif
+#endif
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple_common class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename DerivedT>
+struct tuple_base {
+
+    typedef nil_t   a_type;
+    typedef nil_t   b_type;
+    typedef nil_t   c_type;
+
+#if PHOENIX_LIMIT > 3
+    typedef nil_t   d_type;
+    typedef nil_t   e_type;
+    typedef nil_t   f_type;
+
+#if PHOENIX_LIMIT > 6
+    typedef nil_t   g_type;
+    typedef nil_t   h_type;
+    typedef nil_t   i_type;
+
+#if PHOENIX_LIMIT > 9
+    typedef nil_t   j_type;
+    typedef nil_t   k_type;
+    typedef nil_t   l_type;
+
+#if PHOENIX_LIMIT > 12
+    typedef nil_t   m_type;
+    typedef nil_t   n_type;
+    typedef nil_t   o_type;
+
+#endif
+#endif
+#endif
+#endif
+
+    template <int N>
+    typename tuple_element<N, DerivedT>::crtype
+    operator[](tuple_index<N>) const
+    {
+        return tuple_element<N, DerivedT>
+            ::get(*static_cast<DerivedT const*>(this));
+    }
+
+    template <int N>
+    typename tuple_element<N, DerivedT>::rtype
+    operator[](tuple_index<N>)
+    {
+        return tuple_element<N, DerivedT>
+            ::get(*static_cast<DerivedT*>(this));
+    }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple <0 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <>
+struct tuple<>
+:   public tuple_base<tuple<> > {
+
+    BOOST_STATIC_CONSTANT(int, length = 0);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple <1 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A>
+struct tuple<A, nil_t, nil_t,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+>
+:   public tuple_base<tuple<A> > {
+
+    BOOST_STATIC_CONSTANT(int, length = 1);
+    typedef A a_type;
+
+    tuple() {}
+
+    tuple(
+        typename call_traits<A>::param_type a_
+    ):  a(a_) {}
+
+    template <typename TupleT>
+    tuple(TupleT const& init)
+    :   a(init[tuple_index<0>()])
+    { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+    A a;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple <2 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A, typename B>
+struct tuple<A, B, nil_t,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+>
+:   public tuple_base<tuple<A, B> > {
+
+    BOOST_STATIC_CONSTANT(int, length = 2);
+    typedef A a_type; typedef B b_type;
+
+    tuple() {}
+
+    tuple(
+        typename call_traits<A>::param_type a_,
+        typename call_traits<B>::param_type b_
+    ):  a(a_), b(b_) {}
+
+    template <typename TupleT>
+    tuple(TupleT const& init)
+    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()])
+    { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+    A a; B b;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple <3 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A, typename B, typename C>
+struct tuple<A, B, C,
+#if PHOENIX_LIMIT > 3
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+>
+:   public tuple_base<tuple<A, B, C> > {
+
+    BOOST_STATIC_CONSTANT(int, length = 3);
+    typedef A a_type; typedef B b_type;
+    typedef C c_type;
+
+    tuple() {}
+
+    tuple(
+        typename call_traits<A>::param_type a_,
+        typename call_traits<B>::param_type b_,
+        typename call_traits<C>::param_type c_
+    ):  a(a_), b(b_), c(c_) {}
+
+    template <typename TupleT>
+    tuple(TupleT const& init)
+    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+        c(init[tuple_index<2>()])
+    { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+    A a; B b; C c;
+};
+
+#if PHOENIX_LIMIT > 3
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple <4 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A, typename B, typename C, typename D>
+struct tuple<A, B, C, D, nil_t, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+>
+:   public tuple_base<tuple<A, B, C, D> > {
+
+    BOOST_STATIC_CONSTANT(int, length = 4);
+    typedef A a_type; typedef B b_type;
+    typedef C c_type; typedef D d_type;
+
+    tuple() {}
+
+    tuple(
+        typename call_traits<A>::param_type a_,
+        typename call_traits<B>::param_type b_,
+        typename call_traits<C>::param_type c_,
+        typename call_traits<D>::param_type d_
+    ):  a(a_), b(b_), c(c_), d(d_) {}
+
+    template <typename TupleT>
+    tuple(TupleT const& init)
+    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+        c(init[tuple_index<2>()]), d(init[tuple_index<3>()])
+    { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+    A a; B b; C c; D d;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple <5 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename A, typename B, typename C, typename D, typename E>
+struct tuple<A, B, C, D, E, nil_t,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+>
+:   public tuple_base<tuple<A, B, C, D, E> > {
+
+    BOOST_STATIC_CONSTANT(int, length = 5);
+    typedef A a_type; typedef B b_type;
+    typedef C c_type; typedef D d_type;
+    typedef E e_type;
+
+    tuple() {}
+
+    tuple(
+        typename call_traits<A>::param_type a_,
+        typename call_traits<B>::param_type b_,
+        typename call_traits<C>::param_type c_,
+        typename call_traits<D>::param_type d_,
+        typename call_traits<E>::param_type e_
+    ):  a(a_), b(b_), c(c_), d(d_), e(e_) {}
+
+    template <typename TupleT>
+    tuple(TupleT const& init)
+    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+        c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+        e(init[tuple_index<4>()])
+    { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+    A a; B b; C c; D d; E e;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple <6 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F>
+struct tuple<A, B, C, D, E, F,
+#if PHOENIX_LIMIT > 6
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+#endif
+    nil_t   //  Unused
+>
+:   public tuple_base<tuple<A, B, C, D, E, F> > {
+
+    BOOST_STATIC_CONSTANT(int, length = 6);
+    typedef A a_type; typedef B b_type;
+    typedef C c_type; typedef D d_type;
+    typedef E e_type; typedef F f_type;
+
+    tuple() {}
+
+    tuple(
+        typename call_traits<A>::param_type a_,
+        typename call_traits<B>::param_type b_,
+        typename call_traits<C>::param_type c_,
+        typename call_traits<D>::param_type d_,
+        typename call_traits<E>::param_type e_,
+        typename call_traits<F>::param_type f_
+    ):  a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_) {}
+
+    template <typename TupleT>
+    tuple(TupleT const& init)
+    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+        c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+        e(init[tuple_index<4>()]), f(init[tuple_index<5>()])
+    { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+    A a; B b; C c; D d; E e;
+    F f;
+};
+
+#if PHOENIX_LIMIT > 6
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple <7 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G>
+struct tuple<A, B, C, D, E, F, G, nil_t, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+    nil_t   //  Unused
+>
+:   public tuple_base<tuple<A, B, C, D, E, F, G> > {
+
+    BOOST_STATIC_CONSTANT(int, length = 7);
+    typedef A a_type; typedef B b_type;
+    typedef C c_type; typedef D d_type;
+    typedef E e_type; typedef F f_type;
+    typedef G g_type;
+
+    tuple() {}
+
+    tuple(
+        typename call_traits<A>::param_type a_,
+        typename call_traits<B>::param_type b_,
+        typename call_traits<C>::param_type c_,
+        typename call_traits<D>::param_type d_,
+        typename call_traits<E>::param_type e_,
+        typename call_traits<F>::param_type f_,
+        typename call_traits<G>::param_type g_
+    ):  a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_) {}
+
+    template <typename TupleT>
+    tuple(TupleT const& init)
+    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+        c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+        e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+        g(init[tuple_index<6>()])
+    { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+    A a; B b; C c; D d; E e;
+    F f; G g;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple <8 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H>
+struct tuple<A, B, C, D, E, F, G, H, nil_t,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+    nil_t   //  Unused
+>
+:   public tuple_base<tuple<A, B, C, D, E, F, G, H> > {
+
+    BOOST_STATIC_CONSTANT(int, length = 8);
+    typedef A a_type; typedef B b_type;
+    typedef C c_type; typedef D d_type;
+    typedef E e_type; typedef F f_type;
+    typedef G g_type; typedef H h_type;
+
+    tuple() {}
+
+    tuple(
+        typename call_traits<A>::param_type a_,
+        typename call_traits<B>::param_type b_,
+        typename call_traits<C>::param_type c_,
+        typename call_traits<D>::param_type d_,
+        typename call_traits<E>::param_type e_,
+        typename call_traits<F>::param_type f_,
+        typename call_traits<G>::param_type g_,
+        typename call_traits<H>::param_type h_
+    ):  a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_), h(h_) {}
+
+    template <typename TupleT>
+    tuple(TupleT const& init)
+    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+        c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+        e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+        g(init[tuple_index<6>()]), h(init[tuple_index<7>()])
+    { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+    A a; B b; C c; D d; E e;
+    F f; G g; H h;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple <9 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I>
+struct tuple<A, B, C, D, E, F, G, H, I,
+#if PHOENIX_LIMIT > 9
+    nil_t, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+#endif
+    nil_t   //  Unused
+>
+:   public tuple_base<tuple<A, B, C, D, E, F, G, H, I> > {
+
+    BOOST_STATIC_CONSTANT(int, length = 9);
+    typedef A a_type; typedef B b_type;
+    typedef C c_type; typedef D d_type;
+    typedef E e_type; typedef F f_type;
+    typedef G g_type; typedef H h_type;
+    typedef I i_type;
+
+    tuple() {}
+
+    tuple(
+        typename call_traits<A>::param_type a_,
+        typename call_traits<B>::param_type b_,
+        typename call_traits<C>::param_type c_,
+        typename call_traits<D>::param_type d_,
+        typename call_traits<E>::param_type e_,
+        typename call_traits<F>::param_type f_,
+        typename call_traits<G>::param_type g_,
+        typename call_traits<H>::param_type h_,
+        typename call_traits<I>::param_type i_
+    ):  a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_), h(h_), i(i_) {}
+
+    template <typename TupleT>
+    tuple(TupleT const& init)
+    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+        c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+        e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+        g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
+        i(init[tuple_index<8>()])
+    { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+    A a; B b; C c; D d; E e;
+    F f; G g; H h; I i;
+};
+
+#if PHOENIX_LIMIT > 9
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple <10 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J>
+struct tuple<A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+    nil_t   //  Unused
+>
+:   public tuple_base<tuple<A, B, C, D, E, F, G, H, I, J> > {
+
+    BOOST_STATIC_CONSTANT(int, length = 10);
+    typedef A a_type; typedef B b_type;
+    typedef C c_type; typedef D d_type;
+    typedef E e_type; typedef F f_type;
+    typedef G g_type; typedef H h_type;
+    typedef I i_type; typedef J j_type;
+
+    tuple() {}
+
+    tuple(
+        typename call_traits<A>::param_type a_,
+        typename call_traits<B>::param_type b_,
+        typename call_traits<C>::param_type c_,
+        typename call_traits<D>::param_type d_,
+        typename call_traits<E>::param_type e_,
+        typename call_traits<F>::param_type f_,
+        typename call_traits<G>::param_type g_,
+        typename call_traits<H>::param_type h_,
+        typename call_traits<I>::param_type i_,
+        typename call_traits<J>::param_type j_
+    ):  a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_), h(h_), i(i_), j(j_) {}
+
+    template <typename TupleT>
+    tuple(TupleT const& init)
+    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+        c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+        e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+        g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
+        i(init[tuple_index<8>()]), j(init[tuple_index<9>()])
+    { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+    A a; B b; C c; D d; E e;
+    F f; G g; H h; I i; J j;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple <11 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K>
+struct tuple<A, B, C, D, E, F, G, H, I, J, K, nil_t,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+    nil_t   //  Unused
+>
+:   public tuple_base<tuple<A, B, C, D, E, F, G, H, I, J, K> > {
+
+    BOOST_STATIC_CONSTANT(int, length = 11);
+    typedef A a_type; typedef B b_type;
+    typedef C c_type; typedef D d_type;
+    typedef E e_type; typedef F f_type;
+    typedef G g_type; typedef H h_type;
+    typedef I i_type; typedef J j_type;
+    typedef K k_type;
+
+    tuple() {}
+
+    tuple(
+        typename call_traits<A>::param_type a_,
+        typename call_traits<B>::param_type b_,
+        typename call_traits<C>::param_type c_,
+        typename call_traits<D>::param_type d_,
+        typename call_traits<E>::param_type e_,
+        typename call_traits<F>::param_type f_,
+        typename call_traits<G>::param_type g_,
+        typename call_traits<H>::param_type h_,
+        typename call_traits<I>::param_type i_,
+        typename call_traits<J>::param_type j_,
+        typename call_traits<K>::param_type k_
+    ):  a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_), h(h_), i(i_), j(j_),
+        k(k_) {}
+
+    template <typename TupleT>
+    tuple(TupleT const& init)
+    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+        c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+        e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+        g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
+        i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
+        k(init[tuple_index<10>()])
+    { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+    A a; B b; C c; D d; E e;
+    F f; G g; H h; I i; J j;
+    K k;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple <12 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L>
+struct tuple<A, B, C, D, E, F, G, H, I, J, K, L,
+#if PHOENIX_LIMIT > 12
+    nil_t, nil_t, nil_t,
+#endif
+    nil_t   //  Unused
+>
+:   public tuple_base<tuple<A, B, C, D, E, F, G, H, I, J, K, L> > {
+
+    BOOST_STATIC_CONSTANT(int, length = 12);
+    typedef A a_type; typedef B b_type;
+    typedef C c_type; typedef D d_type;
+    typedef E e_type; typedef F f_type;
+    typedef G g_type; typedef H h_type;
+    typedef I i_type; typedef J j_type;
+    typedef K k_type; typedef L l_type;
+
+    tuple() {}
+
+    tuple(
+        typename call_traits<A>::param_type a_,
+        typename call_traits<B>::param_type b_,
+        typename call_traits<C>::param_type c_,
+        typename call_traits<D>::param_type d_,
+        typename call_traits<E>::param_type e_,
+        typename call_traits<F>::param_type f_,
+        typename call_traits<G>::param_type g_,
+        typename call_traits<H>::param_type h_,
+        typename call_traits<I>::param_type i_,
+        typename call_traits<J>::param_type j_,
+        typename call_traits<K>::param_type k_,
+        typename call_traits<L>::param_type l_
+    ):  a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_), h(h_), i(i_), j(j_),
+        k(k_), l(l_) {}
+
+    template <typename TupleT>
+    tuple(TupleT const& init)
+    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+        c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+        e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+        g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
+        i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
+        k(init[tuple_index<10>()]), l(init[tuple_index<11>()])
+    { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+    A a; B b; C c; D d; E e;
+    F f; G g; H h; I i; J j;
+    K k; L l;
+};
+
+#if PHOENIX_LIMIT > 12
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple <13 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M>
+struct tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t>
+:   public tuple_base<
+        tuple<A, B, C, D, E, F, G, H, I, J, K, L, M> > {
+
+    BOOST_STATIC_CONSTANT(int, length = 13);
+    typedef A a_type; typedef B b_type;
+    typedef C c_type; typedef D d_type;
+    typedef E e_type; typedef F f_type;
+    typedef G g_type; typedef H h_type;
+    typedef I i_type; typedef J j_type;
+    typedef K k_type; typedef L l_type;
+    typedef M m_type;
+
+    tuple() {}
+
+    tuple(
+        typename call_traits<A>::param_type a_,
+        typename call_traits<B>::param_type b_,
+        typename call_traits<C>::param_type c_,
+        typename call_traits<D>::param_type d_,
+        typename call_traits<E>::param_type e_,
+        typename call_traits<F>::param_type f_,
+        typename call_traits<G>::param_type g_,
+        typename call_traits<H>::param_type h_,
+        typename call_traits<I>::param_type i_,
+        typename call_traits<J>::param_type j_,
+        typename call_traits<K>::param_type k_,
+        typename call_traits<L>::param_type l_,
+        typename call_traits<M>::param_type m_
+    ):  a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_), h(h_), i(i_), j(j_),
+        k(k_), l(l_), m(m_) {}
+
+    template <typename TupleT>
+    tuple(TupleT const& init)
+    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+        c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+        e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+        g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
+        i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
+        k(init[tuple_index<10>()]), l(init[tuple_index<11>()]),
+        m(init[tuple_index<12>()])
+    { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+    A a; B b; C c; D d; E e;
+    F f; G g; H h; I i; J j;
+    K k; L l; M m;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple <14 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N>
+struct tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t>
+:   public tuple_base<
+        tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N> > {
+
+    BOOST_STATIC_CONSTANT(int, length = 14);
+    typedef A a_type; typedef B b_type;
+    typedef C c_type; typedef D d_type;
+    typedef E e_type; typedef F f_type;
+    typedef G g_type; typedef H h_type;
+    typedef I i_type; typedef J j_type;
+    typedef K k_type; typedef L l_type;
+    typedef M m_type; typedef N n_type;
+
+    tuple() {}
+
+    tuple(
+        typename call_traits<A>::param_type a_,
+        typename call_traits<B>::param_type b_,
+        typename call_traits<C>::param_type c_,
+        typename call_traits<D>::param_type d_,
+        typename call_traits<E>::param_type e_,
+        typename call_traits<F>::param_type f_,
+        typename call_traits<G>::param_type g_,
+        typename call_traits<H>::param_type h_,
+        typename call_traits<I>::param_type i_,
+        typename call_traits<J>::param_type j_,
+        typename call_traits<K>::param_type k_,
+        typename call_traits<L>::param_type l_,
+        typename call_traits<M>::param_type m_,
+        typename call_traits<N>::param_type n_
+    ):  a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_), h(h_), i(i_), j(j_),
+        k(k_), l(l_), m(m_), n(n_) {}
+
+    template <typename TupleT>
+    tuple(TupleT const& init)
+    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+        c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+        e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+        g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
+        i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
+        k(init[tuple_index<10>()]), l(init[tuple_index<11>()]),
+        m(init[tuple_index<12>()]), n(init[tuple_index<13>()])
+    { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+    A a; B b; C c; D d; E e;
+    F f; G g; H h; I i; J j;
+    K k; L l; M m; N n;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tuple <15 member> class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename A, typename B, typename C, typename D, typename E,
+    typename F, typename G, typename H, typename I, typename J,
+    typename K, typename L, typename M, typename N, typename O>
+struct tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t>
+:   public tuple_base<
+        tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> > {
+
+    BOOST_STATIC_CONSTANT(int, length = 15);
+    typedef A a_type; typedef B b_type;
+    typedef C c_type; typedef D d_type;
+    typedef E e_type; typedef F f_type;
+    typedef G g_type; typedef H h_type;
+    typedef I i_type; typedef J j_type;
+    typedef K k_type; typedef L l_type;
+    typedef M m_type; typedef N n_type;
+    typedef O o_type;
+
+    tuple() {}
+
+    tuple(
+        typename call_traits<A>::param_type a_,
+        typename call_traits<B>::param_type b_,
+        typename call_traits<C>::param_type c_,
+        typename call_traits<D>::param_type d_,
+        typename call_traits<E>::param_type e_,
+        typename call_traits<F>::param_type f_,
+        typename call_traits<G>::param_type g_,
+        typename call_traits<H>::param_type h_,
+        typename call_traits<I>::param_type i_,
+        typename call_traits<J>::param_type j_,
+        typename call_traits<K>::param_type k_,
+        typename call_traits<L>::param_type l_,
+        typename call_traits<M>::param_type m_,
+        typename call_traits<N>::param_type n_,
+        typename call_traits<O>::param_type o_
+    ):  a(a_), b(b_), c(c_), d(d_), e(e_),
+        f(f_), g(g_), h(h_), i(i_), j(j_),
+        k(k_), l(l_), m(m_), n(n_), o(o_) {}
+
+    template <typename TupleT>
+    tuple(TupleT const& init)
+    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),
+        c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),
+        e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),
+        g(init[tuple_index<6>()]), h(init[tuple_index<7>()]),
+        i(init[tuple_index<8>()]), j(init[tuple_index<9>()]),
+        k(init[tuple_index<10>()]), l(init[tuple_index<11>()]),
+        m(init[tuple_index<12>()]), n(init[tuple_index<13>()]),
+        o(init[tuple_index<14>()])
+    { BOOST_STATIC_ASSERT(TupleT::length == length); }
+
+    A a; B b; C c; D d; E e;
+    F f; G g; H h; I i; J j;
+    K k; L l; M m; N n; O o;
+};
+
+#endif
+#endif
+#endif
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+}   //  namespace phoenix
+
+#endif
diff --git a/boost/boost/spirit/symbols.hpp b/boost/boost/spirit/symbols.hpp
new file mode 100644 (file)
index 0000000..24d913a
--- /dev/null
@@ -0,0 +1,22 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_SYMBOLS_MAIN_HPP)
+#define BOOST_SPIRIT_SYMBOLS_MAIN_HPP
+
+#include <boost/spirit/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Master header for Spirit.Symbols
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include <boost/spirit/symbols/symbols.hpp>
+
+#endif // !defined(BOOST_SPIRIT_SYMBOLS_MAIN_HPP)
diff --git a/boost/boost/spirit/symbols/impl/symbols.ipp b/boost/boost/spirit/symbols/impl/symbols.ipp
new file mode 100644 (file)
index 0000000..20d746c
--- /dev/null
@@ -0,0 +1,113 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_SYMBOLS_IPP
+#define BOOST_SPIRIT_SYMBOLS_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/symbols/impl/tst.ipp>
+#include <boost/detail/workaround.hpp>
+
+// MSVC: void warning about the use of 'this' pointer in constructors
+#if defined(BOOST_MSVC)
+#pragma warning(disable : 4355)
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  symbols class implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+inline symbols<T, CharT, SetT>::symbols()
+: SetT()
+, add(*this)
+{
+}
+
+//////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+symbols<T, CharT, SetT>::symbols(symbols const& other)
+: SetT(other)
+// Tru64 CXX seems to be confused by the explicit call of the default
+// constructor and generates wrong code which invalidates the just contructed
+// first base class in the line above.
+#if !BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590041))
+, parser<symbols<T, CharT, SetT> >()
+#endif
+, add(*this)
+{
+}
+
+//////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+inline symbols<T, CharT, SetT>::~symbols()
+{}
+
+//////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+inline symbols<T, CharT, SetT>&
+symbols<T, CharT, SetT>::operator=(symbols const& other)
+{
+    SetT::operator=(other);
+    return *this;
+}
+
+//////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+inline symbol_inserter<T, SetT> const&
+symbols<T, CharT, SetT>::operator=(CharT const* str)
+{
+    return add, str;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Symbol table utilities
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+inline T*
+find(symbols<T, CharT, SetT> const& table, CharT const* sym)
+{
+    CharT const* last = sym;
+    while (*last)
+        last++;
+    scanner<CharT const *> scan(sym, last);
+    T* result = table.find(scan);
+    return scan.at_end()? result: 0;
+}
+
+//////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+inline T*
+add(symbols<T, CharT, SetT>& table, CharT const* sym, T const& data)
+{
+    CharT const* first = sym;
+    CharT const* last = sym;
+    while (*last)
+        last++;
+    scanner<CharT const *> scan(first, last);
+    if (table.find(scan) && scan.at_end())
+        return 0;               // symbol already contained in symbol table
+    table.add(sym, last, data);
+    first = sym;
+    return table.find(scan);    // refind the inserted symbol
+}
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#if defined(BOOST_MSVC)
+#pragma warning(default : 4355)
+#endif
+
+#endif
diff --git a/boost/boost/spirit/symbols/impl/tst.ipp b/boost/boost/spirit/symbols/impl/tst.ipp
new file mode 100644 (file)
index 0000000..f328453
--- /dev/null
@@ -0,0 +1,270 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_TST_IPP
+#define BOOST_SPIRIT_TST_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <memory> // for std::auto_ptr
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+    namespace impl
+    {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  tst class
+//
+//      Ternary Search Tree implementation. The data structure is faster than
+//      hashing for many typical search problems especially when the search
+//      interface is iterator based. Searching for a string of length k in a
+//      ternary search tree with n strings will require at most O(log n+k)
+//      character comparisons. TSTs are many times faster than hash tables
+//      for unsuccessful searches since mismatches are discovered earlier
+//      after examining only a few characters. Hash tables always examine an
+//      entire key when searching.
+//
+//      For details see http://www.cs.princeton.edu/~rs/strings/.
+//
+//      *** This is a low level class and is
+//          not meant for public consumption ***
+//
+///////////////////////////////////////////////////////////////////////////////
+    template <typename T, typename CharT>
+    struct tst_node
+    {
+        tst_node(CharT value_)
+        : value(value_)
+        , left(0)
+        , right(0)
+        { middle.link = 0; }
+
+        ~tst_node()
+        {
+            delete left;
+            delete right;
+            if (value)
+                delete middle.link;
+            else
+                delete middle.data;
+        }
+
+        tst_node*
+        clone() const
+        {
+            std::auto_ptr<tst_node> copy(new tst_node(value));
+
+            if (left)
+                copy->left = left->clone();
+            if (right)
+                copy->right = right->clone();
+
+            if (value && middle.link)
+            {
+                copy->middle.link = middle.link->clone();
+            }
+            else
+            {
+                std::auto_ptr<T> mid_data(new T(*middle.data));
+                copy->middle.data = mid_data.release();
+            }
+
+            return copy.release();
+        }
+
+        union center {
+
+            tst_node*   link;
+            T*          data;
+        };
+
+        CharT       value;
+        tst_node*   left;
+        center      middle;
+        tst_node*   right;
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T, typename CharT>
+    class tst
+    {
+    public:
+
+        struct search_info
+        {
+            T*          data;
+            std::size_t length;
+        };
+
+        tst()
+        : root(0) {}
+
+        tst(tst const& other)
+        : root(other.root ? other.root->clone() : 0) {}
+
+        ~tst()
+        { delete root; }
+
+        tst&
+        operator=(tst const& other)
+        {
+            if (this != &other)
+            {
+                node_t* new_root = other.root ? other.root->clone() : 0;
+                delete root;
+                root = new_root;
+            }
+            return *this;
+        }
+
+        template <typename IteratorT>
+        T* add(IteratorT first, IteratorT const& last, T const& data)
+        {
+            if (first == last)
+                return 0;
+
+            node_t**  np = &root;
+            CharT   ch = *first;
+
+            for (;;)
+            {
+                if (*np == 0 || ch == 0)
+                {
+                    node_t* right = 0;
+                    if (np != 0)
+                        right = *np;
+                    *np = new node_t(ch);
+                    if (right)
+                        (**np).right = right;
+                }
+
+                if (ch < (**np).value)
+                {
+                    np = &(**np).left;
+                }
+                else
+                {
+                    if (ch == (**np).value)
+                    {
+                        if (ch == 0)
+                        {
+                            if ((**np).middle.data == 0)
+                            {
+                                (**np).middle.data = new T(data);
+                                return (**np).middle.data;
+                            }
+                            else
+                            {
+                                //  re-addition is disallowed
+                                return 0;
+                            }
+                       }
+                        ++first;
+                        ch = (first == last) ? 0 : *first;
+                        np = &(**np).middle.link;
+                    }
+                    else
+                    {
+                        np = &(**np).right;
+                    }
+                }
+            }
+        }
+
+        template <typename ScannerT>
+        search_info find(ScannerT const& scan) const
+        {
+            search_info result = { 0, 0 };
+            if (scan.at_end()) {
+                return result;
+            }
+
+            typedef typename ScannerT::iterator_t iterator_t;
+            node_t*     np = root;
+            CharT       ch = *scan;
+            iterator_t  save = scan.first;
+            iterator_t  latest = scan.first;
+            std::size_t latest_len = 0;
+
+            while (np)
+            {
+                if (ch < np->value)
+                {
+                    if (np->value == 0)
+                    {
+                        result.data = np->middle.data;
+                        if (result.data)
+                        {
+                            latest = scan.first;
+                            latest_len = result.length;
+                        }
+                    }
+                    np = np->left;
+                }
+                else
+                {
+                    if (ch == np->value)
+                    {
+                        if (scan.at_end())
+                        {
+                            result.data = np->middle.data;
+                            if (result.data)
+                            {
+                                latest = scan.first;
+                                latest_len = result.length;
+                            }
+                            break;
+                        }
+
+                        ++scan;
+                        ch = scan.at_end() ? 0 : *scan;
+                        np = np->middle.link;
+                        ++result.length;
+                    }
+                    else
+                    {
+                        if (np->value == 0)
+                        {
+                            result.data = np->middle.data;
+                            if (result.data)
+                            {
+                                latest = scan.first;
+                                latest_len = result.length;
+                            }
+                        }
+                        np = np->right;
+                     }
+                }
+            }
+
+            if (result.data == 0)
+            {
+                scan.first = save;
+            }
+            else
+            {
+                scan.first = latest;
+                result.length = latest_len;
+            }
+            return result;
+        }
+
+    private:
+
+        typedef tst_node<T, CharT> node_t;
+        node_t* root;
+    };
+
+///////////////////////////////////////////////////////////////////////////////
+    } // namespace impl
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/boost/spirit/symbols/symbols.hpp b/boost/boost/spirit/symbols/symbols.hpp
new file mode 100644 (file)
index 0000000..7896611
--- /dev/null
@@ -0,0 +1,237 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_SYMBOLS_HPP
+#define BOOST_SPIRIT_SYMBOLS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <string>
+
+#include <boost/ref.hpp>
+
+#include <boost/spirit/core/parser.hpp>
+#include <boost/spirit/core/composite/directives.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//  Forward Declarations
+
+namespace impl
+{
+    template <typename CharT, typename T>
+    class tst;
+}
+
+template <typename T, typename SetT>
+class symbol_inserter;
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  symbols class
+//
+//      This class implements a symbol table. The symbol table holds a
+//      dictionary of symbols where each symbol is a sequence of CharTs.
+//      The template class can work efficiently with 8, 16 and 32 bit
+//      characters. Mutable data of type T is associated with each
+//      symbol.
+//
+//      The class is a parser. The parse member function returns
+//      additional information in the symbol_match class (see below).
+//      The additional data is a pointer to some data associated with
+//      the matching symbol.
+//
+//      The actual set implementation is supplied by the SetT template
+//      parameter. By default, this uses the tst class (see tst.ipp).
+//
+//      Symbols are added into the symbol table statically using the
+//      construct:
+//
+//          sym = a, b, c, d ...;
+//
+//      where sym is a symbol table and a..d are strings. Example:
+//
+//          sym = "pineapple", "orange", "banana", "apple";
+//
+//      Alternatively, symbols may be added dynamically through the
+//      member functor 'add' (see symbol_inserter below). The member
+//      functor 'add' may be attached to a parser as a semantic action
+//      taking in a begin/end pair:
+//
+//          p[sym.add]
+//
+//      where p is a parser (and sym is a symbol table). On success,
+//      the matching portion of the input is added to the symbol table.
+//
+//      'add' may also be used to directly initialize data. Examples:
+//
+//          sym.add("hello", 1)("crazy", 2)("world", 3);
+//
+///////////////////////////////////////////////////////////////////////////////
+template
+<
+    typename T = int,
+    typename CharT = char,
+    typename SetT = impl::tst<T, CharT>
+>
+class symbols
+:   private SetT
+,   public parser<symbols<T, CharT, SetT> >
+{
+public:
+
+    typedef parser<symbols<T, CharT, SetT> > parser_base_t;
+    typedef symbols<T, CharT, SetT> self_t;
+    typedef self_t const& embed_t;
+    typedef T symbol_data_t;
+    typedef boost::reference_wrapper<T> symbol_ref_t;
+
+    symbols();
+    symbols(symbols const& other);
+    ~symbols();
+
+    symbols&
+    operator=(symbols const& other);
+
+    symbol_inserter<T, SetT> const&
+    operator=(CharT const* str);
+
+    template <typename ScannerT>
+    struct result
+    {
+        typedef typename match_result<ScannerT, symbol_ref_t>::type type;
+    };
+
+    template <typename ScannerT>
+    typename parser_result<self_t, ScannerT>::type
+    parse_main(ScannerT const& scan) const
+    {
+        typedef typename ScannerT::iterator_t iterator_t;
+        iterator_t first = scan.first;
+        typename SetT::search_info result = SetT::find(scan);
+
+        if (result.data)
+            return scan.
+                create_match(
+                    result.length,
+                    symbol_ref_t(*result.data),
+                    first,
+                    scan.first);
+        else
+            return scan.no_match();
+    }
+
+    template <typename ScannerT>
+    typename parser_result<self_t, ScannerT>::type
+    parse(ScannerT const& scan) const
+    {
+        typedef typename parser_result<self_t, ScannerT>::type result_t;
+        return impl::implicit_lexeme_parse<result_t>
+            (*this, scan, scan);
+    }
+
+    template < typename ScannerT >
+    T* find(ScannerT const& scan) const
+    { return SetT::find(scan).data; }
+
+    symbol_inserter<T, SetT> const add;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Symbol table utilities
+//
+//  add
+//
+//      adds a symbol 'sym' (string) to a symbol table 'table' plus an
+//      optional data 'data' associated with the symbol. Returns a pointer to
+//      the data associated with the symbol or NULL if add failed (e.g. when
+//      the symbol is already added before).
+//
+//  find
+//
+//      finds a symbol 'sym' (string) from a symbol table 'table'. Returns a
+//      pointer to the data associated with the symbol or NULL if not found
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T, typename CharT, typename SetT>
+T*  add(symbols<T, CharT, SetT>& table, CharT const* sym, T const& data = T());
+
+template <typename T, typename CharT, typename SetT>
+T*  find(symbols<T, CharT, SetT> const& table, CharT const* sym);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  symbol_inserter class
+//
+//      The symbols class holds an instance of this class named 'add'.
+//      This can be called directly just like a member function,
+//      passing in a first/last iterator and optional data:
+//
+//          sym.add(first, last, data);
+//
+//      Or, passing in a C string and optional data:
+//
+//          sym.add(c_string, data);
+//
+//      where sym is a symbol table. The 'data' argument is optional.
+//      This may also be used as a semantic action since it conforms
+//      to the action interface (see action.hpp):
+//
+//          p[sym.add]
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename T, typename SetT>
+class symbol_inserter
+{
+public:
+
+    symbol_inserter(SetT& set_)
+    : set(set_) {}
+
+    template <typename IteratorT>
+    symbol_inserter const&
+    operator()(IteratorT first, IteratorT const& last, T const& data = T()) const
+    {
+        set.add(first, last, data);
+        return *this;
+    }
+
+    template <typename CharT>
+    symbol_inserter const&
+    operator()(CharT const* str, T const& data = T()) const
+    {
+        CharT const* last = str;
+        while (*last)
+            last++;
+        set.add(str, last, data);
+        return *this;
+    }
+
+    template <typename CharT>
+    symbol_inserter const&
+    operator,(CharT const* str) const
+    {
+        CharT const* last = str;
+        while (*last)
+            last++;
+        set.add(str, last, T());
+        return *this;
+    }
+
+private:
+
+    SetT& set;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#include <boost/spirit/symbols/impl/symbols.ipp>
+#endif
diff --git a/boost/boost/spirit/utility.hpp b/boost/boost/spirit/utility.hpp
new file mode 100644 (file)
index 0000000..6fdf7ba
--- /dev/null
@@ -0,0 +1,41 @@
+/*=============================================================================
+    Copyright (c) 1998-2003 Joel de Guzman
+    Copyright (c) 2001-2003 Daniel Nuffer
+    Copyright (c) 2001-2003 Hartmut Kaiser
+    Copyright (c) 2002-2003 Martin Wille
+    Copyright (c) 2002 Juan Carlos Arevalo-Baeza
+    Copyright (c) 2002 Raghavendra Satish
+    Copyright (c) 2002 Jeff Westfahl
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_UTILITY_MAIN_HPP)
+#define BOOST_SPIRIT_UTILITY_MAIN_HPP
+
+#include <boost/spirit/version.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Master header for Spirit.Utilities
+//
+///////////////////////////////////////////////////////////////////////////////
+
+// Utility.Parsers
+#include <boost/spirit/utility/chset.hpp>
+#include <boost/spirit/utility/chset_operators.hpp>
+#include <boost/spirit/utility/escape_char.hpp>
+#include <boost/spirit/utility/functor_parser.hpp>
+#include <boost/spirit/utility/loops.hpp>
+#include <boost/spirit/utility/confix.hpp>
+#include <boost/spirit/utility/lists.hpp>
+#include <boost/spirit/utility/distinct.hpp>
+
+// Utility.Support
+#include <boost/spirit/utility/flush_multi_pass.hpp>
+#include <boost/spirit/utility/scoped_lock.hpp>
+
+
+#endif // !defined(BOOST_SPIRIT_UTILITY_MAIN_HPP)
diff --git a/boost/boost/spirit/utility/chset.hpp b/boost/boost/spirit/utility/chset.hpp
new file mode 100644 (file)
index 0000000..4273d1c
--- /dev/null
@@ -0,0 +1,183 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    Copyright (c) 2001-2003 Daniel Nuffer
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_CHSET_HPP
+#define BOOST_SPIRIT_CHSET_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/shared_ptr.hpp>
+#include <boost/spirit/core/primitives/primitives.hpp>
+#include <boost/spirit/utility/impl/chset/basic_chset.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+namespace utility { namespace impl {
+
+    // This is here because some compilers choke on out-of-line member
+    // template functions.  And we don't want to put the whole algorithm
+    // in the chset constructor in the class definition.
+    template <typename CharT, typename CharT2>
+    void construct_chset(boost::shared_ptr<basic_chset<CharT> >& ptr,
+            CharT2 const* definition);
+
+}} // namespace utility::impl
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  chset class
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT = char>
+class chset: public char_parser<chset<CharT> > {
+
+public:
+                    chset();
+                    chset(chset const& arg_);
+    explicit        chset(CharT arg_);
+    explicit        chset(anychar_parser arg_);
+    explicit        chset(nothing_parser arg_);
+    explicit        chset(chlit<CharT> const& arg_);
+    explicit        chset(range<CharT> const& arg_);
+    explicit        chset(negated_char_parser<chlit<CharT> > const& arg_);
+    explicit        chset(negated_char_parser<range<CharT> > const& arg_);
+
+                    template <typename CharT2>
+    explicit        chset(CharT2 const* definition)
+                    : ptr(new basic_chset<CharT>())
+                    {
+                        utility::impl::construct_chset(ptr, definition);
+                    }
+                    ~chset();
+
+    chset&          operator=(chset const& rhs);
+    chset&          operator=(CharT rhs);
+    chset&          operator=(anychar_parser rhs);
+    chset&          operator=(nothing_parser rhs);
+    chset&          operator=(chlit<CharT> const& rhs);
+    chset&          operator=(range<CharT> const& rhs);
+    chset&          operator=(negated_char_parser<chlit<CharT> > const& rhs);
+    chset&          operator=(negated_char_parser<range<CharT> > const& rhs);
+
+    void            set(range<CharT> const& arg_);
+    void            set(negated_char_parser<chlit<CharT> > const& arg_);
+    void            set(negated_char_parser<range<CharT> > const& arg_);
+
+    void            clear(range<CharT> const& arg_);
+    void            clear(negated_char_parser<range<CharT> > const& arg_);
+    bool            test(CharT ch) const;
+    chset&          inverse();
+    void            swap(chset& x);
+
+    chset&          operator|=(chset const& x);
+    chset&          operator&=(chset const& x);
+    chset&          operator-=(chset const& x);
+    chset&          operator^=(chset const& x);
+
+private:
+
+    boost::shared_ptr<basic_chset<CharT> > ptr;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Generator functions
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+chset_p(chlit<CharT> const& arg_)
+{ return chset<CharT>(arg_); }
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+chset_p(range<CharT> const& arg_)
+{ return chset<CharT>(arg_); }
+
+template <typename CharT>
+inline chset<CharT>
+chset_p(negated_char_parser<chlit<CharT> > const& arg_)
+{ return chset<CharT>(arg_); }
+
+template <typename CharT>
+inline chset<CharT>
+chset_p(negated_char_parser<range<CharT> > const& arg_)
+{ return chset<CharT>(arg_); }
+
+//////////////////////////////////
+inline chset<char>
+chset_p(char const* init)
+{ return chset<char>(init); }
+
+//////////////////////////////////
+inline chset<wchar_t>
+chset_p(wchar_t const* init)
+{ return chset<wchar_t>(init); }
+
+//////////////////////////////////
+inline chset<char>
+chset_p(char ch)
+{ return chset<char>(ch); }
+
+//////////////////////////////////
+inline chset<wchar_t>
+chset_p(wchar_t ch)
+{ return chset<wchar_t>(ch); }
+
+//////////////////////////////////
+inline chset<int>
+chset_p(int ch)
+{ return chset<int>(ch); }
+
+//////////////////////////////////
+inline chset<unsigned int>
+chset_p(unsigned int ch)
+{ return chset<unsigned int>(ch); }
+
+//////////////////////////////////
+inline chset<short>
+chset_p(short ch)
+{ return chset<short>(ch); }
+
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+//////////////////////////////////
+inline chset<unsigned short>
+chset_p(unsigned short ch)
+{ return chset<unsigned short>(ch); }
+#endif
+//////////////////////////////////
+inline chset<long>
+chset_p(long ch)
+{ return chset<long>(ch); }
+
+//////////////////////////////////
+inline chset<unsigned long>
+chset_p(unsigned long ch)
+{ return chset<unsigned long>(ch); }
+
+#ifdef BOOST_HAS_LONG_LONG
+//////////////////////////////////
+inline chset< ::boost::long_long_type>
+chset_p( ::boost::long_long_type ch)
+{ return chset< ::boost::long_long_type>(ch); }
+
+//////////////////////////////////
+inline chset< ::boost::ulong_long_type>
+chset_p( ::boost::ulong_long_type ch)
+{ return chset< ::boost::ulong_long_type>(ch); }
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif
+
+#include <boost/spirit/utility/impl/chset.ipp>
+#include <boost/spirit/utility/chset_operators.hpp>
diff --git a/boost/boost/spirit/utility/chset_operators.hpp b/boost/boost/spirit/utility/chset_operators.hpp
new file mode 100644 (file)
index 0000000..e1446ff
--- /dev/null
@@ -0,0 +1,398 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    Copyright (c) 2001-2003 Daniel Nuffer
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_CHSET_OPERATORS_HPP
+#define BOOST_SPIRIT_CHSET_OPERATORS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/utility/chset.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  chset free operators
+//
+//      Where a and b are both chsets, implements:
+//
+//          a | b, a & b, a - b, a ^ b
+//
+//      Where a is a chset, implements:
+//
+//          ~a
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator~(chset<CharT> const& a);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chset<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chset<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chset<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chset<CharT> const& a, chset<CharT> const& b);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  range <--> chset free operators
+//
+//      Where a is a chset and b is a range, and vice-versa, implements:
+//
+//          a | b, a & b, a - b, a ^ b
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chset<CharT> const& a, range<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chset<CharT> const& a, range<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chset<CharT> const& a, range<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chset<CharT> const& a, range<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(range<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(range<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(range<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(range<CharT> const& a, chset<CharT> const& b);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  chlit <--> chset free operators
+//
+//      Where a is a chset and b is a chlit, and vice-versa, implements:
+//
+//          a | b, a & b, a - b, a ^ b
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chset<CharT> const& a, chlit<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chset<CharT> const& a, chlit<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chset<CharT> const& a, chlit<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chset<CharT> const& a, chlit<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chlit<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chlit<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chlit<CharT> const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chlit<CharT> const& a, chset<CharT> const& b);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  negated_char_parser<range> <--> chset free operators
+//
+//      Where a is a chset and b is a range, and vice-versa, implements:
+//
+//          a | b, a & b, a - b, a ^ b
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chset<CharT> const& a, negated_char_parser<range<CharT> > const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chset<CharT> const& a, negated_char_parser<range<CharT> > const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chset<CharT> const& a, negated_char_parser<range<CharT> > const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chset<CharT> const& a, negated_char_parser<range<CharT> > const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(negated_char_parser<range<CharT> > const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(negated_char_parser<range<CharT> > const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(negated_char_parser<range<CharT> > const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(negated_char_parser<range<CharT> > const& a, chset<CharT> const& b);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  negated_char_parser<chlit> <--> chset free operators
+//
+//      Where a is a chset and b is a chlit, and vice-versa, implements:
+//
+//          a | b, a & b, a - b, a ^ b
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chset<CharT> const& a, negated_char_parser<chlit<CharT> > const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chset<CharT> const& a, negated_char_parser<chlit<CharT> > const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chset<CharT> const& a, negated_char_parser<chlit<CharT> > const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chset<CharT> const& a, negated_char_parser<chlit<CharT> > const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(negated_char_parser<chlit<CharT> > const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(negated_char_parser<chlit<CharT> > const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(negated_char_parser<chlit<CharT> > const& a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(negated_char_parser<chlit<CharT> > const& a, chset<CharT> const& b);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  literal primitives <--> chset free operators
+//
+//      Where a is a chset and b is a literal primitive,
+//      and vice-versa, implements:
+//
+//          a | b, a & b, a - b, a ^ b
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chset<CharT> const& a, CharT b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chset<CharT> const& a, CharT b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chset<CharT> const& a, CharT b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chset<CharT> const& a, CharT b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(CharT a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(CharT a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(CharT a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(CharT a, chset<CharT> const& b);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  anychar_parser <--> chset free operators
+//
+//      Where a is chset and b is a anychar_parser, and vice-versa, implements:
+//
+//          a | b, a & b, a - b, a ^ b
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chset<CharT> const& a, anychar_parser b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chset<CharT> const& a, anychar_parser b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chset<CharT> const& a, anychar_parser b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chset<CharT> const& a, anychar_parser b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(anychar_parser a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(anychar_parser a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(anychar_parser a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(anychar_parser a, chset<CharT> const& b);
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  nothing_parser <--> chset free operators
+//
+//      Where a is chset and b is nothing_parser, and vice-versa, implements:
+//
+//          a | b, a & b, a - b, a ^ b
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(chset<CharT> const& a, nothing_parser b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(chset<CharT> const& a, nothing_parser b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(chset<CharT> const& a, nothing_parser b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(chset<CharT> const& a, nothing_parser b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator|(nothing_parser a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator&(nothing_parser a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator-(nothing_parser a, chset<CharT> const& b);
+
+//////////////////////////////////
+template <typename CharT>
+chset<CharT>
+operator^(nothing_parser a, chset<CharT> const& b);
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif
+
+#include <boost/spirit/utility/impl/chset_operators.ipp>
diff --git a/boost/boost/spirit/utility/confix.hpp b/boost/boost/spirit/utility/confix.hpp
new file mode 100644 (file)
index 0000000..d6b48c2
--- /dev/null
@@ -0,0 +1,396 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_CONFIX_HPP
+#define BOOST_SPIRIT_CONFIX_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/config.hpp>
+#include <boost/spirit/meta/as_parser.hpp>
+#include <boost/spirit/core/composite/operators.hpp>
+#include <boost/spirit/utility/impl/confix.ipp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  confix_parser class
+//
+//      Parses a sequence of 3 sub-matches. This class may
+//      be used to parse structures, where the opening part is possibly
+//      contained in the expression part and the whole sequence is only
+//      parsed after seeing the closing part matching the first opening
+//      subsequence. Example: C-comments:
+//
+//      /* This is a C-comment */
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template<typename NestedT = non_nested, typename LexemeT = non_lexeme>
+struct confix_parser_gen;
+
+template <
+    typename OpenT, typename ExprT, typename CloseT, typename CategoryT,
+    typename NestedT = non_nested, typename LexemeT = non_lexeme
+>
+struct confix_parser :
+    public parser<
+        confix_parser<OpenT, ExprT, CloseT, CategoryT, NestedT, LexemeT>
+    >
+{
+    typedef
+        confix_parser<OpenT, ExprT, CloseT, CategoryT, NestedT, LexemeT>
+        self_t;
+
+    confix_parser(OpenT const &open_, ExprT const &expr_, CloseT const &close_)
+    : open(open_), expr(expr_), close(close_)
+    {}
+
+    template <typename ScannerT>
+    typename parser_result<self_t, ScannerT>::type
+    parse(ScannerT const& scan) const
+    {
+        return impl::confix_parser_type<CategoryT>::
+            parse(NestedT(), LexemeT(), *this, scan, open, expr, close);
+    }
+
+private:
+
+    typename as_parser<OpenT>::type::embed_t open;
+    typename as_parser<ExprT>::type::embed_t expr;
+    typename as_parser<CloseT>::type::embed_t close;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Confix parser generator template
+//
+//      This is a helper for generating a correct confix_parser<> from
+//      auxiliary parameters. There are the following types supported as
+//      parameters yet: parsers, single characters and strings (see
+//      as_parser).
+//
+//      If the body parser is an action_parser_category type parser (a parser
+//      with an attached semantic action) we have to do something special. This
+//      happens, if the user wrote something like:
+//
+//          confix_p(open, body[f], close)
+//
+//      where 'body' is the parser matching the body of the confix sequence
+//      and 'f' is a functor to be called after matching the body. If we would
+//      do nothing, the resulting code would parse the sequence as follows:
+//
+//          start >> (body[f] - close) >> close
+//
+//      what in most cases is not what the user expects.
+//      (If this _is_ what you've expected, then please use the confix_p
+//      generator function 'direct()', which will inhibit
+//      re-attaching the actor to the body parser).
+//
+//      To make the confix parser behave as expected:
+//
+//          start >> (body - close)[f] >> close
+//
+//      the actor attached to the 'body' parser has to be re-attached to the
+//      (body - close) parser construct, which will make the resulting confix
+//      parser 'do the right thing'. This refactoring is done by the help of
+//      the refactoring parsers (see the files refactoring.[hi]pp).
+//
+//      Additionally special care must be taken, if the body parser is a
+//      unary_parser_category type parser as
+//
+//          confix_p(open, *anychar_p, close)
+//
+//      which without any refactoring would result in
+//
+//          start >> (*anychar_p - close) >> close
+//
+//      and will not give the expected result (*anychar_p will eat up all the
+//      input up to the end of the input stream). So we have to refactor this
+//      into:
+//
+//          start >> *(anychar_p - close) >> close
+//
+//      what will give the correct result.
+//
+//      The case, where the body parser is a combination of the two mentioned
+//      problems (i.e. the body parser is a unary parser  with an attached
+//      action), is handled accordingly too:
+//
+//          confix_p(start, (*anychar_p)[f], end)
+//
+//      will be parsed as expected:
+//
+//          start >> (*(anychar_p - end))[f] >> end.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template<typename NestedT, typename LexemeT>
+struct confix_parser_gen
+{
+    // Generic generator function for creation of concrete confix parsers
+
+    template<typename StartT, typename ExprT, typename EndT>
+    confix_parser<
+        typename as_parser<StartT>::type,
+        typename as_parser<ExprT>::type,
+        typename as_parser<EndT>::type,
+        typename as_parser<ExprT>::type::parser_category_t,
+        NestedT,
+        LexemeT
+    >
+    operator()(
+        StartT const &start_, ExprT const &expr_, EndT const &end_) const
+    {
+        typedef typename as_parser<StartT>::type start_t;
+        typedef typename as_parser<ExprT>::type expr_t;
+        typedef typename as_parser<EndT>::type end_t;
+        typedef
+            typename as_parser<ExprT>::type::parser_category_t
+            parser_category_t;
+
+        typedef
+            confix_parser<
+                start_t, expr_t, end_t, parser_category_t, NestedT, LexemeT
+            >
+            return_t;
+
+        return return_t(
+            as_parser<StartT>::convert(start_),
+            as_parser<ExprT>::convert(expr_),
+            as_parser<EndT>::convert(end_)
+        );
+    }
+
+    // Generic generator function for creation of concrete confix parsers
+    // which have an action directly attached to the ExprT part of the
+    // parser (see comment above, no automatic refactoring)
+
+    template<typename StartT, typename ExprT, typename EndT>
+    confix_parser<
+        typename as_parser<StartT>::type,
+        typename as_parser<ExprT>::type,
+        typename as_parser<EndT>::type,
+        plain_parser_category,   // do not re-attach action
+        NestedT,
+        LexemeT
+    >
+    direct(StartT const &start_, ExprT const &expr_, EndT const &end_) const
+    {
+        typedef typename as_parser<StartT>::type start_t;
+        typedef typename as_parser<ExprT>::type expr_t;
+        typedef typename as_parser<EndT>::type end_t;
+        typedef plain_parser_category parser_category_t;
+
+        typedef
+            confix_parser<
+                start_t, expr_t, end_t, parser_category_t, NestedT, LexemeT
+            >
+            return_t;
+
+        return return_t(
+            as_parser<StartT>::convert(start_),
+            as_parser<ExprT>::convert(expr_),
+            as_parser<EndT>::convert(end_)
+        );
+    }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Predefined non_nested confix parser generators
+//
+///////////////////////////////////////////////////////////////////////////////
+
+const confix_parser_gen<non_nested, non_lexeme> confix_p =
+    confix_parser_gen<non_nested, non_lexeme>();
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Comments are special types of confix parsers
+//
+//      Comment parser generator template. This is a helper for generating a
+//      correct confix_parser<> from auxiliary parameters, which is able to
+//      parse comment constructs: (StartToken >> Comment text >> EndToken).
+//
+//      There are the following types supported as parameters yet: parsers,
+//      single characters and strings (see as_parser).
+//
+//      There are two diffenerent predefined comment parser generators
+//      (comment_p and comment_nest_p, see below), which may be used for
+//      creating special comment parsers in two different ways.
+//
+//      If these are used with one parameter, a comment starting with the given
+//      first parser parameter up to the end of the line is matched. So for
+//      instance the following parser matches C++ style comments:
+//
+//          comment_p("//").
+//
+//      If these are used with two parameters, a comment starting with the
+//      first parser parameter up to the second parser parameter is matched.
+//      For instance a C style comment parser should be constrcuted as:
+//
+//          comment_p("/*", "*/").
+//
+//      Please note, that a comment is parsed implicitly as if the whole
+//      comment_p(...) statement were embedded into a lexeme_d[] directive.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template<typename NestedT>
+struct comment_parser_gen
+{
+    // Generic generator function for creation of concrete comment parsers
+    // from an open token. The newline parser eol_p is used as the
+    // closing token.
+
+    template<typename StartT>
+    confix_parser<
+        typename as_parser<StartT>::type,
+        kleene_star<anychar_parser>,
+        alternative<eol_parser, end_parser>,
+        unary_parser_category,          // there is no action to re-attach
+        NestedT,
+        is_lexeme                       // insert implicit lexeme_d[]
+    >
+    operator() (StartT const &start_) const
+    {
+        typedef typename as_parser<StartT>::type start_t;
+        typedef kleene_star<anychar_parser> expr_t;
+        typedef alternative<eol_parser, end_parser> end_t;
+        typedef unary_parser_category parser_category_t;
+
+        typedef
+            confix_parser<
+                start_t, expr_t, end_t, parser_category_t, NestedT, is_lexeme
+            >
+            return_t;
+
+        return return_t(
+            as_parser<StartT>::convert(start_),
+            *anychar_p,
+            eol_p | end_p
+        );
+    }
+
+    // Generic generator function for creation of concrete comment parsers
+    // from an open and a close tokens.
+
+    template<typename StartT, typename EndT>
+    confix_parser<
+        typename as_parser<StartT>::type,
+        kleene_star<anychar_parser>,
+        typename as_parser<EndT>::type,
+        unary_parser_category,          // there is no action to re-attach
+        NestedT,
+        is_lexeme                       // insert implicit lexeme_d[]
+    >
+    operator() (StartT const &start_, EndT const &end_) const
+    {
+        typedef typename as_parser<StartT>::type start_t;
+        typedef kleene_star<anychar_parser> expr_t;
+        typedef typename as_parser<EndT>::type end_t;
+        typedef unary_parser_category parser_category_t;
+
+        typedef
+            confix_parser<
+                start_t, expr_t, end_t, parser_category_t, NestedT, is_lexeme
+            >
+            return_t;
+
+        return return_t(
+            as_parser<StartT>::convert(start_),
+            *anychar_p,
+            as_parser<EndT>::convert(end_)
+        );
+    }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Predefined non_nested comment parser generator
+//
+///////////////////////////////////////////////////////////////////////////////
+
+const comment_parser_gen<non_nested> comment_p =
+    comment_parser_gen<non_nested>();
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  comment_nest_parser class
+//
+//      Parses a nested comments.
+//      Example: nested PASCAL-comments:
+//
+//      { This is a { nested } PASCAL-comment }
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template<typename OpenT, typename CloseT>
+struct comment_nest_parser:
+    public parser<comment_nest_parser<OpenT, CloseT> >
+{
+    typedef comment_nest_parser<OpenT, CloseT> self_t;
+
+    comment_nest_parser(OpenT const &open_, CloseT const &close_):
+        open(open_), close(close_)
+    {}
+
+    template<typename ScannerT>
+    typename parser_result<self_t, ScannerT>::type
+        parse(ScannerT const &scan) const
+    {
+        return do_parse(
+            open >> *(*this | (anychar_p - close)) >> close,
+            scan);
+    }
+
+private:
+    template<typename ParserT, typename ScannerT>
+    typename parser_result<self_t, ScannerT>::type
+        do_parse(ParserT const &p, ScannerT const &scan) const
+    {
+        return
+            impl::contiguous_parser_parse<
+                BOOST_DEDUCED_TYPENAME parser_result<ParserT, ScannerT>::type
+            >(p, scan, scan);
+    }
+
+    typename as_parser<OpenT>::type::embed_t open;
+    typename as_parser<CloseT>::type::embed_t close;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Predefined nested comment parser generator
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template<typename OpenT, typename CloseT>
+inline
+comment_nest_parser<
+    typename as_parser<OpenT>::type,
+    typename as_parser<CloseT>::type
+>
+    comment_nest_p(OpenT const &open, CloseT const &close)
+{
+    return
+        comment_nest_parser<
+            BOOST_DEDUCED_TYPENAME as_parser<OpenT>::type,
+            BOOST_DEDUCED_TYPENAME as_parser<CloseT>::type
+        >(
+            as_parser<OpenT>::convert(open),
+            as_parser<CloseT>::convert(close)
+        );
+}
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/boost/spirit/utility/distinct.hpp b/boost/boost/spirit/utility/distinct.hpp
new file mode 100644 (file)
index 0000000..4e1625f
--- /dev/null
@@ -0,0 +1,225 @@
+/*=============================================================================
+    Copyright (c) 1998-2003 Joel de Guzman
+    Copyright (c) 2003 Vaclav Vesely
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_DISTINCT_HPP)
+#define BOOST_SPIRIT_DISTINCT_HPP
+
+#include <boost/spirit/core/parser.hpp>
+#include <boost/spirit/core/primitives/primitives.hpp>
+#include <boost/spirit/core/composite/operators.hpp>
+#include <boost/spirit/core/composite/directives.hpp>
+#include <boost/spirit/core/composite/epsilon.hpp>
+#include <boost/spirit/core/non_terminal/rule.hpp>
+#include <boost/spirit/utility/chset.hpp>
+
+namespace boost {
+    namespace spirit {
+//-----------------------------------------------------------------------------
+// distinct_parser class
+
+template <typename CharT = char, typename TailT = chset<CharT> >
+class distinct_parser
+{
+public:
+    typedef
+        contiguous<
+            sequence<
+                chseq<CharT const*>,
+                negated_empty_match_parser<
+                    TailT
+                >
+            >
+        >
+            result_t;
+
+    distinct_parser()
+    :   tail(chset<CharT>())
+    {
+    }
+
+    explicit distinct_parser(parser<TailT> const & tail_)
+    :   tail(tail_.derived())
+    {
+    }
+
+    explicit distinct_parser(CharT const* letters)
+    :   tail(chset_p(letters))
+    {
+    }
+
+    result_t operator()(CharT const* str) const
+    {
+        return lexeme_d[chseq_p(str) >> ~epsilon_p(tail)];
+    }
+
+    TailT tail;
+};
+
+//-----------------------------------------------------------------------------
+// distinct_directive class
+
+template <typename CharT = char, typename TailT = chset<CharT> >
+class distinct_directive
+{
+public:
+    template<typename ParserT>
+    struct result {
+        typedef
+            contiguous<
+                sequence<
+                    ParserT,
+                    negated_empty_match_parser<
+                        TailT
+                    >
+                >
+            >
+                type;
+    };
+
+    distinct_directive()
+    :   tail(chset<CharT>())
+    {
+    }
+
+    explicit distinct_directive(CharT const* letters)
+    :   tail(chset_p(letters))
+    {
+    }
+
+    explicit distinct_directive(parser<TailT> const & tail_)
+    :   tail(tail_.derived())
+    {
+    }
+
+    template<typename ParserT>
+    typename result<typename as_parser<ParserT>::type>::type
+        operator[](ParserT const &subject) const
+    {
+        return
+            lexeme_d[as_parser<ParserT>::convert(subject) >> ~epsilon_p(tail)];
+    }
+
+    TailT tail;
+};
+
+//-----------------------------------------------------------------------------
+// dynamic_distinct_parser class
+
+template <typename ScannerT = scanner<> >
+class dynamic_distinct_parser
+{
+public:
+    typedef typename ScannerT::value_t char_t;
+
+    typedef
+        rule<
+            typename no_actions_scanner<
+                typename lexeme_scanner<ScannerT>::type
+            >::type
+        >
+            tail_t;
+
+    typedef
+        contiguous<
+            sequence<
+                chseq<char_t const*>,
+                negated_empty_match_parser<
+                    tail_t
+                >
+            >
+        >
+            result_t;
+
+    dynamic_distinct_parser()
+    :   tail(nothing_p)
+    {
+    }
+
+    template<typename ParserT>
+    explicit dynamic_distinct_parser(parser<ParserT> const & tail_)
+    :   tail(tail_.derived())
+    {
+    }
+
+    explicit dynamic_distinct_parser(char_t const* letters)
+    :   tail(chset_p(letters))
+    {
+    }
+
+    result_t operator()(char_t const* str) const
+    {
+        return lexeme_d[chseq_p(str) >> ~epsilon_p(tail)];
+    }
+
+    tail_t tail;
+};
+
+//-----------------------------------------------------------------------------
+// dynamic_distinct_directive class
+
+template <typename ScannerT = scanner<> >
+class dynamic_distinct_directive
+{
+public:
+    typedef typename ScannerT::value_t char_t;
+
+    typedef
+        rule<
+            typename no_actions_scanner<
+                typename lexeme_scanner<ScannerT>::type
+            >::type
+        >
+            tail_t;
+
+    template<typename ParserT>
+    struct result {
+        typedef
+            contiguous<
+                sequence<
+                    ParserT,
+                    negated_empty_match_parser<
+                        tail_t
+                    >
+                >
+            >
+                type;
+    };
+
+    dynamic_distinct_directive()
+    :   tail(nothing_p)
+    {
+    }
+
+    template<typename ParserT>
+    explicit dynamic_distinct_directive(parser<ParserT> const & tail_)
+    :   tail(tail_.derived())
+    {
+    }
+
+    explicit dynamic_distinct_directive(char_t const* letters)
+    :   tail(chset_p(letters))
+    {
+    }
+
+    template<typename ParserT>
+    typename result<typename as_parser<ParserT>::type>::type
+        operator[](ParserT const &subject) const
+    {
+        return
+            lexeme_d[as_parser<ParserT>::convert(subject) >> ~epsilon_p(tail)];
+    }
+
+    tail_t tail;
+};
+
+//-----------------------------------------------------------------------------
+    } // namespace spirit
+} // namespace boost
+
+#endif // !defined(BOOST_SPIRIT_DISTINCT_HPP)
diff --git a/boost/boost/spirit/utility/escape_char.hpp b/boost/boost/spirit/utility/escape_char.hpp
new file mode 100644 (file)
index 0000000..6adeece
--- /dev/null
@@ -0,0 +1,177 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Daniel Nuffer
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_ESCAPE_CHAR_HPP
+#define BOOST_SPIRIT_ESCAPE_CHAR_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <string>
+#include <iterator>
+#include <cctype>
+#include <boost/limits.hpp>
+
+#include <boost/spirit/utility/impl/escape_char.ipp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  escape_char_action class
+//
+//      Links an escape char parser with a user defined semantic action.
+//      The semantic action may be a function or a functor. A function
+//      should be compatible with the interface:
+//
+//          void f(CharT ch);
+//
+//      A functor should have a member operator() with a compatible signature
+//      as above. The matching character is passed into the function/functor.
+//      This is the default class that character parsers use when dealing with
+//      the construct:
+//
+//          p[f]
+//
+//      where p is a parser and f is a function or functor.
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename ParserT, typename ActionT,
+    unsigned long Flags, typename CharT
+>
+struct escape_char_action
+:   public unary<ParserT,
+        parser<escape_char_action<ParserT, ActionT, Flags, CharT> > >
+{
+    typedef escape_char_action
+        <ParserT, ActionT, Flags, CharT>        self_t;
+    typedef action_parser_category              parser_category_t;
+    typedef unary<ParserT, parser<self_t> >     base_t;
+
+    template <typename ScannerT>
+    struct result
+    {
+        typedef typename match_result<ScannerT, CharT>::type type;
+    };
+
+    escape_char_action(ParserT const& p, ActionT const& a)
+    : base_t(p), actor(a) {}
+
+    template <typename ScannerT>
+    typename parser_result<self_t, ScannerT>::type
+    parse(ScannerT const& scan) const
+    {
+        return impl::escape_char_action_parse<Flags, CharT>::
+            parse(scan, *this);
+    }
+
+    ActionT const& predicate() const { return actor; }
+
+private:
+
+    ActionT actor;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  escape_char_parser class
+//
+//      The escape_char_parser helps in conjunction with the escape_char_action
+//      template class (see above) in parsing escaped characters. There are two
+//      different variants of this parser: one for parsing C style escaped
+//      characters and one for parsing LEX style escaped characters.
+//
+//      The C style escaped character parser is generated, when the template
+//      parameter 'Flags' is equal to 'c_escapes' (a constant defined in the
+//      file impl/escape_char.ipp). This parser recognizes all valid C escape
+//      character sequences: '\t', '\b', '\f', '\n', '\r', '\"', '\'', '\\'
+//      and the numeric style escapes '\120' (octal) and '\x2f' (hexadecimal)
+//      and converts these to their character equivalent, for instance the
+//      sequence of a backslash and a 'b' is parsed as the character '\b'.
+//      All other escaped characters are rejected by this parser.
+//
+//      The LEX style escaped character parser is generated, when the template
+//      parameter 'Flags' is equal to 'lex_escapes' (a constant defined in the
+//      file impl/escape_char.ipp). This parser recognizes all the C style
+//      escaped character sequences (as described above) and additionally
+//      does not reject all other escape sequences. All not mentioned escape
+//      sequences are converted by the parser to the plain character, for
+//      instance '\a' will be parsed as 'a'.
+//
+//      All not escaped characters are parsed without modification.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <unsigned long Flags, typename CharT>
+struct escape_char_action_parser_gen;
+
+template <unsigned long Flags, typename CharT = char>
+struct escape_char_parser :
+    public parser<escape_char_parser<Flags, CharT> > {
+
+    // only the values c_escapes and lex_escapes are valid for Flags
+    BOOST_STATIC_ASSERT(Flags == c_escapes || Flags == lex_escapes);
+
+    typedef escape_char_parser<Flags, CharT> self_t;
+    typedef
+        escape_char_action_parser_gen<Flags, CharT>
+        action_parser_generator_t;
+
+    template <typename ScannerT>
+    struct result {
+
+        typedef typename match_result<ScannerT, CharT>::type type;
+    };
+
+    template <typename ActionT>
+    escape_char_action<self_t, ActionT, Flags, CharT>
+    operator[](ActionT const& actor) const
+    {
+        return escape_char_action<self_t, ActionT, Flags, CharT>(*this, actor);
+    }
+
+    template <typename ScannerT>
+    typename parser_result<self_t, ScannerT>::type
+    parse(ScannerT const &scan) const
+    {
+        return impl::escape_char_parse<CharT>::parse(scan, *this);
+    }
+};
+
+template <unsigned long Flags, typename CharT>
+struct escape_char_action_parser_gen {
+
+    template <typename ParserT, typename ActionT>
+    static escape_char_action<ParserT, ActionT, Flags, CharT>
+    generate (ParserT const &p, ActionT const &actor)
+    {
+        typedef
+            escape_char_action<ParserT, ActionT, Flags, CharT>
+            action_parser_t;
+        return action_parser_t(p, actor);
+    }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  predefined escape_char_parser objects
+//
+//      These objects should be used for generating correct escaped character
+//      parsers.
+//
+///////////////////////////////////////////////////////////////////////////////
+const escape_char_parser<lex_escapes> lex_escape_ch_p =
+    escape_char_parser<lex_escapes>();
+
+const escape_char_parser<c_escapes> c_escape_ch_p =
+    escape_char_parser<c_escapes>();
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/boost/spirit/utility/flush_multi_pass.hpp b/boost/boost/spirit/utility/flush_multi_pass.hpp
new file mode 100644 (file)
index 0000000..c33ea0a
--- /dev/null
@@ -0,0 +1,73 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Daniel Nuffer
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_FLUSH_MULTI_PASS_HPP
+#define BOOST_SPIRIT_FLUSH_MULTI_PASS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/core.hpp>
+#include <boost/spirit/iterator/multi_pass.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+    namespace impl {
+
+        template <typename T>
+        void flush_iterator(T &) {}
+
+        template <typename T1, typename T2, typename T3, typename T4>
+        void flush_iterator(boost::spirit::multi_pass<
+            T1, T2, T3, T4, boost::spirit::multi_pass_policies::std_deque> &i)
+        {
+            i.clear_queue();
+        }
+
+    }   // namespace impl
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  flush_multi_pass_parser
+    //
+    //      The flush_multi_pass_parser flushes an underlying
+    //      multi_pass_iterator during the normal parsing process. This may
+    //      be used at certain points during the parsing process, when it is
+    //      clear, that no backtracking is needed anymore and the input
+    //      gathered so far may be discarded.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    class flush_multi_pass_parser
+    :   public parser<flush_multi_pass_parser>
+    {
+    public:
+        typedef flush_multi_pass_parser this_t;
+
+        template <typename ScannerT>
+        typename parser_result<this_t, ScannerT>::type
+        parse(ScannerT const& scan) const
+        {
+            impl::flush_iterator(scan.first);
+            return scan.empty_match();
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  predefined flush_multi_pass_p object
+    //
+    //      This object should may used to flush a multi_pass_iterator along
+    //      the way during the normal parsing process.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+
+    flush_multi_pass_parser const
+        flush_multi_pass_p = flush_multi_pass_parser();
+
+}} // namespace boost::spirit
+
+#endif // BOOST_SPIRIT_FLUSH_MULTI_PASS_HPP
diff --git a/boost/boost/spirit/utility/functor_parser.hpp b/boost/boost/spirit/utility/functor_parser.hpp
new file mode 100644 (file)
index 0000000..fe72d4e
--- /dev/null
@@ -0,0 +1,67 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Joel de Guzman
+    Copyright (c) 2002-2003 Juan Carlos Arevalo-Baeza
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_FUNCTOR_PARSER_HPP
+#define BOOST_SPIRIT_FUNCTOR_PARSER_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/core/parser.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  functor_parser class
+    //
+    //      Once a functor parser has been defined, you can build a real
+    //      parser from it by passing it to this class as the template
+    //      parameter.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template < class FunctorT >
+    struct functor_parser : public parser<functor_parser<FunctorT> >
+    {
+        FunctorT functor;
+
+        functor_parser(): functor() {}
+        functor_parser(FunctorT const& functor_): functor(functor_) {}
+
+        typedef typename FunctorT::result_t functor_result_t;
+        typedef functor_parser<FunctorT> self_t;
+
+        template <typename ScannerT>
+        struct result
+        {
+            typedef typename match_result<ScannerT, functor_result_t>::type
+            type;
+        };
+
+        template <typename ScannerT>
+        typename parser_result<self_t, ScannerT>::type
+        parse(ScannerT const& scan) const
+        {
+            typedef typename parser_result<self_t, ScannerT>::type result_t;
+            typedef typename ScannerT::value_t      value_t;
+            typedef typename ScannerT::iterator_t   iterator_t;
+
+            iterator_t const s(scan.first);
+            functor_result_t result;
+            std::ptrdiff_t len = functor(scan, result);
+
+            if (len < 0)
+                return scan.no_match();
+            else
+                return scan.create_match(std::size_t(len), result, s, scan.first);
+        }
+    };
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/boost/spirit/utility/impl/chset.ipp b/boost/boost/spirit/utility/impl/chset.ipp
new file mode 100644 (file)
index 0000000..91d11a4
--- /dev/null
@@ -0,0 +1,362 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    Copyright (c) 2001-2003 Daniel Nuffer
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_CHSET_IPP
+#define BOOST_SPIRIT_CHSET_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/limits.hpp>
+#include <boost/spirit/utility/chset.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  chset class
+//
+///////////////////////////////////////////////////////////////////////////////
+namespace utility { namespace impl {
+    template <typename CharT>
+    inline void
+    detach(boost::shared_ptr<basic_chset<CharT> >& ptr)
+    {
+        if (!ptr.unique())
+            ptr = boost::shared_ptr<basic_chset<CharT> >
+                (new basic_chset<CharT>(*ptr));
+    }
+
+    template <typename CharT>
+    inline void
+    detach_clear(boost::shared_ptr<basic_chset<CharT> >& ptr)
+    {
+        if (ptr.unique())
+            ptr->clear();
+        else
+            ptr.reset(new basic_chset<CharT>());
+    }
+
+    template <typename CharT, typename CharT2>
+    void construct_chset(boost::shared_ptr<basic_chset<CharT> >& ptr,
+            CharT2 const* definition)
+    {
+        CharT2 ch = *definition++;
+        while (ch)
+        {
+            CharT2 next = *definition++;
+            if (next == '-')
+            {
+                next = *definition++;
+                if (next == 0)
+                {
+                    ptr->set(ch);
+                    ptr->set('-');
+                    break;
+                }
+                ptr->set(ch, next);
+            }
+            else
+            {
+                ptr->set(ch);
+            }
+            ch = next;
+        }
+    }
+
+    //////////////////////////////////
+
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+    template <typename CharT, typename FakeT>
+    void chset_negated_set(boost::shared_ptr<basic_chset<CharT> > &ptr, chlit<CharT> const &ch,
+            FakeT)
+    {
+        if(ch.ch != (std::numeric_limits<CharT>::min)()) {
+            ptr->set((std::numeric_limits<CharT>::min)(), ch.ch - 1);
+        }
+        if(ch.ch != (std::numeric_limits<CharT>::max)()) {
+            ptr->set(ch.ch + 1, (std::numeric_limits<CharT>::max)());
+        }
+    }
+    
+    template <typename CharT, typename FakeT>
+    void chset_negated_set(boost::shared_ptr<basic_chset<CharT> > &ptr,
+            spirit::range<CharT> const &rng, FakeT)
+    {
+        if(rng.first != (std::numeric_limits<CharT>::min)()) {
+            ptr->set((std::numeric_limits<CharT>::min)(), rng.first - 1);
+        }
+        if(rng.last != (std::numeric_limits<CharT>::max)()) {
+            ptr->set(rng.last + 1, (std::numeric_limits<CharT>::max)());
+        }
+    }
+
+#endif // BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+//////////////////////////////////
+
+}} // namespace utility::impl
+
+template <typename CharT>
+inline chset<CharT>::chset()
+: ptr(new basic_chset<CharT>()) {}
+
+template <typename CharT>
+inline chset<CharT>::chset(chset const& arg_)
+: ptr(new basic_chset<CharT>(*arg_.ptr)) {}
+
+template <typename CharT>
+inline chset<CharT>::chset(CharT arg_)
+: ptr(new basic_chset<CharT>())
+{ ptr->set(arg_); }
+
+template <typename CharT>
+inline chset<CharT>::chset(anychar_parser /*arg*/)
+: ptr(new basic_chset<CharT>())
+{
+    ptr->set(
+        (std::numeric_limits<CharT>::min)(),
+        (std::numeric_limits<CharT>::max)()
+    );
+}
+
+template <typename CharT>
+inline chset<CharT>::chset(nothing_parser arg_)
+: ptr(new basic_chset<CharT>()) {}
+
+template <typename CharT>
+inline chset<CharT>::chset(chlit<CharT> const& arg_)
+: ptr(new basic_chset<CharT>())
+{ ptr->set(arg_.ch); }
+
+template <typename CharT>
+inline chset<CharT>::chset(range<CharT> const& arg_)
+: ptr(new basic_chset<CharT>())
+{ ptr->set(arg_.first, arg_.last); }
+
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+template <typename CharT>
+inline chset<CharT>::chset(negated_char_parser<chlit<CharT> > const& arg_)
+: ptr(new basic_chset<CharT>())
+{
+    set(arg_);
+}
+
+template <typename CharT>
+inline chset<CharT>::chset(negated_char_parser<range<CharT> > const& arg_)
+: ptr(new basic_chset<CharT>())
+{
+    set(arg_);
+}
+
+#endif // !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+template <typename CharT>
+inline chset<CharT>::~chset() {}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator=(chset const& rhs)
+{
+    ptr = rhs.ptr;
+    return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator=(CharT rhs)
+{
+    utility::impl::detach_clear(ptr);
+    ptr->set(rhs);
+    return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator=(anychar_parser rhs)
+{
+    utility::impl::detach_clear(ptr);
+    ptr->set(
+        (std::numeric_limits<CharT>::min)(),
+        (std::numeric_limits<CharT>::max)()
+    );
+    return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator=(nothing_parser rhs)
+{
+    utility::impl::detach_clear(ptr);
+    return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator=(chlit<CharT> const& rhs)
+{
+    utility::impl::detach_clear(ptr);
+    ptr->set(rhs.ch);
+    return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator=(range<CharT> const& rhs)
+{
+    utility::impl::detach_clear(ptr);
+    ptr->set(rhs.first, rhs.last);
+    return *this;
+}
+
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator=(negated_char_parser<chlit<CharT> > const& rhs)
+{
+    utility::impl::detach_clear(ptr);
+    set(rhs);
+    return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator=(negated_char_parser<range<CharT> > const& rhs)
+{
+    utility::impl::detach_clear(ptr);
+    set(rhs);
+    return *this;
+}
+
+#endif // !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+template <typename CharT>
+inline void
+chset<CharT>::set(range<CharT> const& arg_)
+{
+    utility::impl::detach(ptr);
+    ptr->set(arg_.first, arg_.last);
+}
+
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+template <typename CharT>
+inline void
+chset<CharT>::set(negated_char_parser<chlit<CharT> > const& arg_)
+{
+    utility::impl::detach(ptr);
+    
+    if(arg_.positive.ch != (std::numeric_limits<CharT>::min)()) {
+        ptr->set((std::numeric_limits<CharT>::min)(), arg_.positive.ch - 1);
+    }
+    if(arg_.positive.ch != (std::numeric_limits<CharT>::max)()) {
+        ptr->set(arg_.positive.ch + 1, (std::numeric_limits<CharT>::max)());
+    }
+}
+
+template <typename CharT>
+inline void
+chset<CharT>::set(negated_char_parser<range<CharT> > const& arg_)
+{
+    utility::impl::detach(ptr);
+    
+    if(arg_.positive.first != (std::numeric_limits<CharT>::min)()) {
+        ptr->set((std::numeric_limits<CharT>::min)(), arg_.positive.first - 1);
+    }
+    if(arg_.positive.last != (std::numeric_limits<CharT>::max)()) {
+        ptr->set(arg_.positive.last + 1, (std::numeric_limits<CharT>::max)());
+    }
+}
+
+#endif // !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+template <typename CharT>
+inline void
+chset<CharT>::clear(range<CharT> const& arg_)
+{
+    utility::impl::detach(ptr);
+    ptr->clear(arg_.first, arg_.last);
+}
+
+template <typename CharT>
+inline void
+chset<CharT>::clear(negated_char_parser<range<CharT> > const& arg_)
+{
+    utility::impl::detach(ptr);
+
+    if(arg_.positive.first != (std::numeric_limits<CharT>::min)()) {
+        ptr->clear((std::numeric_limits<CharT>::min)(), arg_.positive.first - 1);
+    }
+    if(arg_.positive.last != (std::numeric_limits<CharT>::max)()) {
+        ptr->clear(arg_.positive.last + 1, (std::numeric_limits<CharT>::max)());
+    }
+}
+
+template <typename CharT>
+inline bool
+chset<CharT>::test(CharT ch) const
+{ return ptr->test(ch); }
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::inverse()
+{
+    utility::impl::detach(ptr);
+    ptr->inverse();
+    return *this;
+}
+
+template <typename CharT>
+inline void
+chset<CharT>::swap(chset& x)
+{ ptr.swap(x.ptr); }
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator|=(chset const& x)
+{
+    utility::impl::detach(ptr);
+    *ptr |= *x.ptr;
+    return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator&=(chset const& x)
+{
+    utility::impl::detach(ptr);
+    *ptr &= *x.ptr;
+    return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator-=(chset const& x)
+{
+    utility::impl::detach(ptr);
+    *ptr -= *x.ptr;
+    return *this;
+}
+
+template <typename CharT>
+inline chset<CharT>&
+chset<CharT>::operator^=(chset const& x)
+{
+    utility::impl::detach(ptr);
+    *ptr ^= *x.ptr;
+    return *this;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/boost/spirit/utility/impl/chset/basic_chset.hpp b/boost/boost/spirit/utility/impl/chset/basic_chset.hpp
new file mode 100644 (file)
index 0000000..57413dc
--- /dev/null
@@ -0,0 +1,102 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    Copyright (c) 2001-2003 Daniel Nuffer
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_BASIC_CHSET_HPP
+#define BOOST_SPIRIT_BASIC_CHSET_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <bitset>
+#include <boost/spirit/utility/impl/chset/range_run.hpp>
+
+namespace boost { namespace spirit {
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  basic_chset: basic character set implementation using range_run
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename CharT>
+    class basic_chset
+    {
+    public:
+                            basic_chset();
+                            basic_chset(basic_chset const& arg_);
+
+        bool                test(CharT v) const;
+        void                set(CharT from, CharT to);
+        void                set(CharT c);
+        void                clear(CharT from, CharT to);
+        void                clear(CharT c);
+        void                clear();
+
+        void                inverse();
+        void                swap(basic_chset& x);
+
+        basic_chset&        operator|=(basic_chset const& x);
+        basic_chset&        operator&=(basic_chset const& x);
+        basic_chset&        operator-=(basic_chset const& x);
+        basic_chset&        operator^=(basic_chset const& x);
+
+        private: utility::impl::range_run<CharT> rr;
+    };
+
+    #if (CHAR_BIT == 8)
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  basic_chset: specializations for 8 bit chars using std::bitset
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename CharT>
+    class basic_chset_8bit {
+
+    public:
+                            basic_chset_8bit();
+                            basic_chset_8bit(basic_chset_8bit const& arg_);
+
+        bool                test(CharT v) const;
+        void                set(CharT from, CharT to);
+        void                set(CharT c);
+        void                clear(CharT from, CharT to);
+        void                clear(CharT c);
+        void                clear();
+
+        void                inverse();
+        void                swap(basic_chset_8bit& x);
+
+        basic_chset_8bit&   operator|=(basic_chset_8bit const& x);
+        basic_chset_8bit&   operator&=(basic_chset_8bit const& x);
+        basic_chset_8bit&   operator-=(basic_chset_8bit const& x);
+        basic_chset_8bit&   operator^=(basic_chset_8bit const& x);
+
+        private: std::bitset<256> bset;
+    };
+
+    /////////////////////////////////
+    template <>
+    class basic_chset<char>
+    : public basic_chset_8bit<char> {};
+
+    /////////////////////////////////
+    template <>
+    class basic_chset<signed char>
+    : public basic_chset_8bit<signed char> {};
+
+    /////////////////////////////////
+    template <>
+    class basic_chset<unsigned char>
+    : public basic_chset_8bit<unsigned char> {};
+
+#endif
+
+}} // namespace boost::spirit
+
+#endif
+
+#include <boost/spirit/utility/impl/chset/basic_chset.ipp>
diff --git a/boost/boost/spirit/utility/impl/chset/basic_chset.ipp b/boost/boost/spirit/utility/impl/chset/basic_chset.ipp
new file mode 100644 (file)
index 0000000..9370e3f
--- /dev/null
@@ -0,0 +1,241 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    Copyright (c) 2001-2003 Daniel Nuffer
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_BASIC_CHSET_IPP
+#define BOOST_SPIRIT_BASIC_CHSET_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <bitset>
+#include <boost/spirit/utility/impl/chset/basic_chset.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  basic_chset: character set implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline basic_chset<CharT>::basic_chset() {}
+
+//////////////////////////////////
+template <typename CharT>
+inline basic_chset<CharT>::basic_chset(basic_chset const& arg_)
+: rr(arg_.rr) {}
+
+//////////////////////////////////
+template <typename CharT>
+inline bool
+basic_chset<CharT>::test(CharT v) const
+{ return rr.test(v); }
+
+//////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset<CharT>::set(CharT from, CharT to)
+{ rr.set(utility::impl::range<CharT>(from, to)); }
+
+//////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset<CharT>::set(CharT c)
+{ rr.set(utility::impl::range<CharT>(c, c)); }
+
+//////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset<CharT>::clear(CharT from, CharT to)
+{ rr.clear(utility::impl::range<CharT>(from, to)); }
+
+//////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset<CharT>::clear()
+{ rr.clear(); }
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset<CharT>::inverse()
+{
+    basic_chset inv;
+    inv.set(
+        (std::numeric_limits<CharT>::min)(),
+        (std::numeric_limits<CharT>::max)()
+    );
+    inv -= *this;
+    swap(inv);
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset<CharT>::swap(basic_chset& x)
+{ rr.swap(x.rr); }
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset<CharT>&
+basic_chset<CharT>::operator|=(basic_chset<CharT> const& x)
+{
+    typedef typename utility::impl::range_run<CharT>::const_iterator const_iterator;
+    for (const_iterator iter = x.rr.begin(); iter != x.rr.end(); ++iter)
+        rr.set(*iter);
+    return *this;
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset<CharT>&
+basic_chset<CharT>::operator&=(basic_chset<CharT> const& x)
+{
+    basic_chset inv;
+    inv.set(
+        (std::numeric_limits<CharT>::min)(),
+        (std::numeric_limits<CharT>::max)()
+    );
+    inv -= x;
+    *this -= inv;
+    return *this;
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset<CharT>&
+basic_chset<CharT>::operator-=(basic_chset<CharT> const& x)
+{
+    typedef typename utility::impl::range_run<CharT>::const_iterator const_iterator;
+    for (const_iterator iter = x.rr.begin(); iter != x.rr.end(); ++iter)
+        rr.clear(*iter);
+    return *this;
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset<CharT>&
+basic_chset<CharT>::operator^=(basic_chset<CharT> const& x)
+{
+    basic_chset bma = x;
+    bma -= *this;
+    *this -= x;
+    *this |= bma;
+    return *this;
+}
+
+#if (CHAR_BIT == 8)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  basic_chset: specializations for 8 bit chars using std::bitset
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline basic_chset_8bit<CharT>::basic_chset_8bit() {}
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset_8bit<CharT>::basic_chset_8bit(basic_chset_8bit const& arg_)
+: bset(arg_.bset) {}
+
+/////////////////////////////////
+template <typename CharT>
+inline bool
+basic_chset_8bit<CharT>::test(CharT v) const
+{ return bset.test((unsigned char)v); }
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset_8bit<CharT>::set(CharT from, CharT to)
+{
+    for (int i = from; i <= to; ++i)
+        bset.set((unsigned char)i);
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset_8bit<CharT>::set(CharT c)
+{ bset.set((unsigned char)c); }
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset_8bit<CharT>::clear(CharT from, CharT to)
+{
+    for (int i = from; i <= to; ++i)
+        bset.reset((unsigned char)i);
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset_8bit<CharT>::clear(CharT c)
+{ bset.reset((unsigned char)c); }
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset_8bit<CharT>::clear()
+{ bset.reset(); }
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset_8bit<CharT>::inverse()
+{ bset.flip(); }
+
+/////////////////////////////////
+template <typename CharT>
+inline void
+basic_chset_8bit<CharT>::swap(basic_chset_8bit& x)
+{ std::swap(bset, x.bset); }
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset_8bit<CharT>&
+basic_chset_8bit<CharT>::operator|=(basic_chset_8bit const& x)
+{
+    bset |= x.bset;
+    return *this;
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset_8bit<CharT>&
+basic_chset_8bit<CharT>::operator&=(basic_chset_8bit const& x)
+{
+    bset &= x.bset;
+    return *this;
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset_8bit<CharT>&
+basic_chset_8bit<CharT>::operator-=(basic_chset_8bit const& x)
+{
+    bset &= ~x.bset;
+    return *this;
+}
+
+/////////////////////////////////
+template <typename CharT>
+inline basic_chset_8bit<CharT>&
+basic_chset_8bit<CharT>::operator^=(basic_chset_8bit const& x)
+{
+    bset ^= x.bset;
+    return *this;
+}
+
+#endif
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/boost/spirit/utility/impl/chset/range_run.hpp b/boost/boost/spirit/utility/impl/chset/range_run.hpp
new file mode 100644 (file)
index 0000000..2a9318f
--- /dev/null
@@ -0,0 +1,111 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_RANGE_RUN_HPP
+#define BOOST_SPIRIT_RANGE_RUN_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <vector>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace utility { namespace impl {
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  range class
+    //
+    //      Implements a closed range of values. This class is used in
+    //      the implementation of the range_run class.
+    //
+    //      { Low level implementation detail }
+    //      { Not to be confused with boost::spirit::range }
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename CharT>
+    struct range {
+
+                        range(CharT first, CharT last);
+
+        bool            is_valid() const;
+        bool            includes(CharT v) const;
+        bool            includes(range const& r) const;
+        bool            overlaps(range const& r) const;
+        void            merge(range const& r);
+
+        CharT first;
+        CharT last;
+    };
+
+    //////////////////////////////////
+    template <typename CharT>
+    struct range_char_compare {
+
+        bool operator()(range<CharT> const& x, const CharT y) const
+        { return x.first < y; }
+        
+        bool operator()(const CharT x, range<CharT> const& y) const
+        { return x < y.first; }
+    };
+
+    //////////////////////////////////
+    template <typename CharT>
+    struct range_compare {
+
+        bool operator()(range<CharT> const& x, range<CharT> const& y) const
+        { return x.first < y.first; }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  range_run
+    //
+    //      An implementation of a sparse bit (boolean) set. The set uses
+    //      a sorted vector of disjoint ranges. This class implements the
+    //      bare minimum essentials from which the full range of set
+    //      operators can be implemented. The set is constructed from
+    //      ranges. Internally, adjacent or overlapping ranges are
+    //      coalesced.
+    //
+    //      range_runs are very space-economical in situations where there
+    //      are lots of ranges and a few individual disjoint values.
+    //      Searching is O(log n) where n is the number of ranges.
+    //
+    //      { Low level implementation detail }
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename CharT>
+    class range_run {
+
+    public:
+
+        typedef range<CharT> range_t;
+        typedef std::vector<range_t> run_t;
+        typedef typename run_t::iterator iterator;
+        typedef typename run_t::const_iterator const_iterator;
+
+        void            swap(range_run& rr);
+        bool            test(CharT v) const;
+        void            set(range_t const& r);
+        void            clear(range_t const& r);
+        void            clear();
+
+        const_iterator  begin() const;
+        const_iterator  end() const;
+
+    private:
+
+        void            merge(iterator iter, range_t const& r);
+
+        run_t run;
+    };
+
+}}}} // namespace boost::spirit::utility::impl
+
+#endif
+
+#include <boost/spirit/utility/impl/chset/range_run.ipp>
diff --git a/boost/boost/spirit/utility/impl/chset/range_run.ipp b/boost/boost/spirit/utility/impl/chset/range_run.ipp
new file mode 100644 (file)
index 0000000..45491bc
--- /dev/null
@@ -0,0 +1,212 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_RANGE_RUN_IPP
+#define BOOST_SPIRIT_RANGE_RUN_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <algorithm> // for std::lower_bound
+#include <boost/spirit/core/assert.hpp> // for BOOST_SPIRIT_ASSERT
+#include <boost/spirit/utility/impl/chset/range_run.hpp>
+#include <boost/spirit/debug.hpp>
+#include <boost/limits.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+    namespace utility { namespace impl {
+
+        ///////////////////////////////////////////////////////////////////////
+        //
+        //  range class implementation
+        //
+        ///////////////////////////////////////////////////////////////////////
+        template <typename CharT>
+        inline range<CharT>::range(CharT first_, CharT last_)
+        : first(first_), last(last_) {}
+
+        //////////////////////////////////
+        template <typename CharT>
+        inline bool
+        range<CharT>::is_valid() const
+        { return first <= last; }
+
+        //////////////////////////////////
+        template <typename CharT>
+        inline bool
+        range<CharT>::includes(range const& r) const
+        { return (first <= r.first) && (last >= r.last); }
+
+        //////////////////////////////////
+        template <typename CharT>
+        inline bool
+        range<CharT>::includes(CharT v) const
+        { return (first <= v) && (last >= v); }
+
+        //////////////////////////////////
+        template <typename CharT>
+        inline bool
+        range<CharT>::overlaps(range const& r) const
+        {
+            CharT decr_first =
+                first == (std::numeric_limits<CharT>::min)() ? first : first-1;
+            CharT incr_last =
+                last == (std::numeric_limits<CharT>::max)() ? last : last+1;
+
+            return (decr_first <= r.last) && (incr_last >= r.first);
+        }
+
+        //////////////////////////////////
+        template <typename CharT>
+        inline void
+        range<CharT>::merge(range const& r)
+        {
+            first = (std::min)(first, r.first);
+            last = (std::max)(last, r.last);
+        }
+
+        ///////////////////////////////////////////////////////////////////////
+        //
+        //  range_run class implementation
+        //
+        ///////////////////////////////////////////////////////////////////////
+        template <typename CharT>
+        inline bool
+        range_run<CharT>::test(CharT v) const
+        {
+            if (!run.empty())
+            {
+                const_iterator iter =
+                    std::lower_bound(
+                        run.begin(), run.end(), v,
+                        range_char_compare<CharT>()
+                    );
+
+                if (iter != run.end() && iter->includes(v))
+                    return true;
+                if (iter != run.begin())
+                    return (--iter)->includes(v);
+            }
+            return false;
+        }
+
+        //////////////////////////////////
+        template <typename CharT>
+        inline void
+        range_run<CharT>::swap(range_run& rr)
+        { run.swap(rr.run); }
+
+        //////////////////////////////////
+        template <typename CharT>
+        void
+        range_run<CharT>::merge(iterator iter, range<CharT> const& r)
+        {
+            iter->merge(r);
+            iterator i = iter + 1;
+
+            while (i != run.end() && iter->overlaps(*i))
+                iter->merge(*i++);
+
+            run.erase(iter+1, i);
+        }
+
+        //////////////////////////////////
+        template <typename CharT>
+        void
+        range_run<CharT>::set(range<CharT> const& r)
+        {
+            BOOST_SPIRIT_ASSERT(r.is_valid());
+            if (!run.empty())
+            {
+                iterator iter =
+                    std::lower_bound(
+                        run.begin(), run.end(), r,
+                        range_compare<CharT>()
+                    );
+
+                if (iter != run.end() && iter->includes(r) ||
+                    ((iter != run.begin()) && (iter - 1)->includes(r)))
+                    return;
+
+                if (iter != run.begin() && (iter - 1)->overlaps(r))
+                    merge(--iter, r);
+
+                else if (iter != run.end() && iter->overlaps(r))
+                    merge(iter, r);
+
+                else
+                    run.insert(iter, r);
+            }
+            else
+            {
+                run.push_back(r);
+            }
+        }
+
+        //////////////////////////////////
+        template <typename CharT>
+        void
+        range_run<CharT>::clear(range<CharT> const& r)
+        {
+            BOOST_SPIRIT_ASSERT(r.is_valid());
+            if (!run.empty())
+            {
+                iterator iter =
+                    std::lower_bound(
+                        run.begin(), run.end(), r,
+                        range_compare<CharT>()
+                    );
+
+                iterator left_iter;
+
+                if ((iter != run.begin()) &&
+                        (left_iter = (iter - 1))->includes(r.first))
+                    if (left_iter->last > r.last)
+                    {
+                        CharT save_last = left_iter->last;
+                        left_iter->last = r.first-1;
+                        run.insert(iter, range<CharT>(r.last+1, save_last));
+                        return;
+                    }
+                    else
+                    {
+                        left_iter->last = r.first-1;
+                    }
+
+                iterator i = iter;
+                while (i != run.end() && r.includes(*i))
+                    i++;
+                if (i != run.end() && i->includes(r.last))
+                    i->first = r.last+1;
+                run.erase(iter, i);
+            }
+        }
+
+        //////////////////////////////////
+        template <typename CharT>
+        inline void
+        range_run<CharT>::clear()
+        { run.clear(); }
+
+        //////////////////////////////////
+        template <typename CharT>
+        inline typename range_run<CharT>::const_iterator
+        range_run<CharT>::begin() const
+        { return run.begin(); }
+
+        //////////////////////////////////
+        template <typename CharT>
+        inline typename range_run<CharT>::const_iterator
+        range_run<CharT>::end() const
+        { return run.end(); }
+
+    }} // namespace utility::impl
+
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/boost/spirit/utility/impl/chset_operators.ipp b/boost/boost/spirit/utility/impl/chset_operators.ipp
new file mode 100644 (file)
index 0000000..dddbcea
--- /dev/null
@@ -0,0 +1,662 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_CHSET_OPERATORS_IPP
+#define BOOST_SPIRIT_CHSET_OPERATORS_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/limits.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  chset free operators implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chset<CharT> const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) |= b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chset<CharT> const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) -= b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator~(chset<CharT> const& a)
+{
+    return chset<CharT>(a).inverse();
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chset<CharT> const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) &= b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) ^= b;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  range <--> chset free operators implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chset<CharT> const& a, range<CharT> const& b)
+{
+    chset<CharT> a_(a);
+    a_.set(b);
+    return a_;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chset<CharT> const& a, range<CharT> const& b)
+{
+    chset<CharT> a_(a);
+    if(b.first != (std::numeric_limits<CharT>::min)()) {
+        a_.clear(range<CharT>((std::numeric_limits<CharT>::min)(), b.first - 1));
+    }
+    if(b.last != (std::numeric_limits<CharT>::max)()) {
+        a_.clear(range<CharT>(b.last + 1, (std::numeric_limits<CharT>::max)()));
+    }
+    return a_;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chset<CharT> const& a, range<CharT> const& b)
+{
+    chset<CharT> a_(a);
+    a_.clear(b);
+    return a_;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, range<CharT> const& b)
+{
+    return a ^ chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(range<CharT> const& a, chset<CharT> const& b)
+{
+    chset<CharT> b_(b);
+    b_.set(a);
+    return b_;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(range<CharT> const& a, chset<CharT> const& b)
+{
+    chset<CharT> b_(b);
+    if(a.first != (std::numeric_limits<CharT>::min)()) {
+        b_.clear(range<CharT>((std::numeric_limits<CharT>::min)(), a.first - 1));
+    }
+    if(a.last != (std::numeric_limits<CharT>::max)()) {
+        b_.clear(range<CharT>(a.last + 1, (std::numeric_limits<CharT>::max)()));
+    }
+    return b_;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(range<CharT> const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) - b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(range<CharT> const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) ^ b;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  literal primitives <--> chset free operators implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chset<CharT> const& a, CharT b)
+{
+    return a | chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chset<CharT> const& a, CharT b)
+{
+    return a & chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chset<CharT> const& a, CharT b)
+{
+    return a - chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, CharT b)
+{
+    return a ^ chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(CharT a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) | b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(CharT a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) & b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(CharT a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) - b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(CharT a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) ^ b;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  chlit <--> chset free operators implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chset<CharT> const& a, chlit<CharT> const& b)
+{
+    return a | chset<CharT>(b.ch);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chset<CharT> const& a, chlit<CharT> const& b)
+{
+    return a & chset<CharT>(b.ch);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chset<CharT> const& a, chlit<CharT> const& b)
+{
+    return a - chset<CharT>(b.ch);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, chlit<CharT> const& b)
+{
+    return a ^ chset<CharT>(b.ch);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chlit<CharT> const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a.ch) | b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chlit<CharT> const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a.ch) & b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chlit<CharT> const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a.ch) - b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chlit<CharT> const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a.ch) ^ b;
+}
+
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  negated_char_parser <--> chset free operators implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT, typename ParserT>
+inline chset<CharT>
+operator|(chset<CharT> const& a, negated_char_parser<ParserT> const& b)
+{
+    return a | chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT>
+inline chset<CharT>
+operator&(chset<CharT> const& a, negated_char_parser<ParserT> const& b)
+{
+    return a & chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT>
+inline chset<CharT>
+operator-(chset<CharT> const& a, negated_char_parser<ParserT> const& b)
+{
+    return a - chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, negated_char_parser<ParserT> const& b)
+{
+    return a ^ chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT>
+inline chset<CharT>
+operator|(negated_char_parser<ParserT> const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) | b;
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT>
+inline chset<CharT>
+operator&(negated_char_parser<ParserT> const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) & b;
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT>
+inline chset<CharT>
+operator-(negated_char_parser<ParserT> const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) - b;
+}
+
+//////////////////////////////////
+template <typename CharT, typename ParserT>
+inline chset<CharT>
+operator^(negated_char_parser<ParserT> const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) ^ b;
+}
+
+#else // BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  negated_char_parser<range> <--> chset free operators implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chset<CharT> const& a, negated_char_parser<range<CharT> > const& b)
+{
+    return a | chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chset<CharT> const& a, negated_char_parser<range<CharT> > const& b)
+{
+    return a & chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chset<CharT> const& a, negated_char_parser<range<CharT> > const& b)
+{
+    return a - chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, negated_char_parser<range<CharT> > const& b)
+{
+    return a ^ chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(negated_char_parser<range<CharT> > const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) | b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(negated_char_parser<range<CharT> > const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) & b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(negated_char_parser<range<CharT> > const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) - b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(negated_char_parser<range<CharT> > const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) ^ b;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  negated_char_parser<chlit> <--> chset free operators implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chset<CharT> const& a, negated_char_parser<chlit<CharT> > const& b)
+{
+    return a | chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chset<CharT> const& a, negated_char_parser<chlit<CharT> > const& b)
+{
+    return a & chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chset<CharT> const& a, negated_char_parser<chlit<CharT> > const& b)
+{
+    return a - chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, negated_char_parser<chlit<CharT> > const& b)
+{
+    return a ^ chset<CharT>(b);
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(negated_char_parser<chlit<CharT> > const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) | b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(negated_char_parser<chlit<CharT> > const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) & b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(negated_char_parser<chlit<CharT> > const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) - b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(negated_char_parser<chlit<CharT> > const& a, chset<CharT> const& b)
+{
+    return chset<CharT>(a) ^ b;
+}
+
+#endif // BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  anychar_parser <--> chset free operators
+//
+//      Where a is chset and b is a anychar_parser, and vice-versa, implements:
+//
+//          a | b, a & b, a - b, a ^ b
+//
+///////////////////////////////////////////////////////////////////////////////
+namespace impl {
+
+    template <typename CharT>
+    inline boost::spirit::range<CharT> const&
+    full()
+    {
+        static boost::spirit::range<CharT> full_(
+            (std::numeric_limits<CharT>::min)(),
+            (std::numeric_limits<CharT>::max)());
+        return full_;
+    }
+
+    template <typename CharT>
+    inline boost::spirit::range<CharT> const&
+    empty()
+    {
+        static boost::spirit::range<CharT> empty_;
+        return empty_;
+    }
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chset<CharT> const&, anychar_parser)
+{
+    return chset<CharT>(impl::full<CharT>());
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chset<CharT> const& a, anychar_parser)
+{
+    return a;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chset<CharT> const&, anychar_parser)
+{
+    return chset<CharT>();
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, anychar_parser)
+{
+    return ~a;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(anychar_parser, chset<CharT> const& /*b*/)
+{
+    return chset<CharT>(impl::full<CharT>());
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(anychar_parser, chset<CharT> const& b)
+{
+    return b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(anychar_parser, chset<CharT> const& b)
+{
+    return ~b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(anychar_parser, chset<CharT> const& b)
+{
+    return ~b;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  nothing_parser <--> chset free operators implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(chset<CharT> const& a, nothing_parser)
+{
+    return a;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(chset<CharT> const& /*a*/, nothing_parser)
+{
+    return impl::empty<CharT>();
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(chset<CharT> const& a, nothing_parser)
+{
+    return a;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(chset<CharT> const& a, nothing_parser)
+{
+    return a;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator|(nothing_parser, chset<CharT> const& b)
+{
+    return b;
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator&(nothing_parser, chset<CharT> const& /*b*/)
+{
+    return impl::empty<CharT>();
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator-(nothing_parser, chset<CharT> const& /*b*/)
+{
+    return impl::empty<CharT>();
+}
+
+//////////////////////////////////
+template <typename CharT>
+inline chset<CharT>
+operator^(nothing_parser, chset<CharT> const& b)
+{
+    return b;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/boost/spirit/utility/impl/confix.ipp b/boost/boost/spirit/utility/impl/confix.ipp
new file mode 100644 (file)
index 0000000..1b1b5dc
--- /dev/null
@@ -0,0 +1,217 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_CONFIX_IPP
+#define BOOST_SPIRIT_CONFIX_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/meta/refactoring.hpp>
+#include <boost/spirit/core/composite/impl/directives.ipp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Types to distinguish nested and non-nested confix parsers
+//
+///////////////////////////////////////////////////////////////////////////////
+struct is_nested {};
+struct non_nested {};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Types to distinguish between confix parsers, which are implicitly lexems
+//  and without this behaviour
+//
+///////////////////////////////////////////////////////////////////////////////
+struct is_lexeme {};
+struct non_lexeme {};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  confix_parser_type class implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+namespace impl {
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  implicitly insert a lexeme_d into the parsing process
+
+    template <typename LexemeT>
+    struct select_confix_parse_lexeme;
+
+    template <>
+    struct select_confix_parse_lexeme<is_lexeme> {
+
+        template <typename ParserT, typename ScannerT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const& p, ScannerT const& scan)
+        {
+            typedef typename parser_result<ParserT, ScannerT>::type result_t;
+            return contiguous_parser_parse<result_t>(p, scan, scan);
+        }
+    };
+
+    template <>
+    struct select_confix_parse_lexeme<non_lexeme> {
+
+        template <typename ParserT, typename ScannerT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ParserT const& p, ScannerT const& scan)
+        {
+            return p.parse(scan);
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  parse confix sequences with refactoring
+
+    template <typename NestedT>
+    struct select_confix_parse_refactor;
+
+    template <>
+    struct select_confix_parse_refactor<is_nested> {
+
+        template <
+            typename LexemeT, typename ParserT, typename ScannerT,
+            typename OpenT, typename ExprT, typename CloseT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(
+            LexemeT const &, ParserT const& this_, ScannerT const& scan,
+            OpenT const& open, ExprT const& expr, CloseT const& close)
+        {
+            typedef refactor_action_gen<refactor_unary_gen<> > refactor_t;
+            const refactor_t refactor_body_d = refactor_t(refactor_unary_d);
+
+            return select_confix_parse_lexeme<LexemeT>::parse((
+                            open
+                        >>  (this_ | refactor_body_d[expr - close])
+                        >>  close
+                    ),  scan);
+        }
+    };
+
+    template <>
+    struct select_confix_parse_refactor<non_nested> {
+
+        template <
+            typename LexemeT, typename ParserT, typename ScannerT,
+            typename OpenT, typename ExprT, typename CloseT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(
+            LexemeT const &, ParserT const& /*this_*/, ScannerT const& scan,
+            OpenT const& open, ExprT const& expr, CloseT const& close)
+        {
+            typedef refactor_action_gen<refactor_unary_gen<> > refactor_t;
+            const refactor_t refactor_body_d = refactor_t(refactor_unary_d);
+
+            return select_confix_parse_lexeme<LexemeT>::parse((
+                            open
+                        >>  refactor_body_d[expr - close]
+                        >>  close
+                    ),  scan);
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  parse confix sequences without refactoring
+
+    template <typename NestedT>
+    struct select_confix_parse_no_refactor;
+
+    template <>
+    struct select_confix_parse_no_refactor<is_nested> {
+
+        template <
+            typename LexemeT, typename ParserT, typename ScannerT,
+            typename OpenT, typename ExprT, typename CloseT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(
+            LexemeT const &, ParserT const& this_, ScannerT const& scan,
+            OpenT const& open, ExprT const& expr, CloseT const& close)
+        {
+            return select_confix_parse_lexeme<LexemeT>::parse((
+                            open
+                        >>  (this_ | (expr - close))
+                        >>  close
+                    ),  scan);
+        }
+    };
+
+    template <>
+    struct select_confix_parse_no_refactor<non_nested> {
+
+        template <
+            typename LexemeT, typename ParserT, typename ScannerT,
+            typename OpenT, typename ExprT, typename CloseT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(
+            LexemeT const &, ParserT const & /*this_*/, ScannerT const& scan,
+            OpenT const& open, ExprT const& expr, CloseT const& close)
+        {
+            return select_confix_parse_lexeme<LexemeT>::parse((
+                            open
+                        >>  (expr - close)
+                        >>  close
+                    ),  scan);
+        }
+    };
+
+    // the refactoring is handled by the refactoring parsers, so here there
+    // is no need to pay attention to these issues.
+
+    template <typename CategoryT>
+    struct confix_parser_type {
+
+        template <
+            typename NestedT, typename LexemeT,
+            typename ParserT, typename ScannerT,
+            typename OpenT, typename ExprT, typename CloseT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(
+            NestedT const &, LexemeT const &lexeme,
+            ParserT const& this_, ScannerT const& scan,
+            OpenT const& open, ExprT const& expr, CloseT const& close)
+        {
+            return select_confix_parse_refactor<NestedT>::
+                parse(lexeme, this_, scan, open, expr, close);
+        }
+    };
+
+    template <>
+    struct confix_parser_type<plain_parser_category> {
+
+        template <
+            typename NestedT, typename LexemeT,
+            typename ParserT, typename ScannerT,
+            typename OpenT, typename ExprT, typename CloseT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(
+            NestedT const &, LexemeT const &lexeme,
+            ParserT const& this_, ScannerT const& scan,
+            OpenT const& open, ExprT const& expr, CloseT const& close)
+        {
+            return select_confix_parse_no_refactor<NestedT>::
+                parse(lexeme, this_, scan, open, expr, close);
+        }
+    };
+
+}   // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/boost/spirit/utility/impl/escape_char.ipp b/boost/boost/spirit/utility/impl/escape_char.ipp
new file mode 100644 (file)
index 0000000..ad8a59b
--- /dev/null
@@ -0,0 +1,215 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Daniel Nuffer
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_ESCAPE_CHAR_IPP
+#define BOOST_SPIRIT_ESCAPE_CHAR_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  escape_char_parser class
+//
+///////////////////////////////////////////////////////////////////////////////
+
+const unsigned long c_escapes = 1;
+const unsigned long lex_escapes = c_escapes << 1;
+
+//////////////////////////////////
+namespace impl {
+
+    //////////////////////////////////
+#if (defined(BOOST_MSVC) && (BOOST_MSVC <= 1310))
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+    template <unsigned long Flags, typename CharT>
+    struct escape_char_action_parse {
+
+        template <typename ParserT, typename ScannerT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ScannerT const& scan, ParserT const &p)
+        {
+            // Actually decode the escape char.
+            typedef CharT char_t;
+            typedef typename ScannerT::iterator_t iterator_t;
+            typedef typename parser_result<ParserT, ScannerT>::type result_t;
+
+            if (scan.first != scan.last) {
+
+                iterator_t save = scan.first;
+                if (result_t hit = p.subject().parse(scan)) {
+
+                    char_t unescaped;
+
+                    scan.first = save;
+                    if (*scan.first == '\\') {
+
+                        ++scan.first;
+                        switch (*scan.first) {
+                        case 'b':   unescaped = '\b';   ++scan.first; break;
+                        case 't':   unescaped = '\t';   ++scan.first; break;
+                        case 'n':   unescaped = '\n';   ++scan.first; break;
+                        case 'f':   unescaped = '\f';   ++scan.first; break;
+                        case 'r':   unescaped = '\r';   ++scan.first; break;
+                        case '"':   unescaped = '"';    ++scan.first; break;
+                        case '\'':  unescaped = '\'';   ++scan.first; break;
+                        case '\\':  unescaped = '\\';   ++scan.first; break;
+
+                        case 'x': case 'X':
+                            {
+                                char_t hex = 0;
+                                char_t const lim =
+                                    (std::numeric_limits<char_t>::max)() >> 4;
+
+                                ++scan.first;
+                                while (scan.first != scan.last)
+                                {
+                                    char_t c = *scan.first;
+                                    if (hex > lim && impl::isxdigit_(c))
+                                    {
+                                        // overflow detected
+                                        scan.first = save;
+                                        return scan.no_match();
+                                    }
+                                    if (impl::isdigit_(c))
+                                    {
+                                        hex <<= 4;
+                                        hex |= c - '0';
+                                        ++scan.first;
+                                    }
+                                    else if (impl::isxdigit_(c))
+                                    {
+                                        hex <<= 4;
+                                        c = impl::toupper_(c);
+                                        hex |= c - 'A' + 0xA;
+                                        ++scan.first;
+                                    }
+                                    else
+                                    {
+                                        break; // reached the end of the number
+                                    }
+                                }
+                                unescaped = hex;
+                            }
+                            break;
+
+                        case '0': case '1': case '2': case '3':
+                        case '4': case '5': case '6': case '7':
+                            {
+                                char_t oct = 0;
+                                char_t const lim =
+                                    (std::numeric_limits<char_t>::max)() >> 3;
+                                while (scan.first != scan.last)
+                                {
+                                    char_t c = *scan.first;
+                                    if (oct > lim && (c >= '0' && c <= '7'))
+                                    {
+                                        // overflow detected
+                                        scan.first = save;
+                                        return scan.no_match();
+                                    }
+
+                                    if (c >= '0' && c <= '7')
+                                    {
+                                        oct <<= 3;
+                                        oct |= c - '0';
+                                        ++scan.first;
+                                    }
+                                    else
+                                    {
+                                        break; // reached end of digits
+                                    }
+                                }
+                                unescaped = oct;
+                            }
+                            break;
+
+                        default:
+                            if (Flags & c_escapes)
+                            {
+                                // illegal C escape sequence
+                                scan.first = save;
+                                return scan.no_match();
+                            }
+                            else
+                            {
+                                unescaped = *scan.first;
+                                ++scan.first;
+                            }
+                            break;
+                        }
+                    }
+                    else {
+                        unescaped = *scan.first;
+                        ++scan.first;
+                    }
+
+                    scan.do_action(p.predicate(), unescaped, save, scan.first);
+                    return hit;
+                }
+            }
+            return scan.no_match(); // overflow detected
+        }
+    };
+#if (defined(BOOST_MSVC) && (BOOST_MSVC <= 1310))
+#pragma warning(pop)
+#endif
+
+    //////////////////////////////////
+    template <typename CharT>
+    struct escape_char_parse {
+
+        template <typename ScannerT, typename ParserT>
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ScannerT const &scan, ParserT const &/*p*/)
+        {
+            typedef
+                uint_parser<CharT, 8, 1,
+                    std::numeric_limits<CharT>::digits / 3 + 1
+                >
+                oct_parser_t;
+            typedef
+                uint_parser<CharT, 16, 1,
+                    std::numeric_limits<CharT>::digits / 4 + 1
+                >
+                hex_parser_t;
+
+            typedef alternative<difference<anychar_parser, chlit<CharT> >,
+                sequence<chlit<CharT>, alternative<alternative<oct_parser_t,
+                sequence<inhibit_case<chlit<CharT> >, hex_parser_t > >,
+                difference<difference<anychar_parser,
+                inhibit_case<chlit<CharT> > >, oct_parser_t > > > >
+                parser_t;
+
+            static parser_t p =
+                ( (anychar_p - chlit<CharT>(CharT('\\')))
+                | (chlit<CharT>(CharT('\\')) >>
+                    (  oct_parser_t()
+                     | as_lower_d[chlit<CharT>(CharT('x'))] >> hex_parser_t()
+                     | (anychar_p - as_lower_d[chlit<CharT>(CharT('x'))] - oct_parser_t())
+                    )
+                ));
+
+            BOOST_SPIRIT_DEBUG_TRACE_NODE(p,
+                (BOOST_SPIRIT_DEBUG_FLAGS & BOOST_SPIRIT_DEBUG_FLAGS_ESCAPE_CHAR) != 0);
+
+            return p.parse(scan);
+        }
+    };
+
+///////////////////////////////////////////////////////////////////////////////
+} // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/boost/spirit/utility/impl/lists.ipp b/boost/boost/spirit/utility/impl/lists.ipp
new file mode 100644 (file)
index 0000000..43662fb
--- /dev/null
@@ -0,0 +1,164 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_LISTS_IPP
+#define BOOST_SPIRIT_LISTS_IPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/meta/refactoring.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  list_parser_type class implementation
+//
+///////////////////////////////////////////////////////////////////////////////
+struct no_list_endtoken { typedef no_list_endtoken embed_t; };
+
+namespace impl {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Refactor the original list item parser
+//
+///////////////////////////////////////////////////////////////////////////////
+
+    //  match list with 'extended' syntax
+    template <typename EndT>
+    struct select_list_parse_refactor {
+
+        template <
+            typename ParserT, typename ScannerT,
+            typename ItemT, typename DelimT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ScannerT const& scan, ParserT const& /*p*/,
+            ItemT const &item, DelimT const &delim, EndT const &end)
+        {
+            typedef refactor_action_gen<refactor_unary_gen<> > refactor_t;
+            const refactor_t refactor_item_d = refactor_t(refactor_unary_d);
+
+            return (
+                    refactor_item_d[item - (end | delim)]
+                >> *(delim >> refactor_item_d[item - (end | delim)])
+                >> !(delim >> end)
+            ).parse(scan);
+        }
+    };
+
+    //  match list with 'normal' syntax (without an 'end' parser)
+    template <>
+    struct select_list_parse_refactor<no_list_endtoken> {
+
+        template <
+            typename ParserT, typename ScannerT,
+            typename ItemT, typename DelimT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ScannerT const& scan, ParserT const& /*p*/,
+            ItemT const &item, DelimT const &delim, no_list_endtoken const&)
+        {
+            typedef refactor_action_gen<refactor_unary_gen<> > refactor_t;
+            const refactor_t refactor_item_d = refactor_t(refactor_unary_d);
+
+            return (
+                    refactor_item_d[item - delim]
+                >> *(delim >> refactor_item_d[item - delim])
+            ).parse(scan);
+        }
+    };
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Do not refactor the original list item parser.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+    //  match list with 'extended' syntax
+    template <typename EndT>
+    struct select_list_parse_no_refactor {
+
+        template <
+            typename ParserT, typename ScannerT,
+            typename ItemT, typename DelimT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ScannerT const& scan, ParserT const& /*p*/,
+            ItemT const &item, DelimT const &delim, EndT const &end)
+        {
+            return (
+                    (item - (end | delim))
+                >> *(delim >> (item - (end | delim)))
+                >> !(delim >> end)
+            ).parse(scan);
+        }
+    };
+
+    //  match list with 'normal' syntax (without an 'end' parser)
+    template <>
+    struct select_list_parse_no_refactor<no_list_endtoken> {
+
+        template <
+            typename ParserT, typename ScannerT,
+            typename ItemT, typename DelimT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ScannerT const& scan, ParserT const& /*p*/,
+            ItemT const &item, DelimT const &delim, no_list_endtoken const&)
+        {
+            return (
+                    (item - delim)
+                >> *(delim >> (item - delim))
+            ).parse(scan);
+        }
+    };
+
+    // the refactoring is handled by the refactoring parsers, so here there
+    // is no need to pay attention to these issues.
+
+    template <typename CategoryT>
+    struct list_parser_type {
+
+        template <
+            typename ParserT, typename ScannerT,
+            typename ItemT, typename DelimT, typename EndT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ScannerT const& scan, ParserT const& p,
+              ItemT const &item, DelimT const &delim, EndT const &end)
+        {
+            return select_list_parse_refactor<EndT>::
+                parse(scan, p, item, delim, end);
+        }
+    };
+
+    template <>
+    struct list_parser_type<plain_parser_category> {
+
+        template <
+            typename ParserT, typename ScannerT,
+            typename ItemT, typename DelimT, typename EndT
+        >
+        static typename parser_result<ParserT, ScannerT>::type
+        parse(ScannerT const& scan, ParserT const& p,
+              ItemT const &item, DelimT const &delim, EndT const &end)
+        {
+            return select_list_parse_no_refactor<EndT>::
+                parse(scan, p, item, delim, end);
+        }
+    };
+
+}   // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif
+
diff --git a/boost/boost/spirit/utility/lists.hpp b/boost/boost/spirit/utility/lists.hpp
new file mode 100644 (file)
index 0000000..489f270
--- /dev/null
@@ -0,0 +1,335 @@
+/*=============================================================================
+    Copyright (c) 2002-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_LISTS_HPP
+#define BOOST_SPIRIT_LISTS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/config.hpp>
+#include <boost/spirit/meta/as_parser.hpp>
+#include <boost/spirit/core/parser.hpp>
+#include <boost/spirit/core/composite/composite.hpp>
+#include <boost/spirit/utility/impl/lists.ipp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  list_parser class
+//
+//      List parsers allow to parse constructs like
+//
+//          item >> *(delim >> item)
+//
+//      where 'item' is an auxiliary expression to parse and 'delim' is an
+//      auxiliary delimiter to parse.
+//
+//      The list_parser class also can match an optional closing delimiter
+//      represented by the 'end' parser at the end of the list:
+//
+//          item >> *(delim >> item) >> !end.
+//
+//      If ItemT is an action_parser_category type (parser with an attached
+//      semantic action) we have to do something special. This happens, if the
+//      user wrote something like:
+//
+//          list_p(item[f], delim)
+//
+//      where 'item' is the parser matching one item of the list sequence and
+//      'f' is a functor to be called after matching one item. If we would do
+//      nothing, the resulting code would parse the sequence as follows:
+//
+//          (item[f] - delim) >> *(delim >> (item[f] - delim))
+//
+//      what in most cases is not what the user expects.
+//      (If this _is_ what you've expected, then please use one of the list_p
+//      generator functions 'direct()', which will inhibit re-attaching
+//      the actor to the item parser).
+//
+//      To make the list parser behave as expected:
+//
+//          (item - delim)[f] >> *(delim >> (item - delim)[f])
+//
+//      the actor attached to the 'item' parser has to be re-attached to the
+//      *(item - delim) parser construct, which will make the resulting list
+//      parser 'do the right thing'.
+//
+//      Additionally special care must be taken, if the item parser is a
+//      unary_parser_category type parser as
+//
+//          list_p(*anychar_p, ',')
+//
+//      which without any refactoring would result in
+//
+//          (*anychar_p - ch_p(','))
+//              >> *( ch_p(',') >> (*anychar_p - ch_p(',')) )
+//
+//      and will not give the expected result (the first *anychar_p will eat up
+//      all the input up to the end of the input stream). So we have to
+//      refactor this into:
+//
+//          *(anychar_p - ch_p(','))
+//              >> *( ch_p(',') >> *(anychar_p - ch_p(',')) )
+//
+//      what will give the correct result.
+//
+//      The case, where the item parser is a combination of the two mentioned
+//      problems (i.e. the item parser is a unary parser  with an attached
+//      action), is handled accordingly too:
+//
+//          list_p((*anychar_p)[f], ',')
+//
+//      will be parsed as expected:
+//
+//          (*(anychar_p - ch_p(',')))[f]
+//              >> *( ch_p(',') >> (*(anychar_p - ch_p(',')))[f] ).
+//
+///////////////////////////////////////////////////////////////////////////////
+template <
+    typename ItemT, typename DelimT, typename EndT = no_list_endtoken,
+    typename CategoryT = plain_parser_category
+>
+struct list_parser :
+    public parser<list_parser<ItemT, DelimT, EndT, CategoryT> > {
+
+    typedef list_parser<ItemT, DelimT, EndT, CategoryT> self_t;
+    typedef CategoryT parser_category_t;
+
+    list_parser(ItemT const &item_, DelimT const &delim_,
+        EndT const& end_ = no_list_endtoken())
+    : item(item_), delim(delim_), end(end_)
+    {}
+
+    template <typename ScannerT>
+    typename parser_result<self_t, ScannerT>::type
+    parse(ScannerT const& scan) const
+    {
+        return impl::list_parser_type<CategoryT>
+            ::parse(scan, *this, item, delim, end);
+    }
+
+private:
+    typename as_parser<ItemT>::type::embed_t item;
+    typename as_parser<DelimT>::type::embed_t delim;
+    typename as_parser<EndT>::type::embed_t end;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  List parser generator template
+//
+//      This is a helper for generating a correct list_parser<> from
+//      auxiliary parameters. There are the following types supported as
+//      parameters yet: parsers, single characters and strings (see
+//      as_parser<> in meta/as_parser.hpp).
+//
+//      The list_parser_gen by itself can be used for parsing comma separated
+//      lists without item formatting:
+//
+//          list_p.parse(...)
+//              matches any comma separated list.
+//
+//      If list_p is used with one parameter, this parameter is used to match
+//      the delimiter:
+//
+//          list_p(';').parse(...)
+//              matches any semicolon separated list.
+//
+//      If list_p is used with two parameters, the first parameter is used to
+//      match the items and the second parameter matches the delimiters:
+//
+//          list_p(uint_p, ',').parse(...)
+//              matches comma separated unsigned integers.
+//
+//      If list_p is used with three parameters, the first parameter is used
+//      to match the items, the second one is used to match the delimiters and
+//      the third one is used to match an optional ending token sequence:
+//
+//          list_p(real_p, ';', eol_p).parse(...)
+//              matches a semicolon separated list of real numbers optionally
+//              followed by an end of line.
+//
+//      The list_p in the previous examples denotes the predefined parser
+//      generator, which should be used to define list parsers (see below).
+//
+///////////////////////////////////////////////////////////////////////////////
+
+template <typename CharT = char>
+struct list_parser_gen :
+    public list_parser<kleene_star<anychar_parser>, chlit<CharT> >
+{
+    typedef list_parser_gen<CharT> self_t;
+
+// construct the list_parser_gen object as an list parser for comma separated
+// lists without item formatting.
+    list_parser_gen()
+    : list_parser<kleene_star<anychar_parser>, chlit<CharT> >
+        (*anychar_p, chlit<CharT>(','))
+    {}
+
+// The following generator functions should be used under normal circumstances.
+// (the operator()(...) functions)
+
+    // Generic generator functions for creation of concrete list parsers, which
+    // support 'normal' syntax:
+    //
+    //      item >> *(delim >> item)
+    //
+    // If item isn't given, everything between two delimiters is matched.
+
+    template<typename DelimT>
+    list_parser<
+        kleene_star<anychar_parser>,
+        typename as_parser<DelimT>::type,
+        no_list_endtoken,
+        unary_parser_category      // there is no action to re-attach
+    >
+    operator()(DelimT const &delim_) const
+    {
+        typedef kleene_star<anychar_parser> item_t;
+        typedef typename as_parser<DelimT>::type delim_t;
+
+        typedef
+            list_parser<item_t, delim_t, no_list_endtoken, unary_parser_category>
+            return_t;
+
+        return return_t(*anychar_p, as_parser<DelimT>::convert(delim_));
+    }
+
+    template<typename ItemT, typename DelimT>
+    list_parser<
+        typename as_parser<ItemT>::type,
+        typename as_parser<DelimT>::type,
+        no_list_endtoken,
+        typename as_parser<ItemT>::type::parser_category_t
+    >
+    operator()(ItemT const &item_, DelimT const &delim_) const
+    {
+        typedef typename as_parser<ItemT>::type item_t;
+        typedef typename as_parser<DelimT>::type delim_t;
+        typedef list_parser<item_t, delim_t, no_list_endtoken,
+                BOOST_DEDUCED_TYPENAME item_t::parser_category_t>
+            return_t;
+
+        return return_t(
+            as_parser<ItemT>::convert(item_),
+            as_parser<DelimT>::convert(delim_)
+        );
+    }
+
+    // Generic generator function for creation of concrete list parsers, which
+    // support 'extended' syntax:
+    //
+    //      item >> *(delim >> item) >> !end
+
+    template<typename ItemT, typename DelimT, typename EndT>
+    list_parser<
+        typename as_parser<ItemT>::type,
+        typename as_parser<DelimT>::type,
+        typename as_parser<EndT>::type,
+        typename as_parser<ItemT>::type::parser_category_t
+    >
+    operator()(
+        ItemT const &item_, DelimT const &delim_, EndT const &end_) const
+    {
+        typedef typename as_parser<ItemT>::type item_t;
+        typedef typename as_parser<DelimT>::type delim_t;
+        typedef typename as_parser<EndT>::type end_t;
+
+        typedef list_parser<item_t, delim_t, end_t,
+                BOOST_DEDUCED_TYPENAME item_t::parser_category_t>
+            return_t;
+
+        return return_t(
+            as_parser<ItemT>::convert(item_),
+            as_parser<DelimT>::convert(delim_),
+            as_parser<EndT>::convert(end_)
+        );
+    }
+
+// The following functions should be used, if the 'item' parser has an attached
+// semantic action or is a unary_parser_category type parser and the structure
+// of the resulting list parser should _not_ be refactored during parser
+// construction (see comment above).
+
+    // Generic generator function for creation of concrete list parsers, which
+    // support 'normal' syntax:
+    //
+    //      item >> *(delim >> item)
+
+    template<typename ItemT, typename DelimT>
+    list_parser<
+        typename as_parser<ItemT>::type,
+        typename as_parser<DelimT>::type,
+        no_list_endtoken,
+        plain_parser_category        // inhibit action re-attachment
+    >
+    direct(ItemT const &item_, DelimT const &delim_) const
+    {
+        typedef typename as_parser<ItemT>::type item_t;
+        typedef typename as_parser<DelimT>::type delim_t;
+        typedef list_parser<item_t, delim_t, no_list_endtoken,
+                plain_parser_category>
+            return_t;
+
+        return return_t(
+            as_parser<ItemT>::convert(item_),
+            as_parser<DelimT>::convert(delim_)
+        );
+    }
+
+    // Generic generator function for creation of concrete list parsers, which
+    // support 'extended' syntax:
+    //
+    //      item >> *(delim >> item) >> !end
+
+    template<typename ItemT, typename DelimT, typename EndT>
+    list_parser<
+        typename as_parser<ItemT>::type,
+        typename as_parser<DelimT>::type,
+        typename as_parser<EndT>::type,
+        plain_parser_category        // inhibit action re-attachment
+    >
+    direct(
+        ItemT const &item_, DelimT const &delim_, EndT const &end_) const
+    {
+        typedef typename as_parser<ItemT>::type item_t;
+        typedef typename as_parser<DelimT>::type delim_t;
+        typedef typename as_parser<EndT>::type end_t;
+
+        typedef
+            list_parser<item_t, delim_t, end_t, plain_parser_category>
+            return_t;
+
+        return return_t(
+            as_parser<ItemT>::convert(item_),
+            as_parser<DelimT>::convert(delim_),
+            as_parser<EndT>::convert(end_)
+        );
+    }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Predefined list parser generator
+//
+//      The list_p parser generator can be used
+//        - by itself for parsing comma separated lists without item formatting
+//      or
+//        - for generating list parsers with auxiliary parser parameters
+//          for the 'item', 'delim' and 'end' subsequences.
+//      (see comment above)
+//
+///////////////////////////////////////////////////////////////////////////////
+const list_parser_gen<> list_p = list_parser_gen<>();
+
+///////////////////////////////////////////////////////////////////////////////
+}} // namespace boost::spirit
+
+#endif
diff --git a/boost/boost/spirit/utility/loops.hpp b/boost/boost/spirit/utility/loops.hpp
new file mode 100644 (file)
index 0000000..f42776a
--- /dev/null
@@ -0,0 +1,313 @@
+/*=============================================================================
+    Copyright (c) 1998-2003 Joel de Guzman
+    Copyright (c) 2002 Raghavendra Satish
+    Copyright (c) 2002 Jeff Westfahl
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_LOOPS_HPP)
+#define BOOST_SPIRIT_LOOPS_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/spirit/core/parser.hpp>
+#include <boost/spirit/core/composite/composite.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  fixed_loop class
+    //
+    //      This class takes care of the construct:
+    //
+    //          repeat_p (exact) [p]
+    //
+    //      where 'p' is a parser and 'exact' is the number of times to
+    //      repeat. The parser iterates over the input exactly 'exact' times.
+    //      The parse function fails if the parser does not match the input
+    //      exactly 'exact' times.
+    //
+    //      This class is parametizable and can accept constant arguments
+    //      (e.g. repeat_p (5) [p]) as well as references to variables (e.g.
+    //      repeat_p (ref (n)) [p]).
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename ParserT, typename ExactT>
+    class fixed_loop
+    : public unary<ParserT, parser <fixed_loop <ParserT, ExactT> > >
+    {
+    public:
+
+        typedef fixed_loop<ParserT, ExactT>     self_t;
+        typedef unary<ParserT, parser<self_t> >  base_t;
+
+        fixed_loop (ParserT const & subject, ExactT const & exact)
+        : base_t(subject), m_exact(exact) {}
+
+        template <typename ScannerT>
+        typename parser_result <self_t, ScannerT>::type
+        parse (ScannerT const & scan) const
+        {
+            typedef typename parser_result<self_t, ScannerT>::type result_t;
+            result_t hit = scan.empty_match();
+            std::size_t n = m_exact;
+
+            for (std::size_t i = 0; i < n; ++i)
+            {
+                if (result_t next = this->subject().parse(scan))
+                {
+                    scan.concat_match(hit, next);
+                }
+                else
+                {
+                    return scan.no_match();
+                }
+            }
+
+            return hit;
+        }
+
+        template <typename ScannerT>
+        struct result
+        {
+            typedef typename match_result<ScannerT, nil_t>::type type;
+        };
+
+    private:
+
+        ExactT m_exact;
+    };
+
+    ///////////////////////////////////////////////////////////////////////////////
+    //
+    //  finite_loop class
+    //
+    //      This class takes care of the construct:
+    //
+    //          repeat_p (min, max) [p]
+    //
+    //      where 'p' is a parser, 'min' and 'max' specifies the minimum and
+    //      maximum iterations over 'p'. The parser iterates over the input
+    //      at least 'min' times and at most 'max' times. The parse function
+    //      fails if the parser does not match the input at least 'min' times
+    //      and at most 'max' times.
+    //
+    //      This class is parametizable and can accept constant arguments
+    //      (e.g. repeat_p (5, 10) [p]) as well as references to variables
+    //      (e.g. repeat_p (ref (n1), ref (n2)) [p]).
+    //
+    ///////////////////////////////////////////////////////////////////////////////
+    template <typename ParserT, typename MinT, typename MaxT>
+    class finite_loop
+    : public unary<ParserT, parser<finite_loop<ParserT, MinT, MaxT> > >
+    {
+    public:
+
+        typedef finite_loop <ParserT, MinT, MaxT> self_t;
+        typedef unary<ParserT, parser<self_t> >   base_t;
+
+        finite_loop (ParserT const & subject, MinT const & min, MaxT const & max)
+        : base_t(subject), m_min(min), m_max(max) {}
+
+        template <typename ScannerT>
+        typename parser_result <self_t, ScannerT>::type
+        parse(ScannerT const & scan) const
+        {
+            BOOST_SPIRIT_ASSERT(m_min <= m_max);
+            typedef typename parser_result<self_t, ScannerT>::type result_t;
+            result_t hit = scan.empty_match();
+
+            std::size_t n1 = m_min;
+            std::size_t n2 = m_max;
+
+            for (std::size_t i = 0; i < n2; ++i)
+            {
+                typename ScannerT::iterator_t save = scan.first;
+                result_t next = this->subject().parse(scan);
+                if (!next)
+                {
+                    if (i >= n1)
+                    {
+                        scan.first = save;
+                        break;
+                    }
+                    else
+                    {
+                        return scan.no_match();
+                    }
+                }
+
+                scan.concat_match(hit, next);
+            }
+
+            return hit;
+        }
+
+        template <typename ScannerT>
+        struct result
+        {
+            typedef typename match_result<ScannerT, nil_t>::type type;
+        };
+
+    private:
+
+        MinT    m_min;
+        MaxT    m_max;
+    };
+
+    ///////////////////////////////////////////////////////////////////////////////
+    //
+    //  infinite_loop class
+    //
+    //      This class takes care of the construct:
+    //
+    //          repeat_p (min, more) [p]
+    //
+    //      where 'p' is a parser, 'min' is the minimum iteration over 'p'
+    //      and more specifies that the iteration should proceed
+    //      indefinitely. The parser iterates over the input at least 'min'
+    //      times and continues indefinitely until 'p' fails or all of the
+    //      input is parsed. The parse function fails if the parser does not
+    //      match the input at least 'min' times.
+    //
+    //      This class is parametizable and can accept constant arguments
+    //      (e.g. repeat_p (5, more) [p]) as well as references to variables
+    //      (e.g. repeat_p (ref (n), more) [p]).
+    //
+    ///////////////////////////////////////////////////////////////////////////////
+
+    struct more_t {};
+    more_t const more = more_t ();
+
+    template <typename ParserT, typename MinT>
+    class infinite_loop
+     : public unary<ParserT, parser<infinite_loop<ParserT, MinT> > >
+    {
+    public:
+
+        typedef infinite_loop <ParserT, MinT>   self_t;
+        typedef unary<ParserT, parser<self_t> > base_t;
+
+        infinite_loop (
+            ParserT const& subject,
+            MinT const& min,
+            more_t const&
+        )
+        : base_t(subject), m_min(min) {}
+
+        template <typename ScannerT>
+        typename parser_result <self_t, ScannerT>::type
+        parse(ScannerT const & scan) const
+        {
+            typedef typename parser_result<self_t, ScannerT>::type result_t;
+            result_t hit = scan.empty_match();
+            std::size_t n = m_min;
+
+            for (std::size_t i = 0; ; ++i)
+            {
+                typename ScannerT::iterator_t save = scan.first;
+                result_t next = this->subject().parse(scan);
+
+                if (!next)
+                {
+                    if (i >= n)
+                    {
+                        scan.first = save;
+                        break;
+                    }
+                    else
+                    {
+                        return scan.no_match();
+                    }
+                }
+
+                scan.concat_match(hit, next);
+            }
+
+            return hit;
+        }
+
+        template <typename ScannerT>
+        struct result
+        {
+            typedef typename match_result<ScannerT, nil_t>::type type;
+        };
+
+        private:
+
+        MinT m_min;
+    };
+
+    template <typename ExactT>
+    struct fixed_loop_gen
+    {
+        fixed_loop_gen (ExactT const & exact)
+        : m_exact (exact) {}
+
+        template <typename ParserT>
+        fixed_loop <ParserT, ExactT>
+        operator[](parser <ParserT> const & subject) const
+        {
+            return fixed_loop <ParserT, ExactT> (subject.derived (), m_exact);
+        }
+
+        ExactT m_exact;
+    };
+
+    namespace impl {
+
+        template <typename ParserT, typename MinT, typename MaxT>
+        struct loop_traits
+        {
+            typedef typename mpl::if_<
+                boost::is_same<MaxT, more_t>,
+                infinite_loop<ParserT, MinT>,
+                finite_loop<ParserT, MinT, MaxT>
+            >::type type;
+        };
+
+    } // namespace impl
+
+    template <typename MinT, typename MaxT>
+    struct nonfixed_loop_gen
+    {
+       nonfixed_loop_gen (MinT min, MaxT max)
+        : m_min (min), m_max (max) {}
+
+       template <typename ParserT>
+       typename impl::loop_traits<ParserT, MinT, MaxT>::type
+       operator[](parser <ParserT> const & subject) const
+       {
+           typedef typename impl::loop_traits<ParserT, MinT, MaxT>::type ret_t;
+           return ret_t(
+                subject.derived(),
+                m_min,
+                m_max);
+       }
+
+       MinT m_min;
+       MaxT m_max;
+    };
+
+    template <typename ExactT>
+    fixed_loop_gen <ExactT>
+    repeat_p(ExactT const & exact)
+    {
+        return fixed_loop_gen <ExactT> (exact);
+    }
+
+    template <typename MinT, typename MaxT>
+    nonfixed_loop_gen <MinT, MaxT>
+    repeat_p(MinT const & min, MaxT const & max)
+    {
+        return nonfixed_loop_gen <MinT, MaxT> (min, max);
+    }
+
+}} // namespace boost::spirit
+
+#endif // #if !defined(BOOST_SPIRIT_LOOPS_HPP)
diff --git a/boost/boost/spirit/utility/scoped_lock.hpp b/boost/boost/spirit/utility/scoped_lock.hpp
new file mode 100644 (file)
index 0000000..a22dd20
--- /dev/null
@@ -0,0 +1,108 @@
+/*=============================================================================
+    Copyright (c) 2003 Martin Wille
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+ =============================================================================*/
+#ifndef BOOST_SPIRIT_UTILITY_SCOPED_LOCK_HPP
+#define BOOST_SPIRIT_UTILITY_SCOPED_LOCK_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_SPIRIT_COMPOSITE_HPP)
+#include <boost/spirit/core/composite.hpp>
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit {
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    // scoped_lock_parser class
+    //
+    //      implements locking of a mutex during execution of
+    //      the parse method of an embedded parser
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename MutexT, typename ParserT>
+    struct scoped_lock_parser
+        : public unary< ParserT, parser< scoped_lock_parser<MutexT, ParserT> > >
+    {
+        typedef scoped_lock_parser<MutexT, ParserT> self_t;
+        typedef MutexT      mutex_t;
+        typedef ParserT     parser_t;
+
+        template <typename ScannerT>
+        struct result
+        {
+            typedef typename parser_result<parser_t, ScannerT>::type type;
+        };
+
+        scoped_lock_parser(mutex_t &m, parser_t const &p)
+            : unary< ParserT, parser< scoped_lock_parser<MutexT, ParserT> > >(p)
+            , mutex(m)
+        {}
+
+
+        template <typename ScannerT>
+        typename parser_result<self_t, ScannerT>::type
+        parse(ScannerT const &scan) const
+        {
+            typedef typename  mutex_t::scoped_lock scoped_lock_t;
+            scoped_lock_t lock(mutex);
+            return this->subject().parse(scan);
+        }
+
+        mutex_t &mutex;
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    // scoped_lock_parser_gen
+    //
+    //      generator for scoped_lock_parser objects
+    //      operator[] returns scoped_lock_parser according to its argument
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename MutexT>
+    struct scoped_lock_parser_gen
+    {
+        typedef MutexT mutex_t;
+        explicit scoped_lock_parser_gen(mutex_t &m) : mutex(m) {}
+
+        template<typename ParserT>
+        scoped_lock_parser
+        <
+            MutexT,
+            typename as_parser<ParserT>::type
+        >
+        operator[](ParserT const &p) const
+        {
+            typedef ::boost::spirit::as_parser<ParserT> as_parser_t;
+            typedef typename as_parser_t::type parser_t;
+
+            return scoped_lock_parser<mutex_t, parser_t>
+                (mutex, as_parser_t::convert(p));
+        }
+
+        mutex_t &mutex;
+    };
+
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    // scoped_lock_d parser directive
+    //
+    //      constructs a scoped_lock_parser generator from its argument
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename MutexT>
+    scoped_lock_parser_gen<MutexT>
+    scoped_lock_d(MutexT &mutex)
+    {
+        return scoped_lock_parser_gen<MutexT>(mutex);
+    }
+
+}} // namespace boost::spirit
+#endif // BOOST_SPIRIT_UTILITY_SCOPED_LOCK_HPP
diff --git a/boost/boost/spirit/version.hpp b/boost/boost/spirit/version.hpp
new file mode 100644 (file)
index 0000000..8d83ad0
--- /dev/null
@@ -0,0 +1,31 @@
+/*=============================================================================
+    Copyright (c) 2001-2003 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_VERSION_HPP)
+#define SPIRIT_VERSION_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  This checks, whether the used Boost library is at least V1.32.0
+//
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/version.hpp>
+
+#if BOOST_VERSION < 103200
+#error "Spirit V1.8.1 needs at least Boost V1.32.0 to compile successfully."
+#endif 
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  This is the version of the current Spirit distribution
+//
+///////////////////////////////////////////////////////////////////////////////
+#define SPIRIT_VERSION 0x1801
+#define SPIRIT_PIZZA_VERSION SPIRIT_FOUR_SEASONS  // :-)
+
+#endif // defined(SPIRIT_VERSION_HPP)