From 182dc1c6cbed6ac2bbe297f856650367e0f12ba7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Tue, 1 Mar 2011 21:57:03 +0100
Subject: Introduce Lua::Value helper.


diff --git a/3rdParty/Boost/src/boost/assign/assignment_exception.hpp b/3rdParty/Boost/src/boost/assign/assignment_exception.hpp
new file mode 100644
index 0000000..5079c3a
--- /dev/null
+++ b/3rdParty/Boost/src/boost/assign/assignment_exception.hpp
@@ -0,0 +1,43 @@
+// Boost.Assign library
+//
+//  Copyright Thorsten Ottosen 2003-2004. 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)
+//
+// For more information, see http://www.boost.org/libs/assign/
+//  
+ 
+
+#ifndef BOOST_ASSIGN_ASSIGNMENT_EXCEPTION_HPP
+#define BOOST_ASSIGN_ASSIGNMENT_EXCEPTION_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#include <exception>
+
+namespace boost
+{    
+    namespace assign
+    {
+        class assignment_exception : public std::exception
+        {
+        public:
+            assignment_exception( const char* _what ) 
+            : what_( _what )
+            { }
+        
+            virtual const char* what() const throw()
+            {
+                return what_;
+            }
+        
+        private:
+                const char* what_;
+        };
+    }
+}
+
+#endif
diff --git a/3rdParty/Boost/src/boost/assign/list_of.hpp b/3rdParty/Boost/src/boost/assign/list_of.hpp
new file mode 100644
index 0000000..6da444b
--- /dev/null
+++ b/3rdParty/Boost/src/boost/assign/list_of.hpp
@@ -0,0 +1,681 @@
+// Boost.Assign library
+//
+//  Copyright Thorsten Ottosen 2003-2004. 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)
+//
+// For more information, see http://www.boost.org/libs/assign/
+//
+
+
+#ifndef BOOST_ASSIGN_LIST_OF_HPP
+#define BOOST_ASSIGN_LIST_OF_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#include <boost/assign/assignment_exception.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <boost/config.hpp>
+#include <boost/tuple/tuple.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/detail/yes_no_type.hpp>
+#include <boost/type_traits/decay.hpp>
+#include <boost/type_traits/is_array.hpp>
+#include <boost/mpl/if.hpp>
+#include <deque>
+#include <cstddef>
+#include <utility>
+
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/iteration/local.hpp>
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+// BCB requires full type definition for is_array<> to work correctly.
+#include <boost/array.hpp>
+#endif
+
+namespace boost
+{
+
+// this here is necessary to avoid compiler error in <boost/array.hpp>
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+    template< class T, std::size_t sz >
+    class array;
+#endif    
+    
+namespace assign_detail
+{
+    /////////////////////////////////////////////////////////////////////////
+    // Part 0: common conversion code
+    /////////////////////////////////////////////////////////////////////////
+
+    template< class T >
+    struct assign_decay
+    {
+        //
+        // Add constness to array parameters
+        // to support string literals properly
+        //
+        typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            ::boost::is_array<T>,
+            ::boost::decay<const T>,
+            ::boost::decay<T> >::type type;
+    };
+    
+    template< class T, std::size_t sz >
+    type_traits::yes_type assign_is_array( const array<T,sz>* );
+    type_traits::no_type assign_is_array( ... );
+    template< class T, class U >
+    type_traits::yes_type assign_is_pair( const std::pair<T,U>* );
+    type_traits::no_type assign_is_pair( ... ); 
+
+
+    
+    struct array_type_tag
+    {
+    #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+    private:
+      char dummy_;  // BCB would by default use 8 bytes
+    #endif
+    };
+    struct adapter_type_tag
+    {
+    #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+    private:
+      char dummy_;  // BCB would by default use 8 bytes
+    #endif
+    };
+    struct pair_type_tag
+    {
+    #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+    private:
+      char dummy_;  // BCB would by default use 8 bytes
+    #endif
+    };
+    struct default_type_tag
+    {
+    #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+    private:
+      char dummy_;  // BCB would by default use 8 bytes
+    #endif
+    };
+
+
+    
+    template< class DerivedTAssign, class Iterator >
+    class converter
+    {
+    public: // Range operations
+        typedef Iterator iterator;
+        typedef Iterator const_iterator;
+        
+        iterator begin() const 
+        {
+            return static_cast<const DerivedTAssign*>(this)->begin();
+        }
+
+        iterator end() const
+        {
+            return static_cast<const DerivedTAssign*>(this)->end();
+        }
+        
+    public:
+
+        template< class Container >
+        Container convert_to_container() const
+        {
+            static Container* c = 0;
+            BOOST_STATIC_CONSTANT( bool, is_array_flag = sizeof( assign_detail::assign_is_array( c ) ) 
+                                   == sizeof( type_traits::yes_type ) );
+
+            typedef BOOST_DEDUCED_TYPENAME mpl::if_c< is_array_flag,
+                                                      array_type_tag,
+                                             default_type_tag >::type tag_type;
+
+            return convert<Container>( c, tag_type() );
+        }
+        
+    private:
+        
+        template< class Container >
+        Container convert( const Container*, default_type_tag ) const
+        {
+
+#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
+// old Dinkumware doesn't support iterator type as template
+            Container result;
+            iterator it  = begin(), 
+                     e   = end();
+            while( it != e )
+            {
+                result.insert( result.end(), *it );
+                ++it;
+            }
+            return result;
+#else
+            return Container( begin(), end() );
+#endif
+        }
+
+        template< class Array >
+        Array convert( const Array*, array_type_tag ) const
+        {
+            typedef BOOST_DEDUCED_TYPENAME Array::value_type value_type;
+
+#if BOOST_WORKAROUND(BOOST_INTEL, <= 910 ) || BOOST_WORKAROUND(__SUNPRO_CC, <= 0x580 )
+            BOOST_DEDUCED_TYPENAME remove_const<Array>::type ar;
+#else
+            Array ar;
+#endif            
+            const std::size_t sz = ar.size();
+            if( sz < static_cast<const DerivedTAssign*>(this)->size() )
+                throw assign::assignment_exception( "array initialized with too many elements" );
+            std::size_t n = 0; 
+            iterator i   = begin(), 
+                     e   = end();
+            for( ; i != e; ++i, ++n )
+                ar[n] = *i;
+            for( ; n < sz; ++n )
+                ar[n] = value_type();
+            return ar; 
+        }
+
+        template< class Adapter >
+        Adapter convert_to_adapter( const Adapter* = 0 ) const
+        {
+            Adapter a;
+            iterator i   = begin(), 
+                     e   = end();
+            for( ; i != e; ++i )
+                a.push( *i );
+            return a;
+        }
+
+    private:
+        struct adapter_converter;
+        friend struct adapter_converter;
+
+        struct adapter_converter
+        {
+            const converter& gl;
+            adapter_converter( const converter& this_ ) : gl( this_ )
+            {}
+
+            adapter_converter( const adapter_converter& r ) 
+            : gl( r.gl )
+            { }
+
+            template< class Adapter >
+            operator Adapter() const
+            {
+                return gl.convert_to_adapter<Adapter>();
+            }
+        };
+
+    public: 
+        template< class Container >
+        Container to_container( Container& c ) const
+        {
+            return convert( &c, default_type_tag() ); 
+        }
+
+        adapter_converter to_adapter() const
+        {
+            return adapter_converter( *this );
+        }
+
+        template< class Adapter >
+        Adapter to_adapter( Adapter& a ) const
+        {
+            return this->convert_to_adapter( &a ); 
+        }
+
+        template< class Array >
+        Array to_array( Array& a ) const
+        {
+            return convert( &a, array_type_tag() );
+        }
+    };
+
+    template< class T, class I, class Range >
+    inline bool operator==( const converter<T,I>& l, const Range& r )
+    {
+        return ::boost::iterator_range_detail::equal( l, r );
+    }
+
+    template< class T, class I, class Range >
+    inline bool operator==( const Range& l, const converter<T,I>& r )
+    {
+        return r == l;
+    }
+
+    template< class T, class I, class Range >
+    inline bool operator!=( const converter<T,I>& l, const Range& r )
+    {
+        return !( l == r );
+    }
+    
+    template< class T, class I, class Range >
+    inline bool operator!=( const Range& l, const converter<T,I>& r )
+    {
+        return !( l == r );
+    }
+
+    template< class T, class I, class Range >
+    inline bool operator<( const converter<T,I>& l, const Range& r )
+    {
+        return ::boost::iterator_range_detail::less_than( l, r );
+    }
+
+    template< class T, class I, class Range >
+    inline bool operator<( const Range& l, const converter<T,I>& r )
+    {
+        return ::boost::iterator_range_detail::less_than( l, r );
+    }
+
+    template< class T, class I, class Range >
+    inline bool operator>( const converter<T,I>& l, const Range& r )
+    {
+        return r < l;
+    }
+
+    template< class T, class I, class Range >
+    inline bool operator>( const Range& l, const converter<T,I>& r )
+    {
+        return r < l;
+    }
+
+    template< class T, class I, class Range >
+    inline bool operator<=( const converter<T,I>& l, const Range& r )
+    {
+        return !( l > r );
+    }
+
+    template< class T, class I, class Range >
+    inline bool operator<=( const Range& l, const converter<T,I>& r )
+    {
+        return !( l > r );
+    }
+    
+    template< class T, class I, class Range >
+    inline bool operator>=( const converter<T,I>& l, const Range& r )
+    {
+        return !( l < r );
+    }
+
+    template< class T, class I, class Range >
+    inline bool operator>=( const Range& l, const converter<T,I>& r )
+    {
+        return !( l < r );
+    }
+
+    template< class T, class I, class Elem, class Traits >
+    inline std::basic_ostream<Elem,Traits>& 
+    operator<<( std::basic_ostream<Elem, Traits>& Os,
+                const converter<T,I>& r )
+    {
+        return Os << ::boost::make_iterator_range( r.begin(), r.end() );
+    }
+    
+    /////////////////////////////////////////////////////////////////////////
+    // Part 1: flexible, but inefficient interface
+    /////////////////////////////////////////////////////////////////////////    
+
+    template< class T > 
+    class generic_list : 
+        public converter< generic_list< BOOST_DEDUCED_TYPENAME assign_decay<T>::type >,
+                          BOOST_DEDUCED_TYPENAME std::deque<BOOST_DEDUCED_TYPENAME 
+                                                            assign_decay<T>::type>::iterator >
+    {
+        typedef BOOST_DEDUCED_TYPENAME assign_decay<T>::type Ty;
+        typedef std::deque<Ty>  impl_type;
+        mutable impl_type       values_;
+        
+    public:
+        typedef BOOST_DEDUCED_TYPENAME impl_type::iterator         iterator;
+        typedef iterator                                           const_iterator;
+        typedef BOOST_DEDUCED_TYPENAME impl_type::value_type       value_type;
+        typedef BOOST_DEDUCED_TYPENAME impl_type::size_type        size_type;
+        typedef BOOST_DEDUCED_TYPENAME impl_type::difference_type  difference_type;
+        
+    public:
+        iterator begin() const       { return values_.begin(); }
+        iterator end() const         { return values_.end(); }
+        bool empty() const           { return values_.empty(); }
+        size_type size() const       { return values_.size(); }
+        
+    private:
+        void push_back( value_type r ) { values_.push_back( r ); }
+        
+    public:
+        generic_list& operator,( const Ty& u )
+        {
+            this->push_back( u ); 
+            return *this;
+        }
+
+        generic_list& operator()()
+        {
+            this->push_back( Ty() );
+            return *this;
+        }
+
+        generic_list& operator()( const Ty& u )
+        {
+            this->push_back( u );
+            return *this;
+        }
+        
+       
+#ifndef BOOST_ASSIGN_MAX_PARAMS // use user's value
+#define BOOST_ASSIGN_MAX_PARAMS 5
+#endif        
+#define BOOST_ASSIGN_MAX_PARAMETERS (BOOST_ASSIGN_MAX_PARAMS - 1) 
+#define BOOST_ASSIGN_PARAMS1(n) BOOST_PP_ENUM_PARAMS(n, class U)
+#define BOOST_ASSIGN_PARAMS2(n) BOOST_PP_ENUM_BINARY_PARAMS(n, U, const& u)
+#define BOOST_ASSIGN_PARAMS3(n) BOOST_PP_ENUM_PARAMS(n, u)
+#define BOOST_ASSIGN_PARAMS4(n) BOOST_PP_ENUM_PARAMS(n, U)
+#define BOOST_ASSIGN_PARAMS2_NO_REF(n) BOOST_PP_ENUM_BINARY_PARAMS(n, U, u)
+
+#define BOOST_PP_LOCAL_LIMITS (1, BOOST_ASSIGN_MAX_PARAMETERS)
+#define BOOST_PP_LOCAL_MACRO(n) \
+    template< class U, BOOST_ASSIGN_PARAMS1(n) > \
+    generic_list& operator()(U const& u, BOOST_ASSIGN_PARAMS2(n) ) \
+    { \
+        this->push_back( Ty(u, BOOST_ASSIGN_PARAMS3(n))); \
+        return *this; \
+    } \
+    /**/
+        
+#include BOOST_PP_LOCAL_ITERATE()
+
+        
+        template< class U >
+        generic_list& repeat( std::size_t sz, U u )
+        {
+            std::size_t i = 0;
+            while( i++ != sz )
+                this->push_back( u );
+            return *this;
+        }
+        
+        template< class Nullary_function >
+        generic_list& repeat_fun( std::size_t sz, Nullary_function fun )
+        {
+            std::size_t i = 0;
+            while( i++ != sz )
+                this->push_back( fun() );
+            return *this;
+        }
+
+        template< class SinglePassIterator >
+        generic_list& range( SinglePassIterator first, 
+                             SinglePassIterator last )
+        {
+            for( ; first != last; ++first )
+                this->push_back( *first );
+            return *this;
+        }
+        
+        template< class SinglePassRange >
+        generic_list& range( const SinglePassRange& r )
+        {
+            return range( boost::begin(r), boost::end(r) );
+        }
+
+        template< class Container >
+        operator Container() const
+        {
+            return this-> BOOST_NESTED_TEMPLATE convert_to_container<Container>();
+        }
+    };
+    
+    /////////////////////////////////////////////////////////////////////////
+    // Part 2: efficient, but inconvenient interface
+    /////////////////////////////////////////////////////////////////////////
+
+    template< class T >
+    struct assign_reference
+    {
+        assign_reference()
+        { /* intentionally empty */ }
+
+        assign_reference( T& r ) : ref_(&r)
+        { }
+
+        void operator=( T& r )
+        {
+            ref_ = &r;
+        }
+
+        operator T&() const
+        {
+            return *ref_;
+        }
+
+        void swap( assign_reference& r )
+        {
+            std::swap( *ref_, *r.ref_ );
+        }
+
+        T& get_ref() const
+        {
+            return *ref_;
+        }
+        
+    private:
+        T* ref_;
+
+    };
+
+    template< class T >
+    inline bool operator<( const assign_reference<T>& l, 
+                           const assign_reference<T>& r )
+    {
+        return l.get_ref() < r.get_ref();
+    }
+
+    template< class T >
+    inline bool operator>( const assign_reference<T>& l,
+                           const assign_reference<T>& r )
+    {
+        return l.get_ref() > r.get_ref();
+    }
+
+    template< class T >
+    inline void swap( assign_reference<T>& l, 
+                      assign_reference<T>& r )
+    {
+        l.swap( r );
+    }
+
+
+    
+    template< class T, int N >
+    struct static_generic_list : 
+        public converter< static_generic_list<T,N>, assign_reference<T>* >
+    {
+    private:
+        typedef T                                     internal_value_type;
+
+    public:
+        typedef assign_reference<internal_value_type> value_type;
+        typedef value_type*                           iterator;
+        typedef value_type*                           const_iterator;
+        typedef std::size_t                           size_type;
+        typedef std::ptrdiff_t                        difference_type;
+
+    
+        static_generic_list( T& r ) :
+            current_(1)
+        {
+            refs_[0] = r;
+        }
+
+        static_generic_list& operator()( T& r )
+        {
+            insert( r );
+            return *this;
+        }
+
+        iterator begin() const 
+        {
+            return &refs_[0];
+        }
+
+        iterator end() const
+        {
+            return &refs_[current_];
+        }
+
+        size_type size() const
+        {
+            return static_cast<size_type>( current_ ); 
+        }
+
+        bool empty() const
+        {
+            return false;
+        }
+
+        template< class ForwardIterator >
+        static_generic_list& range( ForwardIterator first, 
+                                    ForwardIterator last )
+        {
+            for( ; first != last; ++first )
+                this->insert( *first );
+            return *this;
+        }
+
+        template< class ForwardRange >
+        static_generic_list& range( ForwardRange& r )
+        {
+            return range( boost::begin(r), boost::end(r) );
+        }
+
+        template< class ForwardRange >
+        static_generic_list& range( const ForwardRange& r )
+        {
+            return range( boost::begin(r), boost::end(r) );
+        }
+
+        template< class Container >
+        operator Container() const
+        {
+            return this-> BOOST_NESTED_TEMPLATE convert_to_container<Container>();
+        }
+
+    private:
+        void insert( T& r )
+        {
+            refs_[current_] = r;
+            ++current_;
+        }
+        
+        static_generic_list();
+        
+        mutable assign_reference<internal_value_type> refs_[N];
+        int current_;
+    };
+
+} // namespace 'assign_detail'
+
+namespace assign
+{
+    template< class T >
+    inline assign_detail::generic_list<T>
+    list_of()
+    {
+        return assign_detail::generic_list<T>()( T() );
+    }
+    
+    template< class T >
+    inline assign_detail::generic_list<T> 
+    list_of( const T& t )
+    {
+        return assign_detail::generic_list<T>()( t );
+    }
+
+    template< int N, class T >
+    inline assign_detail::static_generic_list< BOOST_DEDUCED_TYPENAME assign_detail::assign_decay<T>::type,N>
+    ref_list_of( T& t )
+    {
+        return assign_detail::static_generic_list<BOOST_DEDUCED_TYPENAME assign_detail::assign_decay<T>::type,N>( t );
+    }
+    
+    template< int N, class T >
+    inline assign_detail::static_generic_list<const BOOST_DEDUCED_TYPENAME assign_detail::assign_decay<T>::type,N>
+    cref_list_of( const T& t )
+    {
+        return assign_detail::static_generic_list<const BOOST_DEDUCED_TYPENAME assign_detail::assign_decay<T>::type,N>( t );
+    }
+
+#define BOOST_PP_LOCAL_LIMITS (1, BOOST_ASSIGN_MAX_PARAMETERS)
+#define BOOST_PP_LOCAL_MACRO(n) \
+    template< class T, class U, BOOST_ASSIGN_PARAMS1(n) > \
+    inline assign_detail::generic_list<T> \
+    list_of(U const& u, BOOST_ASSIGN_PARAMS2(n) ) \
+    { \
+        return assign_detail::generic_list<T>()(u, BOOST_ASSIGN_PARAMS3(n)); \
+    } \
+    /**/
+    
+#include BOOST_PP_LOCAL_ITERATE()
+
+#define BOOST_PP_LOCAL_LIMITS (1, BOOST_ASSIGN_MAX_PARAMETERS)
+#define BOOST_PP_LOCAL_MACRO(n) \
+    template< class U, BOOST_ASSIGN_PARAMS1(n) > \
+    inline assign_detail::generic_list< tuple<U, BOOST_ASSIGN_PARAMS4(n)> > \
+    tuple_list_of(U u, BOOST_ASSIGN_PARAMS2_NO_REF(n) ) \
+    { \
+        return assign_detail::generic_list< tuple<U, BOOST_ASSIGN_PARAMS4(n)> >()( tuple<U,BOOST_ASSIGN_PARAMS4(n)>( u, BOOST_ASSIGN_PARAMS3(n) )); \
+    } \
+    /**/
+    
+#include BOOST_PP_LOCAL_ITERATE()
+
+
+    template< class Key, class T >
+    inline assign_detail::generic_list< std::pair
+        < 
+            BOOST_DEDUCED_TYPENAME assign_detail::assign_decay<Key>::type, 
+            BOOST_DEDUCED_TYPENAME assign_detail::assign_decay<T>::type
+        > >
+    map_list_of( const Key& k, const T& t )
+    {
+        typedef BOOST_DEDUCED_TYPENAME assign_detail::assign_decay<Key>::type k_type;
+        typedef BOOST_DEDUCED_TYPENAME assign_detail::assign_decay<T>::type   t_type;
+        return assign_detail::generic_list< std::pair<k_type,t_type> >()( k, t );
+    }
+
+    template< class F, class S >
+    inline assign_detail::generic_list< std::pair
+        < 
+            BOOST_DEDUCED_TYPENAME assign_detail::assign_decay<F>::type, 
+            BOOST_DEDUCED_TYPENAME assign_detail::assign_decay<S>::type
+        > >
+    pair_list_of( const F& f, const S& s )
+    {
+        return map_list_of( f, s );
+    }
+
+
+} // namespace 'assign'
+} // namespace 'boost'
+
+
+#undef BOOST_ASSIGN_PARAMS1
+#undef BOOST_ASSIGN_PARAMS2
+#undef BOOST_ASSIGN_PARAMS3
+#undef BOOST_ASSIGN_PARAMS4
+#undef BOOST_ASSIGN_PARAMS2_NO_REF
+#undef BOOST_ASSIGN_MAX_PARAMETERS
+
+#endif
diff --git a/3rdParty/Boost/src/boost/tuple/detail/tuple_basic.hpp b/3rdParty/Boost/src/boost/tuple/detail/tuple_basic.hpp
new file mode 100644
index 0000000..348fd80
--- /dev/null
+++ b/3rdParty/Boost/src/boost/tuple/detail/tuple_basic.hpp
@@ -0,0 +1,953 @@
+//  tuple_basic.hpp -----------------------------------------------------
+
+// Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
+//
+// Distributed under 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)
+
+// For more information, see http://www.boost.org
+
+// Outside help:
+// This and that, Gary Powell.
+// Fixed return types for get_head/get_tail
+// ( and other bugs ) per suggestion of Jens Maurer
+// simplified element type accessors + bug fix  (Jeremy Siek)
+// Several changes/additions according to suggestions by Douglas Gregor,
+// William Kempf, Vesa Karvonen, John Max Skaller, Ed Brey, Beman Dawes,
+// David Abrahams.
+
+// Revision history:
+// 2002 05 01 Hugo Duncan: Fix for Borland after Jaakko's previous changes
+// 2002 04 18 Jaakko: tuple element types can be void or plain function
+//                    types, as long as no object is created.
+//                    Tuple objects can no hold even noncopyable types
+//                    such as arrays.
+// 2001 10 22 John Maddock
+//      Fixes for Borland C++
+// 2001 08 30 David Abrahams
+//      Added default constructor for cons<>.
+// -----------------------------------------------------------------
+
+#ifndef BOOST_TUPLE_BASIC_HPP
+#define BOOST_TUPLE_BASIC_HPP
+
+
+#include <utility> // needed for the assignment from pair to tuple
+
+#include "boost/type_traits/cv_traits.hpp"
+#include "boost/type_traits/function_traits.hpp"
+
+#include "boost/detail/workaround.hpp" // needed for BOOST_WORKAROUND
+
+namespace boost {
+namespace tuples {
+
+// -- null_type --------------------------------------------------------
+struct null_type {};
+
+// a helper function to provide a const null_type type temporary
+namespace detail {
+  inline const null_type cnull() { return null_type(); }
+
+
+// -- if construct ------------------------------------------------
+// Proposed by Krzysztof Czarnecki and Ulrich Eisenecker
+
+template <bool If, class Then, class Else> struct IF { typedef Then RET; };
+
+template <class Then, class Else> struct IF<false, Then, Else> {
+  typedef Else RET;
+};
+
+} // end detail
+
+// - cons forward declaration -----------------------------------------------
+template <class HT, class TT> struct cons;
+
+
+// - tuple forward declaration -----------------------------------------------
+template <
+  class T0 = null_type, class T1 = null_type, class T2 = null_type,
+  class T3 = null_type, class T4 = null_type, class T5 = null_type,
+  class T6 = null_type, class T7 = null_type, class T8 = null_type,
+  class T9 = null_type>
+class tuple;
+
+// tuple_length forward declaration
+template<class T> struct length;
+
+
+
+namespace detail {
+
+// -- generate error template, referencing to non-existing members of this
+// template is used to produce compilation errors intentionally
+template<class T>
+class generate_error;
+
+// - cons getters --------------------------------------------------------
+// called: get_class<N>::get<RETURN_TYPE>(aTuple)
+
+template< int N >
+struct get_class {
+  template<class RET, class HT, class TT >
+  inline static RET get(const cons<HT, TT>& t)
+  {
+#if BOOST_WORKAROUND(__IBMCPP__,==600)
+    // vacpp 6.0 is not very consistent regarding the member template keyword
+    // Here it generates an error when the template keyword is used.
+    return get_class<N-1>::get<RET>(t.tail);
+#else
+    return get_class<N-1>::BOOST_NESTED_TEMPLATE get<RET>(t.tail);
+#endif
+  }
+  template<class RET, class HT, class TT >
+  inline static RET get(cons<HT, TT>& t)
+  {
+#if BOOST_WORKAROUND(__IBMCPP__,==600)
+    return get_class<N-1>::get<RET>(t.tail);
+#else
+    return get_class<N-1>::BOOST_NESTED_TEMPLATE get<RET>(t.tail);
+#endif
+  }
+};
+
+template<>
+struct get_class<0> {
+  template<class RET, class HT, class TT>
+  inline static RET get(const cons<HT, TT>& t)
+  {
+    return t.head;
+  }
+  template<class RET, class HT, class TT>
+  inline static RET get(cons<HT, TT>& t)
+  {
+    return t.head;
+  }
+};
+
+} // end of namespace detail
+
+
+// -cons type accessors ----------------------------------------
+// typename tuples::element<N,T>::type gets the type of the
+// Nth element ot T, first element is at index 0
+// -------------------------------------------------------
+
+#ifndef BOOST_NO_CV_SPECIALIZATIONS
+
+template<int N, class T>
+struct element
+{
+private:
+  typedef typename T::tail_type Next;
+public:
+  typedef typename element<N-1, Next>::type type;
+};
+template<class T>
+struct element<0,T>
+{
+  typedef typename T::head_type type;
+};
+
+template<int N, class T>
+struct element<N, const T>
+{
+private:
+  typedef typename T::tail_type Next;
+  typedef typename element<N-1, Next>::type unqualified_type;
+public:
+#if BOOST_WORKAROUND(__BORLANDC__,<0x600)
+  typedef const unqualified_type type;
+#else
+  typedef typename boost::add_const<unqualified_type>::type type;
+#endif
+
+};
+template<class T>
+struct element<0,const T>
+{
+#if BOOST_WORKAROUND(__BORLANDC__,<0x600)
+  typedef const typename T::head_type type;
+#else
+  typedef typename boost::add_const<typename T::head_type>::type type;
+#endif
+};
+
+#else // def BOOST_NO_CV_SPECIALIZATIONS
+
+namespace detail {
+
+template<int N, class T, bool IsConst>
+struct element_impl
+{
+private:
+  typedef typename T::tail_type Next;
+public:
+  typedef typename element_impl<N-1, Next, IsConst>::type type;
+};
+
+template<int N, class T>
+struct element_impl<N, T, true /* IsConst */>
+{
+private:
+  typedef typename T::tail_type Next;
+public:
+  typedef const typename element_impl<N-1, Next, true>::type type;
+};
+
+template<class T>
+struct element_impl<0, T, false /* IsConst */>
+{
+  typedef typename T::head_type type;
+};
+
+template<class T>
+struct element_impl<0, T, true /* IsConst */>
+{
+  typedef const typename T::head_type type;
+};
+
+} // end of namespace detail
+
+
+template<int N, class T>
+struct element:
+  public detail::element_impl<N, T, ::boost::is_const<T>::value>
+{
+};
+
+#endif
+
+
+// -get function templates -----------------------------------------------
+// Usage: get<N>(aTuple)
+
+// -- some traits classes for get functions
+
+// access traits lifted from detail namespace to be part of the interface,
+// (Joel de Guzman's suggestion). Rationale: get functions are part of the
+// interface, so should the way to express their return types be.
+
+template <class T> struct access_traits {
+  typedef const T& const_type;
+  typedef T& non_const_type;
+
+  typedef const typename boost::remove_cv<T>::type& parameter_type;
+
+// used as the tuple constructors parameter types
+// Rationale: non-reference tuple element types can be cv-qualified.
+// It should be possible to initialize such types with temporaries,
+// and when binding temporaries to references, the reference must
+// be non-volatile and const. 8.5.3. (5)
+};
+
+template <class T> struct access_traits<T&> {
+
+  typedef T& const_type;
+  typedef T& non_const_type;
+
+  typedef T& parameter_type;
+};
+
+// get function for non-const cons-lists, returns a reference to the element
+
+template<int N, class HT, class TT>
+inline typename access_traits<
+                  typename element<N, cons<HT, TT> >::type
+                >::non_const_type
+get(cons<HT, TT>& c BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(int, N)) {
+#if BOOST_WORKAROUND(__IBMCPP__,==600 )
+  return detail::get_class<N>::
+#else
+  return detail::get_class<N>::BOOST_NESTED_TEMPLATE
+#endif
+         get<
+           typename access_traits<
+             typename element<N, cons<HT, TT> >::type
+           >::non_const_type,
+           HT,TT
+         >(c);
+}
+
+// get function for const cons-lists, returns a const reference to
+// the element. If the element is a reference, returns the reference
+// as such (that is, can return a non-const reference)
+template<int N, class HT, class TT>
+inline typename access_traits<
+                  typename element<N, cons<HT, TT> >::type
+                >::const_type
+get(const cons<HT, TT>& c BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(int, N)) {
+#if BOOST_WORKAROUND(__IBMCPP__,==600)
+  return detail::get_class<N>::
+#else
+  return detail::get_class<N>::BOOST_NESTED_TEMPLATE
+#endif
+         get<
+           typename access_traits<
+             typename element<N, cons<HT, TT> >::type
+           >::const_type,
+           HT,TT
+         >(c);
+}
+
+// -- the cons template  --------------------------------------------------
+namespace detail {
+
+//  These helper templates wrap void types and plain function types.
+//  The reationale is to allow one to write tuple types with those types
+//  as elements, even though it is not possible to instantiate such object.
+//  E.g: typedef tuple<void> some_type; // ok
+//  but: some_type x; // fails
+
+template <class T> class non_storeable_type {
+  non_storeable_type();
+};
+
+template <class T> struct wrap_non_storeable_type {
+  typedef typename IF<
+    ::boost::is_function<T>::value, non_storeable_type<T>, T
+  >::RET type;
+};
+template <> struct wrap_non_storeable_type<void> {
+  typedef non_storeable_type<void> type;
+};
+
+} // detail
+
+template <class HT, class TT>
+struct cons {
+
+  typedef HT head_type;
+  typedef TT tail_type;
+
+  typedef typename
+    detail::wrap_non_storeable_type<head_type>::type stored_head_type;
+
+  stored_head_type head;
+  tail_type tail;
+
+  typename access_traits<stored_head_type>::non_const_type
+  get_head() { return head; }
+
+  typename access_traits<tail_type>::non_const_type
+  get_tail() { return tail; }
+
+  typename access_traits<stored_head_type>::const_type
+  get_head() const { return head; }
+
+  typename access_traits<tail_type>::const_type
+  get_tail() const { return tail; }
+
+  cons() : head(), tail() {}
+  //  cons() : head(detail::default_arg<HT>::f()), tail() {}
+
+  // the argument for head is not strictly needed, but it prevents
+  // array type elements. This is good, since array type elements
+  // cannot be supported properly in any case (no assignment,
+  // copy works only if the tails are exactly the same type, ...)
+
+  cons(typename access_traits<stored_head_type>::parameter_type h,
+       const tail_type& t)
+    : head (h), tail(t) {}
+
+  template <class T1, class T2, class T3, class T4, class T5,
+            class T6, class T7, class T8, class T9, class T10>
+  cons( T1& t1, T2& t2, T3& t3, T4& t4, T5& t5,
+        T6& t6, T7& t7, T8& t8, T9& t9, T10& t10 )
+    : head (t1),
+      tail (t2, t3, t4, t5, t6, t7, t8, t9, t10, detail::cnull())
+      {}
+
+  template <class T2, class T3, class T4, class T5,
+            class T6, class T7, class T8, class T9, class T10>
+  cons( const null_type& /*t1*/, T2& t2, T3& t3, T4& t4, T5& t5,
+        T6& t6, T7& t7, T8& t8, T9& t9, T10& t10 )
+    : head (),
+      tail (t2, t3, t4, t5, t6, t7, t8, t9, t10, detail::cnull())
+      {}
+
+
+  template <class HT2, class TT2>
+  cons( const cons<HT2, TT2>& u ) : head(u.head), tail(u.tail) {}
+
+  template <class HT2, class TT2>
+  cons& operator=( const cons<HT2, TT2>& u ) {
+    head=u.head; tail=u.tail; return *this;
+  }
+
+  // must define assignment operator explicitly, implicit version is
+  // illformed if HT is a reference (12.8. (12))
+  cons& operator=(const cons& u) {
+    head = u.head; tail = u.tail;  return *this;
+  }
+
+  template <class T1, class T2>
+  cons& operator=( const std::pair<T1, T2>& u ) {
+    BOOST_STATIC_ASSERT(length<cons>::value == 2); // check length = 2
+    head = u.first; tail.head = u.second; return *this;
+  }
+
+  // get member functions (non-const and const)
+  template <int N>
+  typename access_traits<
+             typename element<N, cons<HT, TT> >::type
+           >::non_const_type
+  get() {
+    return boost::tuples::get<N>(*this); // delegate to non-member get
+  }
+
+  template <int N>
+  typename access_traits<
+             typename element<N, cons<HT, TT> >::type
+           >::const_type
+  get() const {
+    return boost::tuples::get<N>(*this); // delegate to non-member get
+  }
+};
+
+template <class HT>
+struct cons<HT, null_type> {
+
+  typedef HT head_type;
+  typedef null_type tail_type;
+  typedef cons<HT, null_type> self_type;
+
+  typedef typename
+    detail::wrap_non_storeable_type<head_type>::type stored_head_type;
+  stored_head_type head;
+
+  typename access_traits<stored_head_type>::non_const_type
+  get_head() { return head; }
+
+  null_type get_tail() { return null_type(); }
+
+  typename access_traits<stored_head_type>::const_type
+  get_head() const { return head; }
+
+  const null_type get_tail() const { return null_type(); }
+
+  //  cons() : head(detail::default_arg<HT>::f()) {}
+  cons() : head() {}
+
+  cons(typename access_traits<stored_head_type>::parameter_type h,
+       const null_type& = null_type())
+    : head (h) {}
+
+  template<class T1>
+  cons(T1& t1, const null_type&, const null_type&, const null_type&,
+       const null_type&, const null_type&, const null_type&,
+       const null_type&, const null_type&, const null_type&)
+  : head (t1) {}
+
+  cons(const null_type&,
+       const null_type&, const null_type&, const null_type&,
+       const null_type&, const null_type&, const null_type&,
+       const null_type&, const null_type&, const null_type&)
+  : head () {}
+
+  template <class HT2>
+  cons( const cons<HT2, null_type>& u ) : head(u.head) {}
+
+  template <class HT2>
+  cons& operator=(const cons<HT2, null_type>& u )
+  { head = u.head; return *this; }
+
+  // must define assignment operator explicitely, implicit version
+  // is illformed if HT is a reference
+  cons& operator=(const cons& u) { head = u.head; return *this; }
+
+  template <int N>
+  typename access_traits<
+             typename element<N, self_type>::type
+            >::non_const_type
+  get(BOOST_EXPLICIT_TEMPLATE_NON_TYPE(int, N)) {
+    return boost::tuples::get<N>(*this);
+  }
+
+  template <int N>
+  typename access_traits<
+             typename element<N, self_type>::type
+           >::const_type
+  get(BOOST_EXPLICIT_TEMPLATE_NON_TYPE(int, N)) const {
+    return boost::tuples::get<N>(*this);
+  }
+
+};
+
+// templates for finding out the length of the tuple -------------------
+
+template<class T>
+struct length  {
+  BOOST_STATIC_CONSTANT(int, value = 1 + length<typename T::tail_type>::value);
+};
+
+template<>
+struct length<tuple<> > {
+  BOOST_STATIC_CONSTANT(int, value = 0);
+};
+
+template<>
+struct length<tuple<> const> {
+  BOOST_STATIC_CONSTANT(int, value = 0);
+};
+
+template<>
+struct length<null_type> {
+  BOOST_STATIC_CONSTANT(int, value = 0);
+};
+
+template<>
+struct length<null_type const> {
+  BOOST_STATIC_CONSTANT(int, value = 0);
+};
+
+namespace detail {
+
+// Tuple to cons mapper --------------------------------------------------
+template <class T0, class T1, class T2, class T3, class T4,
+          class T5, class T6, class T7, class T8, class T9>
+struct map_tuple_to_cons
+{
+  typedef cons<T0,
+               typename map_tuple_to_cons<T1, T2, T3, T4, T5,
+                                          T6, T7, T8, T9, null_type>::type
+              > type;
+};
+
+// The empty tuple is a null_type
+template <>
+struct map_tuple_to_cons<null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type>
+{
+  typedef null_type type;
+};
+
+} // end detail
+
+// -------------------------------------------------------------------
+// -- tuple ------------------------------------------------------
+template <class T0, class T1, class T2, class T3, class T4,
+          class T5, class T6, class T7, class T8, class T9>
+
+class tuple :
+  public detail::map_tuple_to_cons<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::type
+{
+public:
+  typedef typename
+    detail::map_tuple_to_cons<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::type inherited;
+  typedef typename inherited::head_type head_type;
+  typedef typename inherited::tail_type tail_type;
+
+
+// access_traits<T>::parameter_type takes non-reference types as const T&
+  tuple() {}
+
+  tuple(typename access_traits<T0>::parameter_type t0)
+    : inherited(t0, detail::cnull(), detail::cnull(), detail::cnull(),
+                detail::cnull(), detail::cnull(), detail::cnull(),
+                detail::cnull(), detail::cnull(), detail::cnull()) {}
+
+  tuple(typename access_traits<T0>::parameter_type t0,
+        typename access_traits<T1>::parameter_type t1)
+    : inherited(t0, t1, detail::cnull(), detail::cnull(),
+                detail::cnull(), detail::cnull(), detail::cnull(),
+                detail::cnull(), detail::cnull(), detail::cnull()) {}
+
+  tuple(typename access_traits<T0>::parameter_type t0,
+        typename access_traits<T1>::parameter_type t1,
+        typename access_traits<T2>::parameter_type t2)
+    : inherited(t0, t1, t2, detail::cnull(), detail::cnull(),
+                detail::cnull(), detail::cnull(), detail::cnull(),
+                detail::cnull(), detail::cnull()) {}
+
+  tuple(typename access_traits<T0>::parameter_type t0,
+        typename access_traits<T1>::parameter_type t1,
+        typename access_traits<T2>::parameter_type t2,
+        typename access_traits<T3>::parameter_type t3)
+    : inherited(t0, t1, t2, t3, detail::cnull(), detail::cnull(),
+                detail::cnull(), detail::cnull(), detail::cnull(),
+                detail::cnull()) {}
+
+  tuple(typename access_traits<T0>::parameter_type t0,
+        typename access_traits<T1>::parameter_type t1,
+        typename access_traits<T2>::parameter_type t2,
+        typename access_traits<T3>::parameter_type t3,
+        typename access_traits<T4>::parameter_type t4)
+    : inherited(t0, t1, t2, t3, t4, detail::cnull(), detail::cnull(),
+                detail::cnull(), detail::cnull(), detail::cnull()) {}
+
+  tuple(typename access_traits<T0>::parameter_type t0,
+        typename access_traits<T1>::parameter_type t1,
+        typename access_traits<T2>::parameter_type t2,
+        typename access_traits<T3>::parameter_type t3,
+        typename access_traits<T4>::parameter_type t4,
+        typename access_traits<T5>::parameter_type t5)
+    : inherited(t0, t1, t2, t3, t4, t5, detail::cnull(), detail::cnull(),
+                detail::cnull(), detail::cnull()) {}
+
+  tuple(typename access_traits<T0>::parameter_type t0,
+        typename access_traits<T1>::parameter_type t1,
+        typename access_traits<T2>::parameter_type t2,
+        typename access_traits<T3>::parameter_type t3,
+        typename access_traits<T4>::parameter_type t4,
+        typename access_traits<T5>::parameter_type t5,
+        typename access_traits<T6>::parameter_type t6)
+    : inherited(t0, t1, t2, t3, t4, t5, t6, detail::cnull(),
+                detail::cnull(), detail::cnull()) {}
+
+  tuple(typename access_traits<T0>::parameter_type t0,
+        typename access_traits<T1>::parameter_type t1,
+        typename access_traits<T2>::parameter_type t2,
+        typename access_traits<T3>::parameter_type t3,
+        typename access_traits<T4>::parameter_type t4,
+        typename access_traits<T5>::parameter_type t5,
+        typename access_traits<T6>::parameter_type t6,
+        typename access_traits<T7>::parameter_type t7)
+    : inherited(t0, t1, t2, t3, t4, t5, t6, t7, detail::cnull(),
+                detail::cnull()) {}
+
+  tuple(typename access_traits<T0>::parameter_type t0,
+        typename access_traits<T1>::parameter_type t1,
+        typename access_traits<T2>::parameter_type t2,
+        typename access_traits<T3>::parameter_type t3,
+        typename access_traits<T4>::parameter_type t4,
+        typename access_traits<T5>::parameter_type t5,
+        typename access_traits<T6>::parameter_type t6,
+        typename access_traits<T7>::parameter_type t7,
+        typename access_traits<T8>::parameter_type t8)
+    : inherited(t0, t1, t2, t3, t4, t5, t6, t7, t8, detail::cnull()) {}
+
+  tuple(typename access_traits<T0>::parameter_type t0,
+        typename access_traits<T1>::parameter_type t1,
+        typename access_traits<T2>::parameter_type t2,
+        typename access_traits<T3>::parameter_type t3,
+        typename access_traits<T4>::parameter_type t4,
+        typename access_traits<T5>::parameter_type t5,
+        typename access_traits<T6>::parameter_type t6,
+        typename access_traits<T7>::parameter_type t7,
+        typename access_traits<T8>::parameter_type t8,
+        typename access_traits<T9>::parameter_type t9)
+    : inherited(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9) {}
+
+
+  template<class U1, class U2>
+  tuple(const cons<U1, U2>& p) : inherited(p) {}
+
+  template <class U1, class U2>
+  tuple& operator=(const cons<U1, U2>& k) {
+    inherited::operator=(k);
+    return *this;
+  }
+
+  template <class U1, class U2>
+  tuple& operator=(const std::pair<U1, U2>& k) {
+    BOOST_STATIC_ASSERT(length<tuple>::value == 2);// check_length = 2
+    this->head = k.first;
+    this->tail.head = k.second;
+    return *this;
+  }
+
+};
+
+// The empty tuple
+template <>
+class tuple<null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type>  :
+  public null_type
+{
+public:
+  typedef null_type inherited;
+};
+
+
+// Swallows any assignment   (by Doug Gregor)
+namespace detail {
+
+struct swallow_assign {
+
+  template<typename T>
+  swallow_assign const& operator=(const T&) const {
+    return *this;
+  }
+};
+
+} // namespace detail
+
+// "ignore" allows tuple positions to be ignored when using "tie".
+detail::swallow_assign const ignore = detail::swallow_assign();
+
+// ---------------------------------------------------------------------------
+// The call_traits for make_tuple
+// Honours the reference_wrapper class.
+
+// Must be instantiated with plain or const plain types (not with references)
+
+// from template<class T> foo(const T& t) : make_tuple_traits<const T>::type
+// from template<class T> foo(T& t) : make_tuple_traits<T>::type
+
+// Conversions:
+// T -> T,
+// references -> compile_time_error
+// reference_wrapper<T> -> T&
+// const reference_wrapper<T> -> T&
+// array -> const ref array
+
+
+template<class T>
+struct make_tuple_traits {
+  typedef T type;
+
+  // commented away, see below  (JJ)
+  //  typedef typename IF<
+  //  boost::is_function<T>::value,
+  //  T&,
+  //  T>::RET type;
+
+};
+
+// The is_function test was there originally for plain function types,
+// which can't be stored as such (we must either store them as references or
+// pointers). Such a type could be formed if make_tuple was called with a
+// reference to a function.
+// But this would mean that a const qualified function type was formed in
+// the make_tuple function and hence make_tuple can't take a function
+// reference as a parameter, and thus T can't be a function type.
+// So is_function test was removed.
+// (14.8.3. says that type deduction fails if a cv-qualified function type
+// is created. (It only applies for the case of explicitly specifying template
+// args, though?)) (JJ)
+
+template<class T>
+struct make_tuple_traits<T&> {
+  typedef typename
+     detail::generate_error<T&>::
+       do_not_use_with_reference_type error;
+};
+
+// Arrays can't be stored as plain types; convert them to references.
+// All arrays are converted to const. This is because make_tuple takes its
+// parameters as const T& and thus the knowledge of the potential
+// non-constness of actual argument is lost.
+template<class T, int n>  struct make_tuple_traits <T[n]> {
+  typedef const T (&type)[n];
+};
+
+template<class T, int n>
+struct make_tuple_traits<const T[n]> {
+  typedef const T (&type)[n];
+};
+
+template<class T, int n>  struct make_tuple_traits<volatile T[n]> {
+  typedef const volatile T (&type)[n];
+};
+
+template<class T, int n>
+struct make_tuple_traits<const volatile T[n]> {
+  typedef const volatile T (&type)[n];
+};
+
+template<class T>
+struct make_tuple_traits<reference_wrapper<T> >{
+  typedef T& type;
+};
+
+template<class T>
+struct make_tuple_traits<const reference_wrapper<T> >{
+  typedef T& type;
+};
+
+
+
+
+namespace detail {
+
+// a helper traits to make the make_tuple functions shorter (Vesa Karvonen's
+// suggestion)
+template <
+  class T0 = null_type, class T1 = null_type, class T2 = null_type,
+  class T3 = null_type, class T4 = null_type, class T5 = null_type,
+  class T6 = null_type, class T7 = null_type, class T8 = null_type,
+  class T9 = null_type
+>
+struct make_tuple_mapper {
+  typedef
+    tuple<typename make_tuple_traits<T0>::type,
+          typename make_tuple_traits<T1>::type,
+          typename make_tuple_traits<T2>::type,
+          typename make_tuple_traits<T3>::type,
+          typename make_tuple_traits<T4>::type,
+          typename make_tuple_traits<T5>::type,
+          typename make_tuple_traits<T6>::type,
+          typename make_tuple_traits<T7>::type,
+          typename make_tuple_traits<T8>::type,
+          typename make_tuple_traits<T9>::type> type;
+};
+
+} // end detail
+
+// -make_tuple function templates -----------------------------------
+inline tuple<> make_tuple() {
+  return tuple<>();
+}
+
+template<class T0>
+inline typename detail::make_tuple_mapper<T0>::type
+make_tuple(const T0& t0) {
+  typedef typename detail::make_tuple_mapper<T0>::type t;
+  return t(t0);
+}
+
+template<class T0, class T1>
+inline typename detail::make_tuple_mapper<T0, T1>::type
+make_tuple(const T0& t0, const T1& t1) {
+  typedef typename detail::make_tuple_mapper<T0, T1>::type t;
+  return t(t0, t1);
+}
+
+template<class T0, class T1, class T2>
+inline typename detail::make_tuple_mapper<T0, T1, T2>::type
+make_tuple(const T0& t0, const T1& t1, const T2& t2) {
+  typedef typename detail::make_tuple_mapper<T0, T1, T2>::type t;
+  return t(t0, t1, t2);
+}
+
+template<class T0, class T1, class T2, class T3>
+inline typename detail::make_tuple_mapper<T0, T1, T2, T3>::type
+make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3) {
+  typedef typename detail::make_tuple_mapper<T0, T1, T2, T3>::type t;
+  return t(t0, t1, t2, t3);
+}
+
+template<class T0, class T1, class T2, class T3, class T4>
+inline typename detail::make_tuple_mapper<T0, T1, T2, T3, T4>::type
+make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3,
+                  const T4& t4) {
+  typedef typename detail::make_tuple_mapper<T0, T1, T2, T3, T4>::type t;
+  return t(t0, t1, t2, t3, t4);
+}
+
+template<class T0, class T1, class T2, class T3, class T4, class T5>
+inline typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5>::type
+make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3,
+                  const T4& t4, const T5& t5) {
+  typedef typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5>::type t;
+  return t(t0, t1, t2, t3, t4, t5);
+}
+
+template<class T0, class T1, class T2, class T3, class T4, class T5, class T6>
+inline typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5, T6>::type
+make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3,
+                  const T4& t4, const T5& t5, const T6& t6) {
+  typedef typename detail::make_tuple_mapper
+           <T0, T1, T2, T3, T4, T5, T6>::type t;
+  return t(t0, t1, t2, t3, t4, t5, t6);
+}
+
+template<class T0, class T1, class T2, class T3, class T4, class T5, class T6,
+         class T7>
+inline typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5, T6, T7>::type
+make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3,
+                  const T4& t4, const T5& t5, const T6& t6, const T7& t7) {
+  typedef typename detail::make_tuple_mapper
+           <T0, T1, T2, T3, T4, T5, T6, T7>::type t;
+  return t(t0, t1, t2, t3, t4, t5, t6, t7);
+}
+
+template<class T0, class T1, class T2, class T3, class T4, class T5, class T6,
+         class T7, class T8>
+inline typename detail::make_tuple_mapper
+  <T0, T1, T2, T3, T4, T5, T6, T7, T8>::type
+make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3,
+                  const T4& t4, const T5& t5, const T6& t6, const T7& t7,
+                  const T8& t8) {
+  typedef typename detail::make_tuple_mapper
+           <T0, T1, T2, T3, T4, T5, T6, T7, T8>::type t;
+  return t(t0, t1, t2, t3, t4, t5, t6, t7, t8);
+}
+
+template<class T0, class T1, class T2, class T3, class T4, class T5, class T6,
+         class T7, class T8, class T9>
+inline typename detail::make_tuple_mapper
+  <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::type
+make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3,
+                  const T4& t4, const T5& t5, const T6& t6, const T7& t7,
+                  const T8& t8, const T9& t9) {
+  typedef typename detail::make_tuple_mapper
+           <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::type t;
+  return t(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9);
+}
+
+
+
+// Tie function templates -------------------------------------------------
+template<class T1>
+inline tuple<T1&> tie(T1& t1) {
+  return tuple<T1&> (t1);
+}
+
+template<class T1, class T2>
+inline tuple<T1&, T2&> tie(T1& t1, T2& t2) {
+  return tuple<T1&, T2&> (t1, t2);
+}
+
+template<class T1, class T2, class T3>
+inline tuple<T1&, T2&, T3&> tie(T1& t1, T2& t2, T3& t3) {
+  return tuple<T1&, T2&, T3&> (t1, t2, t3);
+}
+
+template<class T1, class T2, class T3, class T4>
+inline tuple<T1&, T2&, T3&, T4&> tie(T1& t1, T2& t2, T3& t3, T4& t4) {
+  return tuple<T1&, T2&, T3&, T4&> (t1, t2, t3, t4);
+}
+
+template<class T1, class T2, class T3, class T4, class T5>
+inline tuple<T1&, T2&, T3&, T4&, T5&>
+tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5) {
+  return tuple<T1&, T2&, T3&, T4&, T5&> (t1, t2, t3, t4, t5);
+}
+
+template<class T1, class T2, class T3, class T4, class T5, class T6>
+inline tuple<T1&, T2&, T3&, T4&, T5&, T6&>
+tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6) {
+  return tuple<T1&, T2&, T3&, T4&, T5&, T6&> (t1, t2, t3, t4, t5, t6);
+}
+
+template<class T1, class T2, class T3, class T4, class T5, class T6, class T7>
+inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&>
+tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7) {
+  return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&> (t1, t2, t3, t4, t5, t6, t7);
+}
+
+template<class T1, class T2, class T3, class T4, class T5, class T6, class T7,
+         class T8>
+inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&>
+tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8) {
+  return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&>
+           (t1, t2, t3, t4, t5, t6, t7, t8);
+}
+
+template<class T1, class T2, class T3, class T4, class T5, class T6, class T7,
+         class T8, class T9>
+inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&>
+tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8,
+           T9& t9) {
+  return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&>
+            (t1, t2, t3, t4, t5, t6, t7, t8, t9);
+}
+
+template<class T1, class T2, class T3, class T4, class T5, class T6, class T7,
+         class T8, class T9, class T10>
+inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&, T10&>
+tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8,
+           T9& t9, T10& t10) {
+  return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&, T10&>
+           (t1, t2, t3, t4, t5, t6, t7, t8, t9, t10);
+}
+
+} // end of namespace tuples
+} // end of namespace boost
+
+
+#endif // BOOST_TUPLE_BASIC_HPP
+
+
diff --git a/3rdParty/Boost/src/boost/tuple/detail/tuple_basic_no_partial_spec.hpp b/3rdParty/Boost/src/boost/tuple/detail/tuple_basic_no_partial_spec.hpp
new file mode 100644
index 0000000..bb38662
--- /dev/null
+++ b/3rdParty/Boost/src/boost/tuple/detail/tuple_basic_no_partial_spec.hpp
@@ -0,0 +1,841 @@
+// - tuple_basic_no_partial_spec.hpp -----------------------------------------
+
+// Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
+// Copyright (C) 2001 Douglas Gregor (gregod@rpi.edu)
+// Copyright (C) 2001 Gary Powell (gary.powell@sierra.com)
+//
+// Distributed under 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)
+
+// For more information, see http://www.boost.org or http://lambda.cs.utu.fi
+
+// Revision History
+//  14 02 01    Remove extra ';'. Also, fixed 10-parameter to make_tuple. (DG)
+//  10 02 01    Fixed "null_type" constructors.
+//              Implemented comparison operators globally.
+//              Hide element_type_ref and element_type_const_ref.
+//              (DG).
+//  09 02 01    Extended to tuples of length 10. Changed comparison for
+//              operator<()
+//              to the same used by std::pair<>, added cnull_type() (GP)
+//  03 02 01    Initial Version from original tuple.hpp code by JJ. (DG)
+
+// -----------------------------------------------------------------
+
+#ifndef BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP
+#define BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP
+
+#include "boost/type_traits.hpp"
+#include <utility>
+
+#if defined BOOST_MSVC
+#pragma warning(disable:4518) // storage-class or type specifier(s) unexpected here; ignored
+#pragma warning(disable:4181) // qualifier applied to reference type ignored
+#pragma warning(disable:4227) // qualifier applied to reference type ignored
+#endif
+
+namespace boost {
+namespace tuples {
+
+    // null_type denotes the end of a list built with "cons"
+    struct null_type
+    {
+      null_type() {}
+      null_type(const null_type&, const null_type&) {}
+    };
+
+    // a helper function to provide a const null_type type temporary
+    inline const null_type cnull_type() { return null_type(); }
+
+// forward declaration of tuple
+    template<
+      typename T1 = null_type,
+      typename T2 = null_type,
+      typename T3 = null_type,
+      typename T4 = null_type,
+      typename T5 = null_type,
+      typename T6 = null_type,
+      typename T7 = null_type,
+      typename T8 = null_type,
+      typename T9 = null_type,
+      typename T10 = null_type
+    >
+    class tuple;
+
+// forward declaration of cons
+    template<typename Head, typename Tail = null_type>
+    struct cons;
+
+    namespace detail {
+
+      // Takes a pointer and routes all assignments to whatever it points to
+      template<typename T>
+      struct assign_to_pointee
+      {
+      public:
+        explicit assign_to_pointee(T* p) : ptr(p) {}
+
+        template<typename Other>
+        assign_to_pointee& operator=(const Other& other)
+        {
+          *ptr = other;
+          return *this;
+        }
+
+      private:
+        T* ptr;
+      };
+
+      // Swallows any assignment
+      struct swallow_assign
+      {
+        template<typename T>
+        swallow_assign const& operator=(const T&) const
+        {
+          return *this;
+        }
+      };
+
+    template <typename T> struct add_const_reference : add_reference<typename add_const<T>::type> {};
+
+    template <class MyTail>
+    struct init_tail
+    {
+        // Each of vc6 and vc7 seem to require a different formulation
+        // of this return type
+        template <class H, class T>
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+        static typename add_reference<typename add_const<T>::type>::type
+#else
+        static typename add_const_reference<T>::type
+#endif
+        execute( cons<H,T> const& u, long )
+        {
+            return u.get_tail();
+        }
+    };
+
+    template <>
+    struct init_tail<null_type>
+    {
+        template <class H>
+        static null_type execute( cons<H,null_type> const& u, long )
+        {
+            return null_type();
+        }
+
+        template <class U>
+        static null_type execute(U const&, ...)
+        {
+            return null_type();
+        }
+     private:
+        template <class H, class T>
+        void execute( cons<H,T> const&, int);
+    };
+
+    template <class Other>
+    Other const&
+    init_head( Other const& u, ... )
+    {
+        return u;
+    }
+
+    template <class H, class T>
+    typename add_reference<typename add_const<H>::type>::type
+    init_head( cons<H,T> const& u, int )
+    {
+        return u.get_head();
+    }
+
+    inline char**** init_head(null_type const&, int);
+
+  } // end of namespace detail
+
+    // cons builds a heterogenous list of types
+   template<typename Head, typename Tail>
+   struct cons
+   {
+     typedef cons self_type;
+     typedef Head head_type;
+     typedef Tail tail_type;
+
+    private:
+       typedef typename boost::add_reference<head_type>::type head_ref;
+       typedef typename boost::add_reference<tail_type>::type tail_ref;
+       typedef typename detail::add_const_reference<head_type>::type head_cref;
+       typedef typename detail::add_const_reference<tail_type>::type tail_cref;
+    public:
+     head_type head;
+     tail_type tail;
+
+     head_ref get_head() { return head; }
+     tail_ref get_tail() { return tail; }
+
+     head_cref get_head() const { return head; }
+     tail_cref get_tail() const { return tail; }
+
+     cons() : head(), tail() {}
+
+#if defined BOOST_MSVC
+      template<typename Tail>
+      cons(head_cref h /* = head_type() */, // causes MSVC 6.5 to barf.
+                    const Tail& t) : head(h), tail(t.head, t.tail)
+      {
+      }
+
+      cons(head_cref h /* = head_type() */, // causes MSVC 6.5 to barf.
+                    const null_type& t) : head(h), tail(t)
+      {
+      }
+
+#else
+      template<typename T>
+      explicit cons(head_cref h, const T& t) :
+        head(h), tail(t.head, t.tail)
+      {
+      }
+
+      explicit cons(head_cref h = head_type(),
+                    tail_cref t = tail_type()) :
+        head(h), tail(t)
+      {
+      }
+#endif
+
+      template <class U>
+      cons( const U& u )
+        : head(detail::init_head(u, 0))
+        , tail(detail::init_tail<Tail>::execute(u, 0L))
+       {
+       }
+
+      template<typename Other>
+      cons& operator=(const Other& other)
+      {
+        head = other.head;
+        tail = other.tail;
+        return *this;
+      }
+    };
+
+    namespace detail {
+
+      // Determines if the parameter is null_type
+      template<typename T> struct is_null_type { enum { RET = 0 }; };
+      template<> struct is_null_type<null_type> { enum { RET = 1 }; };
+
+      /* Build a cons structure from the given Head and Tail. If both are null_type,
+      return null_type. */
+      template<typename Head, typename Tail>
+      struct build_cons
+      {
+      private:
+        enum { tail_is_null_type = is_null_type<Tail>::RET };
+      public:
+        typedef cons<Head, Tail> RET;
+      };
+
+      template<>
+      struct build_cons<null_type, null_type>
+      {
+        typedef null_type RET;
+      };
+
+      // Map the N elements of a tuple into a cons list
+      template<
+        typename T1,
+        typename T2 = null_type,
+        typename T3 = null_type,
+        typename T4 = null_type,
+        typename T5 = null_type,
+        typename T6 = null_type,
+        typename T7 = null_type,
+        typename T8 = null_type,
+        typename T9 = null_type,
+        typename T10 = null_type
+      >
+      struct map_tuple_to_cons
+      {
+        typedef typename detail::build_cons<T10, null_type  >::RET cons10;
+        typedef typename detail::build_cons<T9, cons10>::RET cons9;
+        typedef typename detail::build_cons<T8, cons9>::RET cons8;
+        typedef typename detail::build_cons<T7, cons8>::RET cons7;
+        typedef typename detail::build_cons<T6, cons7>::RET cons6;
+        typedef typename detail::build_cons<T5, cons6>::RET cons5;
+        typedef typename detail::build_cons<T4, cons5>::RET cons4;
+        typedef typename detail::build_cons<T3, cons4>::RET cons3;
+        typedef typename detail::build_cons<T2, cons3>::RET cons2;
+        typedef typename detail::build_cons<T1, cons2>::RET cons1;
+      };
+
+      // Workaround the lack of partial specialization in some compilers
+      template<int N>
+      struct _element_type
+      {
+        template<typename Tuple>
+        struct inner
+        {
+        private:
+          typedef typename Tuple::tail_type tail_type;
+          typedef _element_type<N-1> next_elt_type;
+
+        public:
+          typedef typename _element_type<N-1>::template inner<tail_type>::RET RET;
+        };
+      };
+
+      template<>
+      struct _element_type<0>
+      {
+        template<typename Tuple>
+        struct inner
+        {
+          typedef typename Tuple::head_type RET;
+        };
+      };
+
+    } // namespace detail
+
+
+    // Return the Nth type of the given Tuple
+    template<int N, typename Tuple>
+    struct element
+    {
+    private:
+      typedef detail::_element_type<N> nth_type;
+
+    public:
+      typedef typename nth_type::template inner<Tuple>::RET RET;
+      typedef RET type;
+    };
+
+    namespace detail {
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC == 1300)
+      // special workaround for vc7:
+
+      template <bool x>
+      struct reference_adder
+      {
+         template <class T>
+         struct rebind
+         {
+            typedef T& type;
+         };
+      };
+
+      template <>
+      struct reference_adder<true>
+      {
+         template <class T>
+         struct rebind
+         {
+            typedef T type;
+         };
+      };
+
+
+      // Return a reference to the Nth type of the given Tuple
+      template<int N, typename Tuple>
+      struct element_ref
+      {
+      private:
+         typedef typename element<N, Tuple>::RET elt_type;
+         enum { is_ref = is_reference<elt_type>::value };
+
+      public:
+         typedef reference_adder<is_ref>::rebind<elt_type>::type RET;
+         typedef RET type;
+      };
+
+      // Return a const reference to the Nth type of the given Tuple
+      template<int N, typename Tuple>
+      struct element_const_ref
+      {
+      private:
+         typedef typename element<N, Tuple>::RET elt_type;
+         enum { is_ref = is_reference<elt_type>::value };
+
+      public:
+         typedef reference_adder<is_ref>::rebind<const elt_type>::type RET;
+         typedef RET type;
+      };
+
+#else // vc7
+
+      // Return a reference to the Nth type of the given Tuple
+      template<int N, typename Tuple>
+      struct element_ref
+      {
+      private:
+        typedef typename element<N, Tuple>::RET elt_type;
+
+      public:
+        typedef typename add_reference<elt_type>::type RET;
+        typedef RET type;
+      };
+
+      // Return a const reference to the Nth type of the given Tuple
+      template<int N, typename Tuple>
+      struct element_const_ref
+      {
+      private:
+        typedef typename element<N, Tuple>::RET elt_type;
+
+      public:
+        typedef typename add_reference<const elt_type>::type RET;
+        typedef RET type;
+      };
+#endif // vc7
+
+    } // namespace detail
+
+    // Get length of this tuple
+    template<typename Tuple>
+    struct length
+    {
+      BOOST_STATIC_CONSTANT(int, value = 1 + length<typename Tuple::tail_type>::value);
+    };
+
+    template<> struct length<tuple<> > {
+      BOOST_STATIC_CONSTANT(int, value = 0);
+    };
+
+    template<>
+    struct length<null_type>
+    {
+      BOOST_STATIC_CONSTANT(int, value = 0);
+    };
+
+    namespace detail {
+
+    // Reference the Nth element in a tuple and retrieve it with "get"
+    template<int N>
+    struct get_class
+    {
+      template<typename Head, typename Tail>
+      static inline
+      typename detail::element_ref<N, cons<Head, Tail> >::RET
+      get(cons<Head, Tail>& t)
+      {
+        return get_class<N-1>::get(t.tail);
+      }
+
+      template<typename Head, typename Tail>
+      static inline
+      typename detail::element_const_ref<N, cons<Head, Tail> >::RET
+      get(const cons<Head, Tail>& t)
+      {
+        return get_class<N-1>::get(t.tail);
+      }
+    };
+
+    template<>
+    struct get_class<0>
+    {
+      template<typename Head, typename Tail>
+      static inline
+      typename add_reference<Head>::type
+      get(cons<Head, Tail>& t)
+      {
+        return t.head;
+      }
+
+      template<typename Head, typename Tail>
+      static inline
+      typename add_reference<const Head>::type
+      get(const cons<Head, Tail>& t)
+      {
+        return t.head;
+      }
+    };
+
+    } // namespace detail
+
+    // tuple class
+    template<
+      typename T1,
+      typename T2,
+      typename T3,
+      typename T4,
+      typename T5,
+      typename T6,
+      typename T7,
+      typename T8,
+      typename T9,
+      typename T10
+    >
+    class tuple :
+      public detail::map_tuple_to_cons<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::cons1
+    {
+    private:
+      typedef detail::map_tuple_to_cons<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> mapped_tuple;
+      typedef typename mapped_tuple::cons10 cons10;
+      typedef typename mapped_tuple::cons9 cons9;
+      typedef typename mapped_tuple::cons8 cons8;
+      typedef typename mapped_tuple::cons7 cons7;
+      typedef typename mapped_tuple::cons6 cons6;
+      typedef typename mapped_tuple::cons5 cons5;
+      typedef typename mapped_tuple::cons4 cons4;
+      typedef typename mapped_tuple::cons3 cons3;
+      typedef typename mapped_tuple::cons2 cons2;
+      typedef typename mapped_tuple::cons1 cons1;
+
+      typedef typename detail::add_const_reference<T1>::type t1_cref;
+      typedef typename detail::add_const_reference<T2>::type t2_cref;
+      typedef typename detail::add_const_reference<T3>::type t3_cref;
+      typedef typename detail::add_const_reference<T4>::type t4_cref;
+      typedef typename detail::add_const_reference<T5>::type t5_cref;
+      typedef typename detail::add_const_reference<T6>::type t6_cref;
+      typedef typename detail::add_const_reference<T7>::type t7_cref;
+      typedef typename detail::add_const_reference<T8>::type t8_cref;
+      typedef typename detail::add_const_reference<T9>::type t9_cref;
+      typedef typename detail::add_const_reference<T10>::type t10_cref;
+    public:
+      typedef cons1 inherited;
+      typedef tuple self_type;
+
+      tuple() : cons1(T1(), cons2(T2(), cons3(T3(), cons4(T4(), cons5(T5(), cons6(T6(),cons7(T7(),cons8(T8(),cons9(T9(),cons10(T10()))))))))))
+        {}
+
+      tuple(
+          t1_cref t1,
+          t2_cref t2,
+          t3_cref t3 = T3(),
+          t4_cref t4 = T4(),
+          t5_cref t5 = T5(),
+          t6_cref t6 = T6(),
+          t7_cref t7 = T7(),
+          t8_cref t8 = T8(),
+          t9_cref t9 = T9(),
+          t10_cref t10 = T10()
+      ) :
+        cons1(t1, cons2(t2, cons3(t3, cons4(t4, cons5(t5, cons6(t6,cons7(t7,cons8(t8,cons9(t9,cons10(t10))))))))))
+      {
+      }
+
+      explicit tuple(t1_cref t1)
+        : cons1(t1, cons2(T2(), cons3(T3(), cons4(T4(), cons5(T5(), cons6(T6(),cons7(T7(),cons8(T8(),cons9(T9(),cons10(T10()))))))))))
+      {}
+
+      template<typename Head, typename Tail>
+      tuple(const cons<Head, Tail>& other) :
+        cons1(other.head, other.tail)
+      {
+      }
+
+      template<typename First, typename Second>
+      self_type& operator=(const std::pair<First, Second>& other)
+      {
+        this->head = other.first;
+        this->tail.head = other.second;
+        return *this;
+      }
+
+      template<typename Head, typename Tail>
+      self_type& operator=(const cons<Head, Tail>& other)
+      {
+        this->head = other.head;
+        this->tail = other.tail;
+
+        return *this;
+      }
+    };
+
+    namespace detail {
+
+      template<int N> struct workaround_holder {};
+
+    } // namespace detail
+
+    template<int N, typename Head, typename Tail>
+    typename detail::element_ref<N, cons<Head, Tail> >::RET
+    get(cons<Head, Tail>& t, detail::workaround_holder<N>* = 0)
+    {
+      return detail::get_class<N>::get(t);
+    }
+
+    template<int N, typename Head, typename Tail>
+    typename detail::element_const_ref<N, cons<Head, Tail> >::RET
+    get(const cons<Head, Tail>& t, detail::workaround_holder<N>* = 0)
+    {
+      return detail::get_class<N>::get(t);
+    }
+
+    // Make a tuple
+    template<typename T1>
+    inline
+    tuple<T1>
+    make_tuple(const T1& t1)
+    {
+      return tuple<T1>(t1);
+    }
+
+    // Make a tuple
+    template<typename T1, typename T2>
+    inline
+    tuple<T1, T2>
+    make_tuple(const T1& t1, const T2& t2)
+    {
+      return tuple<T1, T2>(t1, t2);
+    }
+
+    // Make a tuple
+    template<typename T1, typename T2, typename T3>
+    inline
+    tuple<T1, T2, T3>
+    make_tuple(const T1& t1, const T2& t2, const T3& t3)
+    {
+      return tuple<T1, T2, T3>(t1, t2, t3);
+    }
+
+    // Make a tuple
+    template<typename T1, typename T2, typename T3, typename T4>
+    inline
+    tuple<T1, T2, T3, T4>
+    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4)
+    {
+      return tuple<T1, T2, T3, T4>(t1, t2, t3, t4);
+    }
+
+    // Make a tuple
+    template<typename T1, typename T2, typename T3, typename T4, typename T5>
+    inline
+    tuple<T1, T2, T3, T4, T5>
+    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5)
+    {
+      return tuple<T1, T2, T3, T4, T5>(t1, t2, t3, t4, t5);
+    }
+
+    // Make a tuple
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+    inline
+    tuple<T1, T2, T3, T4, T5, T6>
+    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6)
+    {
+      return tuple<T1, T2, T3, T4, T5, T6>(t1, t2, t3, t4, t5, t6);
+    }
+
+    // Make a tuple
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
+    inline
+    tuple<T1, T2, T3, T4, T5, T6, T7>
+    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7)
+    {
+      return tuple<T1, T2, T3, T4, T5, T6, T7>(t1, t2, t3, t4, t5, t6, t7);
+    }
+
+    // Make a tuple
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
+    inline
+    tuple<T1, T2, T3, T4, T5, T6, T7, T8>
+    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8)
+    {
+      return tuple<T1, T2, T3, T4, T5, T6, T7, T8>(t1, t2, t3, t4, t5, t6, t7, t8);
+    }
+
+    // Make a tuple
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
+    inline
+    tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>
+    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9)
+    {
+      return tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>(t1, t2, t3, t4, t5, t6, t7, t8, t9);
+    }
+
+    // Make a tuple
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
+    inline
+    tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>
+    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10)
+    {
+      return tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10);
+    }
+
+    // Tie variables into a tuple
+    template<typename T1>
+    inline
+    tuple<detail::assign_to_pointee<T1> >
+    tie(T1& t1)
+    {
+      return make_tuple(detail::assign_to_pointee<T1>(&t1));
+    }
+
+    // Tie variables into a tuple
+    template<typename T1, typename T2>
+    inline
+    tuple<detail::assign_to_pointee<T1>,
+      detail::assign_to_pointee<T2> >
+    tie(T1& t1, T2& t2)
+    {
+      return make_tuple(detail::assign_to_pointee<T1>(&t1),
+                        detail::assign_to_pointee<T2>(&t2));
+    }
+
+    // Tie variables into a tuple
+    template<typename T1, typename T2, typename T3>
+    inline
+    tuple<detail::assign_to_pointee<T1>,
+      detail::assign_to_pointee<T2>,
+      detail::assign_to_pointee<T3> >
+    tie(T1& t1, T2& t2, T3& t3)
+    {
+      return make_tuple(detail::assign_to_pointee<T1>(&t1),
+                        detail::assign_to_pointee<T2>(&t2),
+                        detail::assign_to_pointee<T3>(&t3));
+    }
+
+    // Tie variables into a tuple
+    template<typename T1, typename T2, typename T3, typename T4>
+    inline
+    tuple<detail::assign_to_pointee<T1>,
+      detail::assign_to_pointee<T2>,
+      detail::assign_to_pointee<T3>,
+      detail::assign_to_pointee<T4> >
+    tie(T1& t1, T2& t2, T3& t3, T4& t4)
+    {
+      return make_tuple(detail::assign_to_pointee<T1>(&t1),
+                        detail::assign_to_pointee<T2>(&t2),
+                        detail::assign_to_pointee<T3>(&t3),
+                        detail::assign_to_pointee<T4>(&t4));
+    }
+
+    // Tie variables into a tuple
+    template<typename T1, typename T2, typename T3, typename T4, typename T5>
+    inline
+    tuple<detail::assign_to_pointee<T1>,
+      detail::assign_to_pointee<T2>,
+      detail::assign_to_pointee<T3>,
+      detail::assign_to_pointee<T4>,
+      detail::assign_to_pointee<T5> >
+    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5)
+    {
+      return make_tuple(detail::assign_to_pointee<T1>(&t1),
+                        detail::assign_to_pointee<T2>(&t2),
+                        detail::assign_to_pointee<T3>(&t3),
+                        detail::assign_to_pointee<T4>(&t4),
+                        detail::assign_to_pointee<T5>(&t5));
+    }
+
+    // Tie variables into a tuple
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+    inline
+    tuple<detail::assign_to_pointee<T1>,
+      detail::assign_to_pointee<T2>,
+      detail::assign_to_pointee<T3>,
+      detail::assign_to_pointee<T4>,
+      detail::assign_to_pointee<T5>,
+      detail::assign_to_pointee<T6> >
+    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6)
+    {
+      return make_tuple(detail::assign_to_pointee<T1>(&t1),
+                        detail::assign_to_pointee<T2>(&t2),
+                        detail::assign_to_pointee<T3>(&t3),
+                        detail::assign_to_pointee<T4>(&t4),
+                        detail::assign_to_pointee<T5>(&t5),
+                        detail::assign_to_pointee<T6>(&t6));
+    }
+
+    // Tie variables into a tuple
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
+    inline
+    tuple<detail::assign_to_pointee<T1>,
+      detail::assign_to_pointee<T2>,
+      detail::assign_to_pointee<T3>,
+      detail::assign_to_pointee<T4>,
+      detail::assign_to_pointee<T5>,
+      detail::assign_to_pointee<T6>,
+      detail::assign_to_pointee<T7> >
+    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7)
+    {
+      return make_tuple(detail::assign_to_pointee<T1>(&t1),
+                        detail::assign_to_pointee<T2>(&t2),
+                        detail::assign_to_pointee<T3>(&t3),
+                        detail::assign_to_pointee<T4>(&t4),
+                        detail::assign_to_pointee<T5>(&t5),
+                        detail::assign_to_pointee<T6>(&t6),
+                        detail::assign_to_pointee<T7>(&t7));
+    }
+
+    // Tie variables into a tuple
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
+    inline
+    tuple<detail::assign_to_pointee<T1>,
+      detail::assign_to_pointee<T2>,
+      detail::assign_to_pointee<T3>,
+      detail::assign_to_pointee<T4>,
+      detail::assign_to_pointee<T5>,
+      detail::assign_to_pointee<T6>,
+      detail::assign_to_pointee<T7>,
+      detail::assign_to_pointee<T8> >
+    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8)
+    {
+      return make_tuple(detail::assign_to_pointee<T1>(&t1),
+                        detail::assign_to_pointee<T2>(&t2),
+                        detail::assign_to_pointee<T3>(&t3),
+                        detail::assign_to_pointee<T4>(&t4),
+                        detail::assign_to_pointee<T5>(&t5),
+                        detail::assign_to_pointee<T6>(&t6),
+                        detail::assign_to_pointee<T7>(&t7),
+                        detail::assign_to_pointee<T8>(&t8));
+    }
+
+    // Tie variables into a tuple
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
+    inline
+    tuple<detail::assign_to_pointee<T1>,
+      detail::assign_to_pointee<T2>,
+      detail::assign_to_pointee<T3>,
+      detail::assign_to_pointee<T4>,
+      detail::assign_to_pointee<T5>,
+      detail::assign_to_pointee<T6>,
+      detail::assign_to_pointee<T7>,
+      detail::assign_to_pointee<T8>,
+      detail::assign_to_pointee<T9> >
+    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8, T9 &t9)
+    {
+      return make_tuple(detail::assign_to_pointee<T1>(&t1),
+                        detail::assign_to_pointee<T2>(&t2),
+                        detail::assign_to_pointee<T3>(&t3),
+                        detail::assign_to_pointee<T4>(&t4),
+                        detail::assign_to_pointee<T5>(&t5),
+                        detail::assign_to_pointee<T6>(&t6),
+                        detail::assign_to_pointee<T7>(&t7),
+                        detail::assign_to_pointee<T8>(&t8),
+                        detail::assign_to_pointee<T9>(&t9));
+    }
+    // Tie variables into a tuple
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
+    inline
+    tuple<detail::assign_to_pointee<T1>,
+      detail::assign_to_pointee<T2>,
+      detail::assign_to_pointee<T3>,
+      detail::assign_to_pointee<T4>,
+      detail::assign_to_pointee<T5>,
+      detail::assign_to_pointee<T6>,
+      detail::assign_to_pointee<T7>,
+      detail::assign_to_pointee<T8>,
+      detail::assign_to_pointee<T9>,
+      detail::assign_to_pointee<T10> >
+    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8, T9 &t9, T10 &t10)
+    {
+      return make_tuple(detail::assign_to_pointee<T1>(&t1),
+                        detail::assign_to_pointee<T2>(&t2),
+                        detail::assign_to_pointee<T3>(&t3),
+                        detail::assign_to_pointee<T4>(&t4),
+                        detail::assign_to_pointee<T5>(&t5),
+                        detail::assign_to_pointee<T6>(&t6),
+                        detail::assign_to_pointee<T7>(&t7),
+                        detail::assign_to_pointee<T8>(&t8),
+                        detail::assign_to_pointee<T9>(&t9),
+                        detail::assign_to_pointee<T10>(&t10));
+    }
+    // "ignore" allows tuple positions to be ignored when using "tie".
+
+detail::swallow_assign const ignore = detail::swallow_assign();
+
+} // namespace tuples
+} // namespace boost
+#endif // BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP
diff --git a/3rdParty/Boost/src/boost/tuple/tuple.hpp b/3rdParty/Boost/src/boost/tuple/tuple.hpp
new file mode 100644
index 0000000..7703597
--- /dev/null
+++ b/3rdParty/Boost/src/boost/tuple/tuple.hpp
@@ -0,0 +1,90 @@
+//  tuple.hpp - Boost Tuple Library --------------------------------------
+
+// Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
+//
+// Distributed under 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)
+
+// For more information, see http://www.boost.org
+
+// ----------------------------------------------------------------- 
+
+#ifndef BOOST_TUPLE_HPP
+#define BOOST_TUPLE_HPP
+
+#if defined(__sgi) && defined(_COMPILER_VERSION) && _COMPILER_VERSION <= 730
+// Work around a compiler bug.
+// boost::python::tuple has to be seen by the compiler before the
+// boost::tuple class template.
+namespace boost { namespace python { class tuple; }}
+#endif
+
+#include "boost/config.hpp"
+#include "boost/static_assert.hpp"
+
+#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+// The MSVC version
+#include "boost/tuple/detail/tuple_basic_no_partial_spec.hpp"
+
+#else
+// other compilers
+#include "boost/ref.hpp"
+#include "boost/tuple/detail/tuple_basic.hpp"
+
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+namespace boost {    
+
+using tuples::tuple;
+using tuples::make_tuple;
+using tuples::tie;
+#if !defined(BOOST_NO_USING_TEMPLATE)
+using tuples::get;
+#elif !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+//
+// The "using tuples::get" statement causes the
+// Borland compiler to ICE, use forwarding
+// functions instead:
+//
+template<int N, class HT, class TT>
+inline typename tuples::access_traits<
+                  typename tuples::element<N, tuples::cons<HT, TT> >::type
+                >::non_const_type
+get(tuples::cons<HT, TT>& c) {
+  return tuples::get<N,HT,TT>(c);
+} 
+// get function for const cons-lists, returns a const reference to
+// the element. If the element is a reference, returns the reference
+// as such (that is, can return a non-const reference)
+template<int N, class HT, class TT>
+inline typename tuples::access_traits<
+                  typename tuples::element<N, tuples::cons<HT, TT> >::type
+                >::const_type
+get(const tuples::cons<HT, TT>& c) {
+  return tuples::get<N,HT,TT>(c);
+}
+#else  // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+//
+// MSVC, using declarations don't mix with templates well,
+// so use forwarding functions instead:
+//
+template<int N, typename Head, typename Tail>
+typename tuples::detail::element_ref<N, tuples::cons<Head, Tail> >::RET
+get(tuples::cons<Head, Tail>& t, tuples::detail::workaround_holder<N>* = 0)
+{
+   return tuples::detail::get_class<N>::get(t);
+}
+
+template<int N, typename Head, typename Tail>
+typename tuples::detail::element_const_ref<N, tuples::cons<Head, Tail> >::RET
+get(const tuples::cons<Head, Tail>& t, tuples::detail::workaround_holder<N>* = 0)
+{
+   return tuples::detail::get_class<N>::get(t);
+}
+#endif // BOOST_NO_USING_TEMPLATE
+   
+} // end namespace boost
+
+
+#endif // BOOST_TUPLE_HPP
diff --git a/3rdParty/Boost/src/boost/type_traits/cv_traits.hpp b/3rdParty/Boost/src/boost/type_traits/cv_traits.hpp
new file mode 100644
index 0000000..5bd6c4f
--- /dev/null
+++ b/3rdParty/Boost/src/boost/type_traits/cv_traits.hpp
@@ -0,0 +1,24 @@
+//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
+//  Hinnant & John Maddock 2000.  
+//  Use, modification and distribution are 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).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+//
+//  defines traits classes for cv-qualified types:
+//  is_const, is_volatile, remove_const, remove_volatile, remove_cv.
+
+#ifndef BOOST_TT_CV_TRAITS_HPP_INCLUDED
+#define BOOST_TT_CV_TRAITS_HPP_INCLUDED
+
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/add_volatile.hpp>
+#include <boost/type_traits/add_cv.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/remove_volatile.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+
+#endif // BOOST_TT_CV_TRAITS_HPP_INCLUDED
diff --git a/3rdParty/Boost/update.sh b/3rdParty/Boost/update.sh
index 9af5258..006840b 100755
--- a/3rdParty/Boost/update.sh
+++ b/3rdParty/Boost/update.sh
@@ -33,6 +33,7 @@ fi
 	boost/unordered_map.hpp \
 	boost/algorithm/string.hpp \
 	boost/format.hpp \
+	assign/list_of.hpp \
 	$TARGET_DIR
 
 rm -rf $TARGET_DIR/libs/config
diff --git a/Sluift/Lua/Value.cpp b/Sluift/Lua/Value.cpp
new file mode 100644
index 0000000..b612bd9
--- /dev/null
+++ b/Sluift/Lua/Value.cpp
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2011 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include "Value.h"
+
+extern "C" {
+	#include <lualib.h>
+}
+#include <boost/variant/apply_visitor.hpp>
+#include <Swiften/Base/foreach.h>
+
+using namespace Swift;
+using namespace Swift::Lua;
+
+namespace {
+	struct PushVisitor : public boost::static_visitor<> {
+		PushVisitor(lua_State* state) : state(state) {
+		}
+
+		void operator()(const Nil&) const {
+			lua_pushnil(state);
+		}
+
+		void operator()(const bool& b) const {
+			lua_pushboolean(state, b);
+		}
+
+		void operator()(const int& i) const {
+			lua_pushnumber(state, i);
+		}
+
+		void operator()(const std::string& s) const {
+			lua_pushstring(state, s.c_str());
+		}
+
+		void operator()(const std::vector<Value>& list) const {
+			lua_newtable(state);
+			int i = 0;
+			foreach(const Value& value, list) {
+				boost::apply_visitor(PushVisitor(state), value);
+				lua_rawseti(state, -2, i + 1);
+			}
+		}
+
+		void operator()(const std::map<std::string, boost::shared_ptr<Value> >& table) const {
+			lua_createtable(state, 0, table.size());
+			for(std::map<std::string, boost::shared_ptr<Value> >::const_iterator i = table.begin(); i != table.end(); ++i) {
+				boost::apply_visitor(PushVisitor(state), *i->second);
+				lua_setfield(state, -2, i->first.c_str());
+			}
+		}
+
+		lua_State* state;
+	};
+}
+
+namespace Swift { namespace Lua {
+
+void pushValue(lua_State* state, const Value& value) {
+	boost::apply_visitor(PushVisitor(state), value);
+}
+
+}}
diff --git a/Sluift/Lua/Value.h b/Sluift/Lua/Value.h
new file mode 100644
index 0000000..9b6da34
--- /dev/null
+++ b/Sluift/Lua/Value.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2011 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#pragma once
+
+#include <map>
+#include <string>
+#include <vector>
+#include <boost/variant.hpp>
+#include <boost/shared_ptr.hpp>
+
+struct lua_State;
+
+namespace Swift {
+	namespace Lua {
+		struct Nil {};
+
+		typedef boost::make_recursive_variant<
+				Nil,
+				bool,
+				int, 
+				std::string,
+				std::vector< boost::recursive_variant_ >,
+				std::map<std::string, boost::shared_ptr<boost::recursive_variant_> >
+			>::type Value;
+
+		typedef std::map<std::string, boost::shared_ptr<Value> > Table;
+		
+		void pushValue(lua_State* state, const Value& value);
+	}
+}
diff --git a/Sluift/SConscript b/Sluift/SConscript
index eeb2f24..ec9f690 100644
--- a/Sluift/SConscript
+++ b/Sluift/SConscript
@@ -6,6 +6,7 @@ if env["SCONS_STAGE"] == "build" :
 	lib_env.UseFlags(env["SWIFTEN_FLAGS"])
 	lib_env.UseFlags(env["SWIFTEN_DEP_FLAGS"])
 	sluift_lib = lib_env.StaticLibrary("SluiftCore", [
+			"Lua/Value.cpp",
 			"sluift.cpp"
 		]);
 
diff --git a/Sluift/sluift.cpp b/Sluift/sluift.cpp
index da2c93b..d4692a3 100644
--- a/Sluift/sluift.cpp
+++ b/Sluift/sluift.cpp
@@ -12,6 +12,7 @@ extern "C" {
 #include <iostream>
 #include <string>
 #include <deque>
+#include <boost/assign/list_of.hpp>
 
 #include <Swiften/Client/Client.h>
 #include <Swiften/Client/ClientXMLTracer.h>
@@ -28,6 +29,7 @@ extern "C" {
 #include "Watchdog.h"
 #include "SluiftException.h"
 #include "ResponseSink.h"
+#include "Lua/Value.h"
 
 using namespace Swift;
 
@@ -118,7 +120,7 @@ class SluiftClient {
 			client->setSoftwareVersion(name, version, os);
 		}
 
-		boost::optional<SoftwareVersion> getSoftwareVersion(const JID& jid) {
+		SoftwareVersion::ref getSoftwareVersion(const JID& jid) {
 			ResponseSink<SoftwareVersion> sink;
 			GetSoftwareVersionRequest::ref request = GetSoftwareVersionRequest::create(jid, client->getIQRouter());
 			request->onResponse.connect(boost::ref(sink));
@@ -126,7 +128,7 @@ class SluiftClient {
 			while (!sink.hasResponse()) {
 				eventLoop.runUntilEvents();
 			}
-			return sink.getResponsePayload() ? *sink.getResponsePayload() : boost::optional<SoftwareVersion>();
+			return sink.getResponsePayload();
 		}
 
 		Stanza::ref getNextEvent(int timeout) {
@@ -256,15 +258,8 @@ static int sluift_client_set_version(lua_State *L) {
 static int sluift_client_get_roster(lua_State *L) {
 	try {
 		SluiftClient* client = getClient(L);
-		std::vector<XMPPRosterItem> items = client->getRoster();
-
-		lua_createtable(L, 0, items.size());
-		foreach(const XMPPRosterItem& item, items) {
-			lua_createtable(L, 0, 3);
-
-			lua_pushstring(L, item.getName().c_str());
-			lua_setfield(L, -2, "name");
-
+		Lua::Table rosterTable;
+		foreach(const XMPPRosterItem& item, client->getRoster()) {
 			std::string subscription;
 			switch(item.getSubscription()) {
 				case RosterItemPayload::None: subscription = "none"; break;
@@ -273,19 +268,14 @@ static int sluift_client_get_roster(lua_State *L) {
 				case RosterItemPayload::Both: subscription = "both"; break;
 				case RosterItemPayload::Remove: subscription = "remove"; break;
 			}
-			lua_pushstring(L, subscription.c_str());
-			lua_setfield(L, -2, "subscription");
-
-			std::vector<std::string> groups = item.getGroups();
-			lua_createtable(L, groups.size(), 0);
-			for (size_t i = 0; i < groups.size(); ++i) {
-				lua_pushstring(L, groups[i].c_str());
-				lua_rawseti(L, -2, i + 1);
-			}
-			lua_setfield(L, -2, "groups");
-
-			lua_setfield(L, -2, item.getJID().toString().c_str());
+			Lua::Value groups(std::vector<Lua::Value>(item.getGroups().begin(), item.getGroups().end()));
+			Lua::Table itemTable = boost::assign::map_list_of
+				("name", boost::make_shared<Lua::Value>(item.getName()))
+				("subscription", boost::make_shared<Lua::Value>(subscription))
+				("groups", boost::make_shared<Lua::Value>(std::vector<Lua::Value>(item.getGroups().begin(), item.getGroups().end())));
+			rosterTable[item.getJID().toString()] = boost::make_shared<Lua::Value>(itemTable);
 		}
+		pushValue(L, rosterTable);
 		return 1;
 	}
 	catch (const SluiftException& e) {
@@ -297,16 +287,13 @@ static int sluift_client_get_version(lua_State *L) {
 	try {
 		SluiftClient* client = getClient(L);
 		JID jid(std::string(luaL_checkstring(L, 2)));
-
-		boost::optional<SoftwareVersion> version = client->getSoftwareVersion(jid);
+		SoftwareVersion::ref version = client->getSoftwareVersion(jid);
 		if (version) {
-			lua_createtable(L, 0, 3);
-			lua_pushstring(L, version->getName().c_str());
-			lua_setfield(L, -2, "name");
-			lua_pushstring(L, version->getVersion().c_str());
-			lua_setfield(L, -2, "version");
-			lua_pushstring(L, version->getOS().c_str());
-			lua_setfield(L, -2, "os");
+			Lua::Table result = boost::assign::map_list_of
+				("name", boost::make_shared<Lua::Value>(version->getName()))
+				("version", boost::make_shared<Lua::Value>(version->getVersion()))
+				("os", boost::make_shared<Lua::Value>(version->getOS()));
+			Lua::pushValue(L, result);
 		}
 		else {
 			lua_pushnil(L);
@@ -382,22 +369,18 @@ static int sluift_client_set_options(lua_State* L) {
 
 static void pushEvent(lua_State* L, Stanza::ref event) {
 	if (Message::ref message = boost::dynamic_pointer_cast<Message>(event)) {
-		lua_createtable(L, 0, 3);
-		lua_pushliteral(L, "message");
-		lua_setfield(L, -2, "type");
-		lua_pushstring(L, message->getFrom().toString().c_str());
-		lua_setfield(L, -2, "from");
-		lua_pushstring(L, message->getBody().c_str());
-		lua_setfield(L, -2, "body");
+		Lua::Table result = boost::assign::map_list_of
+			("type", boost::make_shared<Lua::Value>("message"))
+			("from", boost::make_shared<Lua::Value>(message->getFrom().toString()))
+			("body", boost::make_shared<Lua::Value>(message->getBody()));
+		Lua::pushValue(L, result);
 	}
 	else if (Presence::ref presence = boost::dynamic_pointer_cast<Presence>(event)) {
-		lua_createtable(L, 0, 3);
-		lua_pushliteral(L, "presence");
-		lua_setfield(L, -2, "type");
-		lua_pushstring(L, presence->getFrom().toString().c_str());
-		lua_setfield(L, -2, "from");
-		lua_pushstring(L, presence->getStatus().c_str());
-		lua_setfield(L, -2, "status");
+		Lua::Table result = boost::assign::map_list_of
+			("type", boost::make_shared<Lua::Value>("presence"))
+			("from", boost::make_shared<Lua::Value>(presence->getFrom().toString()))
+			("status", boost::make_shared<Lua::Value>(presence->getStatus()));
+		Lua::pushValue(L, result);
 	}
 	else {
 		lua_pushnil(L);
diff --git a/Swiften/Elements/SoftwareVersion.h b/Swiften/Elements/SoftwareVersion.h
index 26d49b1..5863b38 100644
--- a/Swiften/Elements/SoftwareVersion.h
+++ b/Swiften/Elements/SoftwareVersion.h
@@ -4,8 +4,7 @@
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
 
-#ifndef SWIFTEN_SoftwareVersion_H
-#define SWIFTEN_SoftwareVersion_H
+#pragma once
 
 #include "Swiften/Elements/Payload.h"
 #include <string>
@@ -13,6 +12,8 @@
 namespace Swift {
 	class SoftwareVersion : public Payload {
 		public:
+			typedef boost::shared_ptr<SoftwareVersion> ref;
+
 			SoftwareVersion(
 					const std::string& name = "", 
 					const std::string& version = "",
@@ -49,5 +50,3 @@ namespace Swift {
 			std::string os_;
 	};
 }
-
-#endif
-- 
cgit v0.10.2-6-g49f6