From 5e3d1282540fbdf14d37eb14729dc87b343b24ac Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Sat, 29 Nov 2003 17:49:36 +0000 Subject: [PATCH] vc6 workarounds [SVN r21005] --- include/boost/multi_array/base.hpp | 86 ++++++++++++++++++++------ include/boost/multi_array/iterator.hpp | 60 +++++++++++------- include/boost/multi_array/subarray.hpp | 2 +- 3 files changed, 107 insertions(+), 41 deletions(-) diff --git a/include/boost/multi_array/base.hpp b/include/boost/multi_array/base.hpp index 905e4a5..286e54c 100644 --- a/include/boost/multi_array/base.hpp +++ b/include/boost/multi_array/base.hpp @@ -27,6 +27,8 @@ #include "boost/config.hpp" #include "boost/mpl/apply_if.hpp" #include "boost/mpl/if.hpp" +#include "boost/mpl/size_t.hpp" +#include "boost/mpl/aux_/msvc_eti_base.hpp" #include "boost/iterator/reverse_iterator.hpp" #include "boost/static_assert.hpp" #include "boost/type.hpp" @@ -78,7 +80,7 @@ class sub_array; template class const_sub_array; -template +template class array_iterator; template @@ -183,20 +185,60 @@ struct choose_value_accessor_n { typedef value_accessor_n type; }; -template +template struct choose_value_accessor_one { typedef value_accessor_one type; }; -template +template struct value_accessor_generator { + BOOST_STATIC_CONSTANT(std::size_t, dimensionality = NumDims::value); + typedef typename - mpl::apply_if_c<(NumDims == 1), - choose_value_accessor_one, - choose_value_accessor_n + mpl::apply_if_c<(dimensionality == 1), + choose_value_accessor_one, + choose_value_accessor_n >::type type; }; +#if BOOST_WORKAROUND(BOOST_MSVC, == 1200) + +struct eti_value_accessor +{ + typedef int index; + typedef int size_type; + typedef int element; + typedef int index_range; + typedef int value_type; + typedef int reference; + typedef int const_reference; +}; + +template <> +struct value_accessor_generator +{ + typedef eti_value_accessor type; +}; + +template +struct associated_types + : mpl::aux::msvc_eti_base< + typename value_accessor_generator::type + >::type +{}; + +template <> +struct associated_types : eti_value_accessor {}; + +#else + +template +struct associated_types + : value_accessor_generator::type +{}; + +#endif + // // choose value accessor ends ///////////////////////////////////////////////////////////////////////// @@ -207,17 +249,25 @@ struct value_accessor_generator { // multi_array_base //////////////////////////////////////////////////////////////////////// template -class multi_array_impl_base : - public value_accessor_generator::type { - typedef typename value_accessor_generator::type super_type; +class multi_array_impl_base + : +#if BOOST_WORKAROUND(BOOST_MSVC, == 1200) + public mpl::aux::msvc_eti_base< + typename value_accessor_generator >::type + >::type +#else + public value_accessor_generator >::type +#endif +{ + typedef associated_types > types; public: - typedef typename super_type::index index; - typedef typename super_type::size_type size_type; - typedef typename super_type::element element; - typedef typename super_type::index_range index_range; - typedef typename super_type::value_type value_type; - typedef typename super_type::reference reference; - typedef typename super_type::const_reference const_reference; + typedef typename types::index index; + typedef typename types::size_type size_type; + typedef typename types::element element; + typedef typename types::index_range index_range; + typedef typename types::value_type value_type; + typedef typename types::reference reference; + typedef typename types::const_reference const_reference; template struct subarray { @@ -243,8 +293,8 @@ public: // // iterator support // - typedef array_iterator iterator; - typedef array_iterator const_iterator; + typedef array_iterator,reference> iterator; + typedef array_iterator,const_reference> const_iterator; typedef ::boost::reverse_iterator reverse_iterator; typedef ::boost::reverse_iterator const_reverse_iterator; diff --git a/include/boost/multi_array/iterator.hpp b/include/boost/multi_array/iterator.hpp index 2e933cf..5d89239 100644 --- a/include/boost/multi_array/iterator.hpp +++ b/include/boost/multi_array/iterator.hpp @@ -20,6 +20,7 @@ #include "boost/multi_array/base.hpp" #include "boost/iterator/iterator_facade.hpp" +#include "boost/mpl/aux_/msvc_eti_base.hpp" #include #include @@ -42,34 +43,47 @@ struct operator_arrow_proxy mutable T value_; }; +template +class array_iterator; -template -class array_iterator : - public iterator_facade< - array_iterator, - typename value_accessor_generator::type::value_type, - boost::random_access_traversal_tag, - Reference - >, - private value_accessor_generator::type +template +class array_iterator + : public + iterator_facade< + array_iterator + , typename associated_types::value_type + , boost::random_access_traversal_tag + , Reference + > + , private +#if BOOST_WORKAROUND(BOOST_MSVC,==1200) + mpl::aux::msvc_eti_base::type +#if BOOST_WORKAROUND(BOOST_MSVC,==1200) + >::type +#endif { friend class iterator_core_access; - template - friend class array_iterator; + typedef detail::multi_array::associated_types access_t; - typedef typename value_accessor_generator::type access_t; + typedef iterator_facade< + array_iterator + , typename detail::multi_array::associated_types::value_type + , boost::random_access_traversal_tag + , Reference + > facade_type; - typedef iterator_facade< - array_iterator, - typename access_t::value_type, - ::boost::random_access_traversal_tag, - Reference - > facade_type; - - typedef typename value_accessor_generator::type access_t; typedef typename access_t::index index; typedef typename access_t::size_type size_type; +#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS + template + friend class array_iterator; +#else + public: +#endif + index idx_; TPtr base_; const size_type* extents_; @@ -107,8 +121,10 @@ public: } - reference dereference() const { - return access_t::access(boost::type(), + reference dereference() const + { + typedef typename value_accessor_generator::type accessor; + return accessor::access(boost::type(), idx_, base_, extents_, diff --git a/include/boost/multi_array/subarray.hpp b/include/boost/multi_array/subarray.hpp index 731c06d..dd5f9b5 100644 --- a/include/boost/multi_array/subarray.hpp +++ b/include/boost/multi_array/subarray.hpp @@ -228,8 +228,8 @@ struct disable_non_sub_array_impl template struct disable_non_sub_array - : disable_non_sub_array_impl::value> { + typedef typename disable_non_sub_array_impl::value>::type type; }; #endif