From 2ae513cc22e1cb9cc2679488537672ec48bda55e Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Tue, 16 Apr 2013 15:12:29 +0300 Subject: Fix compilation error in a _DEBUG build with MSVC2010 and 2012 See https://svn.boost.org/trac/boost/ticket/4874 , http://stackoverflow.com/questions/4870172/boostmulti-array-resize-doesnt-work , http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/3c9eac4f-86e4-490b-bbde-dbd70176b0f8 . Patch from https://svn.boost.org/trac/boost/changeset/78496 Change-Id: I933499ad1295925aa41c9c40b96ac4c4312398c2 --- boost/boost.4874.patch | 132 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 boost/boost.4874.patch (limited to 'boost/boost.4874.patch') diff --git a/boost/boost.4874.patch b/boost/boost.4874.patch new file mode 100644 index 000000000000..c4d1c442ec5a --- /dev/null +++ b/boost/boost.4874.patch @@ -0,0 +1,132 @@ +Index: branches/release/boost/multi_array/base.hpp +=================================================================== +--- a/branches/release/boost/multi_array/base.hpp ++++ b/branches/release/boost/multi_array/base.hpp +@@ -82,5 +82,6 @@ + class const_sub_array; + +-template ++ template + class array_iterator; + +@@ -252,5 +253,17 @@ + ///////////////////////////////////////////////////////////////////////// + +- ++// Due to some imprecision in the C++ Standard, ++// MSVC 2010 is broken in debug mode: it requires ++// that an Output Iterator have output_iterator_tag in its iterator_category if ++// that iterator is not bidirectional_iterator or random_access_iterator. ++#if BOOST_WORKAROUND(BOOST_MSVC, >= 1600) ++struct mutable_iterator_tag ++ : boost::random_access_traversal_tag, std::input_iterator_tag ++{ ++ operator std::output_iterator_tag() const { ++ return std::output_iterator_tag(); ++ } ++}; ++#endif + + //////////////////////////////////////////////////////////////////////// +@@ -302,6 +315,14 @@ + // iterator support + // +- typedef array_iterator,reference> iterator; +- typedef array_iterator,const_reference> const_iterator; ++#if BOOST_WORKAROUND(BOOST_MSVC, >= 1600) ++ // Deal with VC 2010 output_iterator_tag requirement ++ typedef array_iterator,reference, ++ mutable_iterator_tag> iterator; ++#else ++ typedef array_iterator,reference, ++ boost::random_access_traversal_tag> iterator; ++#endif ++ typedef array_iterator,const_reference, ++ boost::random_access_traversal_tag> const_iterator; + + typedef ::boost::reverse_iterator reverse_iterator; +@@ -322,5 +343,6 @@ + const index* strides, + const index* index_bases) const { +- ++ boost::function_requires< ++ CollectionConcept >(); + ignore_unused_variable_warning(index_bases); + ignore_unused_variable_warning(extents); +@@ -333,7 +355,13 @@ + + index offset = 0; +- for (size_type n = 0; n != NumDims; ++n) +- offset += indices[n] * strides[n]; +- ++ { ++ typename IndexList::const_iterator i = indices.begin(); ++ size_type n = 0; ++ while (n != NumDims) { ++ offset += (*i) * strides[n]; ++ ++n; ++ ++i; ++ } ++ } + return base[offset]; + } +Index: branches/release/boost/multi_array/concept_checks.hpp +=================================================================== +--- a/branches/release/boost/multi_array/concept_checks.hpp ++++ b/branches/release/boost/multi_array/concept_checks.hpp +@@ -132,4 +132,5 @@ + function_requires< boost_concepts::ForwardTraversalConcept >(); + function_requires< boost_concepts::ReadableIteratorConcept >(); ++ function_requires< boost::OutputIterator >(); + + // RG - a( CollectionArchetype) when available... +Index: branches/release/boost/multi_array/iterator.hpp +=================================================================== +--- a/branches/release/boost/multi_array/iterator.hpp ++++ b/branches/release/boost/multi_array/iterator.hpp +@@ -45,14 +45,16 @@ + }; + +-template ++template + class array_iterator; + +-template ++template + class array_iterator + : public + iterator_facade< +- array_iterator ++ array_iterator + , typename associated_types::value_type +- , boost::random_access_traversal_tag ++ , IteratorCategory + , Reference + > +@@ -70,5 +72,5 @@ + + typedef iterator_facade< +- array_iterator ++ array_iterator + , typename detail::multi_array::associated_types::value_type + , boost::random_access_traversal_tag +@@ -80,5 +82,5 @@ + + #ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS +- template ++ template + friend class array_iterator; + #else +@@ -106,7 +108,7 @@ + strides_(strides), index_base_(index_base) { } + +- template ++ template + array_iterator( +- const array_iterator& rhs ++ const array_iterator& rhs + , typename boost::enable_if_convertible::type* = 0 + ) -- cgit