vrshoot

diff libs/assimp/boost/tuple/tuple.hpp @ 0:b2f14e535253

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 01 Feb 2014 19:58:19 +0200
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/libs/assimp/boost/tuple/tuple.hpp	Sat Feb 01 19:58:19 2014 +0200
     1.3 @@ -0,0 +1,283 @@
     1.4 +// A very small replacement for boost::tuple
     1.5 +// (c) Alexander Gessler, 2008 [alexander.gessler@gmx.net]
     1.6 +
     1.7 +#ifndef BOOST_TUPLE_INCLUDED
     1.8 +#define BOOST_TUPLE_INCLUDED
     1.9 +
    1.10 +namespace boost	{
    1.11 +	namespace detail	{
    1.12 +
    1.13 +		// Represents an empty tuple slot (up to 5 supported)
    1.14 +		struct nulltype {};
    1.15 +
    1.16 +		// For readable error messages
    1.17 +		struct tuple_component_idx_out_of_bounds;
    1.18 +
    1.19 +		// To share some code for the const/nonconst versions of the getters
    1.20 +		template <bool b, typename T>
    1.21 +		struct ConstIf {
    1.22 +			typedef T t;
    1.23 +		};
    1.24 +
    1.25 +		template <typename T>
    1.26 +		struct ConstIf<true,T> {
    1.27 +			typedef const T t;
    1.28 +		};
    1.29 +
    1.30 +		// Predeclare some stuff
    1.31 +		template <typename, unsigned, typename, bool, unsigned> struct value_getter;
    1.32 +
    1.33 +		// Helper to obtain the type of a tuple element
    1.34 +		template <typename T, unsigned NIDX, typename TNEXT, unsigned N /*= 0*/>
    1.35 +		struct type_getter	{
    1.36 +			typedef type_getter<typename TNEXT::type,NIDX+1,typename TNEXT::next_type,N> next_elem_getter;
    1.37 +			typedef typename next_elem_getter::type type;
    1.38 +		};
    1.39 +
    1.40 +		template <typename T, unsigned NIDX, typename TNEXT >
    1.41 +		struct type_getter <T,NIDX,TNEXT,NIDX>	{
    1.42 +			typedef T type;
    1.43 +		};
    1.44 +
    1.45 +		// Base class for all explicit specializations of list_elem
    1.46 +		template <typename T, unsigned NIDX, typename TNEXT >
    1.47 +		struct list_elem_base {
    1.48 +
    1.49 +			// Store template parameters
    1.50 +			typedef TNEXT next_type;
    1.51 +			typedef T type;
    1.52 +
    1.53 +			static const unsigned nidx = NIDX;
    1.54 +		};
    1.55 +
    1.56 +		// Represents an element in the tuple component list
    1.57 +		template <typename T, unsigned NIDX, typename TNEXT >
    1.58 +		struct list_elem : list_elem_base<T,NIDX,TNEXT>{
    1.59 +
    1.60 +			// Real members
    1.61 +			T me;
    1.62 +			TNEXT next;
    1.63 +
    1.64 +			// Get the value of a specific tuple element
    1.65 +			template <unsigned N>
    1.66 +			typename type_getter<T,NIDX,TNEXT,N>::type& get () {
    1.67 +				value_getter <T,NIDX,TNEXT,false,N> s;
    1.68 +				return s(*this);
    1.69 +			}
    1.70 +
    1.71 +			// Get the value of a specific tuple element
    1.72 +			template <unsigned N>
    1.73 +			const typename type_getter<T,NIDX,TNEXT,N>::type& get () const {
    1.74 +				value_getter <T,NIDX,TNEXT,true,N> s;
    1.75 +				return s(*this);
    1.76 +			}
    1.77 +
    1.78 +			// Explicit cast
    1.79 +			template <typename T2, typename TNEXT2 >
    1.80 +			operator list_elem<T2,NIDX,TNEXT2> () const	{
    1.81 +				list_elem<T2,NIDX,TNEXT2> ret;
    1.82 +				ret.me   = (T2)me;
    1.83 +				ret.next = next;
    1.84 +				return ret;
    1.85 +			}
    1.86 +
    1.87 +			// Recursively compare two elements (last element returns always true)
    1.88 +			bool operator == (const list_elem& s) const	{
    1.89 +				return (me == s.me && next == s.next);
    1.90 +			}
    1.91 +		};
    1.92 +
    1.93 +		// Represents a non-used tuple element - the very last element processed
    1.94 +		template <typename TNEXT, unsigned NIDX  >
    1.95 +		struct list_elem<nulltype,NIDX,TNEXT> : list_elem_base<nulltype,NIDX,TNEXT> {
    1.96 +			template <unsigned N, bool IS_CONST = true> struct value_getter		{
    1.97 +				/* just dummy members to produce readable error messages */
    1.98 +				tuple_component_idx_out_of_bounds operator () (typename ConstIf<IS_CONST,list_elem>::t& me);
    1.99 +			};
   1.100 +			template <unsigned N> struct type_getter  {
   1.101 +				/* just dummy members to produce readable error messages */
   1.102 +				typedef tuple_component_idx_out_of_bounds type;
   1.103 +			};
   1.104 +
   1.105 +			// dummy
   1.106 +			list_elem& operator = (const list_elem& other)	{
   1.107 +				return *this;
   1.108 +			}
   1.109 +
   1.110 +			// dummy
   1.111 +			bool operator == (const list_elem& other)	{
   1.112 +				return true;
   1.113 +			}
   1.114 +		};
   1.115 +
   1.116 +		// Represents the absolute end of the list
   1.117 +		typedef list_elem<nulltype,0,int> list_end;
   1.118 +
   1.119 +		// Helper obtain to query the value of a tuple element
   1.120 +		// NOTE: This can't be a nested class as the compiler won't accept a full or
   1.121 +		// partial specialization of a nested class of a non-specialized template
   1.122 +		template <typename T, unsigned NIDX, typename TNEXT, bool IS_CONST, unsigned N>
   1.123 +		struct value_getter	 {
   1.124 +
   1.125 +			// calling list_elem
   1.126 +			typedef list_elem<T,NIDX,TNEXT> outer_elem;
   1.127 +
   1.128 +			// typedef for the getter for next element
   1.129 +			typedef value_getter<typename TNEXT::type,NIDX+1,typename TNEXT::next_type,
   1.130 +				IS_CONST, N> next_value_getter;
   1.131 +
   1.132 +			typename ConstIf<IS_CONST,typename type_getter<T,NIDX,TNEXT,N>::type>::t&
   1.133 +				operator () (typename ConstIf<IS_CONST,outer_elem >::t& me) {
   1.134 +
   1.135 +				next_value_getter s;
   1.136 +				return s(me.next);
   1.137 +			}
   1.138 +		};
   1.139 +
   1.140 +		template <typename T, unsigned NIDX, typename TNEXT, bool IS_CONST>
   1.141 +		struct value_getter <T,NIDX,TNEXT,IS_CONST,NIDX>	{
   1.142 +			typedef list_elem<T,NIDX,TNEXT> outer_elem;
   1.143 +
   1.144 +			typename ConstIf<IS_CONST,T>::t& operator () (typename ConstIf<IS_CONST,outer_elem >::t& me) {
   1.145 +				return me.me;
   1.146 +			}
   1.147 +		};
   1.148 +	};
   1.149 +
   1.150 +	// A very minimal implementation for up to 5 elements
   1.151 +	template <typename T0  = detail::nulltype,
   1.152 +		      typename T1  = detail::nulltype,
   1.153 +			  typename T2  = detail::nulltype,
   1.154 +			  typename T3  = detail::nulltype,
   1.155 +			  typename T4  = detail::nulltype>
   1.156 +	class tuple	{
   1.157 +
   1.158 +		template <typename T0b,
   1.159 +		      typename T1b,
   1.160 +			  typename T2b,
   1.161 +			  typename T3b,
   1.162 +			  typename T4b >
   1.163 +		friend class tuple;
   1.164 +
   1.165 +	private:
   1.166 +
   1.167 +		typedef detail::list_elem<T0,0,
   1.168 +					detail::list_elem<T1,1,
   1.169 +						detail::list_elem<T2,2,
   1.170 +							detail::list_elem<T3,3,
   1.171 +								detail::list_elem<T4,4,
   1.172 +									detail::list_end > > > > > very_long;
   1.173 +
   1.174 +		very_long m;
   1.175 +
   1.176 +	public:
   1.177 +
   1.178 +		// Get a specific tuple element
   1.179 +		template <unsigned N>
   1.180 +		typename detail::type_getter<T0,0,typename very_long::next_type, N>::type& get ()	{
   1.181 +			return m.template get<N>();
   1.182 +		}
   1.183 +
   1.184 +		// ... and the const version
   1.185 +		template <unsigned N>
   1.186 +		const typename detail::type_getter<T0,0,typename very_long::next_type, N>::type& get () const	{
   1.187 +			return m.template get<N>();
   1.188 +		}
   1.189 +
   1.190 +
   1.191 +		// comparison operators
   1.192 +		bool operator== (const tuple& other) const	{
   1.193 +			return m == other.m;
   1.194 +		}
   1.195 +
   1.196 +		// ... and the other way round
   1.197 +		bool operator!= (const tuple& other) const	{
   1.198 +			return !(m == other.m);
   1.199 +		}
   1.200 +
   1.201 +		// cast to another tuple - all single elements must be convertible
   1.202 +		template <typename T0b, typename T1b,typename T2b,typename T3b, typename T4b>
   1.203 +		operator tuple <T0b,T1b,T2b,T3b,T4b> () const {
   1.204 +			tuple <T0b,T1b,T2b,T3b,T4b> s;
   1.205 +			s.m = (typename tuple <T0b,T1b,T2b,T3b,T4b>::very_long)m;
   1.206 +			return s;
   1.207 +		}
   1.208 +	};
   1.209 +
   1.210 +	// Another way to access an element ...
   1.211 +	template <unsigned N,typename T0,typename T1,typename T2,typename T3,typename T4>
   1.212 +	inline typename tuple<T0,T1,T2,T3,T4>::very_long::template type_getter<N>::type& get (
   1.213 +			tuple<T0,T1,T2,T3,T4>& m)	{
   1.214 +			return m.template get<N>();
   1.215 +		}
   1.216 +
   1.217 +	// ... and the const version
   1.218 +	template <unsigned N,typename T0,typename T1,typename T2,typename T3,typename T4>
   1.219 +	inline const typename tuple<T0,T1,T2,T3,T4>::very_long::template type_getter<N>::type& get (
   1.220 +			const tuple<T0,T1,T2,T3,T4>& m)	{
   1.221 +			return m.template get<N>();
   1.222 +		}
   1.223 +
   1.224 +	// Constructs a tuple with 5 elements
   1.225 +	template <typename T0,typename T1,typename T2,typename T3,typename T4>
   1.226 +	inline tuple <T0,T1,T2,T3,T4> make_tuple (const T0& t0,
   1.227 +		const T1& t1,const T2& t2,const T3& t3,const T4& t4) {
   1.228 +
   1.229 +		tuple <T0,T1,T2,T3,T4> t;
   1.230 +		t.template get<0>() = t0;
   1.231 +		t.template get<1>() = t1;
   1.232 +		t.template get<2>() = t2;
   1.233 +		t.template get<3>() = t3;
   1.234 +		t.template get<4>() = t4;
   1.235 +		return t;
   1.236 +	}
   1.237 +
   1.238 +	// Constructs a tuple with 4 elements
   1.239 +	template <typename T0,typename T1,typename T2,typename T3>
   1.240 +	inline tuple <T0,T1,T2,T3> make_tuple (const T0& t0,
   1.241 +		const T1& t1,const T2& t2,const T3& t3) {
   1.242 +		tuple <T0,T1,T2,T3> t;
   1.243 +		t.template get<0>() = t0;
   1.244 +		t.template get<1>() = t1;
   1.245 +		t.template get<2>() = t2;
   1.246 +		t.template get<3>() = t3;
   1.247 +		return t;
   1.248 +	}
   1.249 +
   1.250 +	// Constructs a tuple with 3 elements
   1.251 +	template <typename T0,typename T1,typename T2>
   1.252 +	inline tuple <T0,T1,T2> make_tuple (const T0& t0,
   1.253 +		const T1& t1,const T2& t2) {
   1.254 +		tuple <T0,T1,T2> t;
   1.255 +		t.template get<0>() = t0;
   1.256 +		t.template get<1>() = t1;
   1.257 +		t.template get<2>() = t2;
   1.258 +		return t;
   1.259 +	}
   1.260 +
   1.261 +	// Constructs a tuple with 2 elements 
   1.262 +	template <typename T0,typename T1>
   1.263 +	inline tuple <T0,T1> make_tuple (const T0& t0,
   1.264 +		const T1& t1) {
   1.265 +		tuple <T0,T1> t;
   1.266 +		t.template get<0>() = t0;
   1.267 +		t.template get<1>() = t1;
   1.268 +		return t;
   1.269 +	}
   1.270 +
   1.271 +	// Constructs a tuple with 1 elements (well ...)
   1.272 +	template <typename T0>
   1.273 +	inline tuple <T0> make_tuple (const T0& t0) {
   1.274 +		tuple <T0> t;
   1.275 +		t.template get<0>() = t0;
   1.276 +		return t;
   1.277 +	}
   1.278 +
   1.279 +	// Constructs a tuple with 0 elements (well ...)
   1.280 +	inline tuple <> make_tuple () {
   1.281 +		tuple <> t;
   1.282 +		return t;
   1.283 +	}
   1.284 +};
   1.285 +
   1.286 +#endif // !! BOOST_TUPLE_INCLUDED