2007-10-21 00:52:09 +00:00
|
|
|
/*=============================================================================
|
|
|
|
Copyright (c) 2001-2006 Joel de Guzman
|
|
|
|
|
2007-10-23 23:29:08 +00:00
|
|
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
2007-10-21 00:52:09 +00:00
|
|
|
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 <boost/fusion/container/vector/vector_fwd.hpp>
|
|
|
|
#include <boost/fusion/container/vector/detail/vector_n_chooser.hpp>
|
|
|
|
#include <boost/fusion/sequence/intrinsic/begin.hpp>
|
|
|
|
#include <boost/mpl/at.hpp>
|
|
|
|
#include <boost/mpl/bool.hpp>
|
|
|
|
#include <boost/type_traits/add_reference.hpp>
|
|
|
|
#include <boost/type_traits/add_const.hpp>
|
|
|
|
#include <boost/type_traits/is_base_of.hpp>
|
|
|
|
#include <boost/detail/workaround.hpp>
|
|
|
|
|
|
|
|
namespace boost { namespace fusion
|
|
|
|
{
|
|
|
|
struct void_;
|
|
|
|
struct fusion_sequence_tag;
|
|
|
|
|
|
|
|
template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, typename T)>
|
2007-10-23 23:29:08 +00:00
|
|
|
struct vector
|
2007-10-21 00:52:09 +00:00
|
|
|
: sequence_base<vector<BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, T)> >
|
|
|
|
{
|
|
|
|
private:
|
2007-10-23 23:29:08 +00:00
|
|
|
|
2007-10-21 00:52:09 +00:00
|
|
|
typedef typename detail::vector_n_chooser<
|
|
|
|
BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, T)>::type
|
|
|
|
vector_n;
|
|
|
|
|
|
|
|
template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, typename U)>
|
|
|
|
friend struct vector;
|
|
|
|
|
|
|
|
public:
|
2007-10-23 23:29:08 +00:00
|
|
|
|
2007-10-21 00:52:09 +00:00
|
|
|
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 <BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, typename U)>
|
|
|
|
vector(vector<BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, U)> const& rhs)
|
|
|
|
: vec(rhs.vec) {}
|
|
|
|
|
|
|
|
vector(vector const& rhs)
|
|
|
|
: vec(rhs.vec) {}
|
|
|
|
|
|
|
|
template <typename Sequence>
|
|
|
|
vector(Sequence const& rhs)
|
2010-04-22 13:15:01 +00:00
|
|
|
#if BOOST_WORKAROUND(BOOST_MSVC, <= 1600)
|
2007-10-21 00:52:09 +00:00
|
|
|
: vec(ctor_helper(rhs, is_base_of<vector, Sequence>())) {}
|
|
|
|
#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<T0>::type _0
|
|
|
|
// , typename detail::call_param<T1>::type _1)
|
|
|
|
// : vec(_0, _1) {}
|
|
|
|
#include <boost/fusion/container/vector/detail/vector_forward_ctor.hpp>
|
|
|
|
|
|
|
|
template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, typename U)>
|
|
|
|
vector&
|
|
|
|
operator=(vector<BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, U)> const& rhs)
|
|
|
|
{
|
|
|
|
vec = rhs.vec;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
vector&
|
|
|
|
operator=(T const& rhs)
|
|
|
|
{
|
|
|
|
vec = rhs;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <int N>
|
|
|
|
typename add_reference<
|
|
|
|
typename mpl::at_c<types, N>::type
|
|
|
|
>::type
|
|
|
|
at_impl(mpl::int_<N> index)
|
2007-10-23 23:29:08 +00:00
|
|
|
{
|
|
|
|
return vec.at_impl(index);
|
2007-10-21 00:52:09 +00:00
|
|
|
}
|
2007-10-23 23:29:08 +00:00
|
|
|
|
2007-10-21 00:52:09 +00:00
|
|
|
template <int N>
|
|
|
|
typename add_reference<
|
|
|
|
typename add_const<
|
|
|
|
typename mpl::at_c<types, N>::type
|
|
|
|
>::type
|
|
|
|
>::type
|
|
|
|
at_impl(mpl::int_<N> index) const
|
2007-10-23 23:29:08 +00:00
|
|
|
{
|
|
|
|
return vec.at_impl(index);
|
2007-10-21 00:52:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename I>
|
|
|
|
typename add_reference<
|
|
|
|
typename mpl::at<types, I>::type
|
|
|
|
>::type
|
2010-06-12 15:58:31 +00:00
|
|
|
at_impl(I /*index*/)
|
2007-10-23 23:29:08 +00:00
|
|
|
{
|
|
|
|
return vec.at_impl(mpl::int_<I::value>());
|
2007-10-21 00:52:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template<typename I>
|
|
|
|
typename add_reference<
|
|
|
|
typename add_const<
|
|
|
|
typename mpl::at<types, I>::type
|
|
|
|
>::type
|
|
|
|
>::type
|
2010-06-12 15:58:31 +00:00
|
|
|
at_impl(I /*index*/) const
|
2007-10-23 23:29:08 +00:00
|
|
|
{
|
2007-10-21 00:52:09 +00:00
|
|
|
return vec.at_impl(mpl::int_<I::value>());
|
2007-10-23 23:29:08 +00:00
|
|
|
}
|
2007-10-21 00:52:09 +00:00
|
|
|
|
|
|
|
private:
|
2007-10-23 23:29:08 +00:00
|
|
|
|
2010-04-22 13:15:01 +00:00
|
|
|
#if BOOST_WORKAROUND(BOOST_MSVC, <= 1600)
|
2007-10-23 23:29:08 +00:00
|
|
|
static vector_n const&
|
2007-10-21 00:52:09 +00:00
|
|
|
ctor_helper(vector const& rhs, mpl::true_)
|
|
|
|
{
|
|
|
|
return rhs.vec;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T>
|
2007-10-23 23:29:08 +00:00
|
|
|
static T const&
|
2007-10-21 00:52:09 +00:00
|
|
|
ctor_helper(T const& rhs, mpl::false_)
|
|
|
|
{
|
|
|
|
return rhs;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
vector_n vec;
|
|
|
|
};
|
|
|
|
}}
|
|
|
|
|
|
|
|
#endif
|