diff options
-rw-r--r-- | 3rdParty/Boost/src/boost/assign/assignment_exception.hpp | 43 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/assign/list_of.hpp | 681 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/tuple/detail/tuple_basic.hpp | 953 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/tuple/detail/tuple_basic_no_partial_spec.hpp | 841 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/tuple/tuple.hpp | 90 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/type_traits/cv_traits.hpp | 24 | ||||
-rwxr-xr-x | 3rdParty/Boost/update.sh | 1 | ||||
-rw-r--r-- | Sluift/Lua/Value.cpp | 66 | ||||
-rw-r--r-- | Sluift/Lua/Value.h | 34 | ||||
-rw-r--r-- | Sluift/SConscript | 1 | ||||
-rw-r--r-- | Sluift/sluift.cpp | 75 | ||||
-rw-r--r-- | Swiften/Elements/SoftwareVersion.h | 7 |
12 files changed, 2766 insertions, 50 deletions
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 |