/*============================================================================= Copyright (c) 2001-2006 Joel de Guzman 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) ==============================================================================*/ #if !defined(FUSION_VECTOR_07072005_1244) #define FUSION_VECTOR_07072005_1244 #include #include #include #include #include #include #include #include #include namespace boost { namespace fusion { struct void_; struct fusion_sequence_tag; template struct vector : sequence_base > { private: typedef typename detail::vector_n_chooser< BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, T)>::type vector_n; template friend struct vector; public: typedef typename vector_n::types types; typedef typename vector_n::fusion_tag fusion_tag; typedef typename vector_n::tag tag; typedef typename vector_n::size size; typedef typename vector_n::category category; typedef typename vector_n::is_view is_view; vector() : vec() {} template vector(vector const& rhs) : vec(rhs.vec) {} vector(vector const& rhs) : vec(rhs.vec) {} template vector(Sequence const& rhs) #if BOOST_WORKAROUND(BOOST_MSVC, <= 1600) : vec(ctor_helper(rhs, is_base_of())) {} #else : vec(rhs) {} #endif // Expand a couple of forwarding constructors for arguments // of type (T0), (T0, T1), (T0, T1, T2) etc. Example: // // vector( // typename detail::call_param::type _0 // , typename detail::call_param::type _1) // : vec(_0, _1) {} #include template vector& operator=(vector const& rhs) { vec = rhs.vec; return *this; } template vector& operator=(T const& rhs) { vec = rhs; return *this; } template typename add_reference< typename mpl::at_c::type >::type at_impl(mpl::int_ index) { return vec.at_impl(index); } template typename add_reference< typename add_const< typename mpl::at_c::type >::type >::type at_impl(mpl::int_ index) const { return vec.at_impl(index); } template typename add_reference< typename mpl::at::type >::type at_impl(I /*index*/) { return vec.at_impl(mpl::int_()); } template typename add_reference< typename add_const< typename mpl::at::type >::type >::type at_impl(I /*index*/) const { return vec.at_impl(mpl::int_()); } private: #if BOOST_WORKAROUND(BOOST_MSVC, <= 1600) static vector_n const& ctor_helper(vector const& rhs, mpl::true_) { return rhs.vec; } template static T const& ctor_helper(T const& rhs, mpl::false_) { return rhs; } #endif vector_n vec; }; }} #endif