Merged array changes to release; fixes #4757

[SVN r67477]
This commit is contained in:
Marshall Clow
2010-12-28 18:28:22 +00:00
parent a603bffc48
commit 9644ee6662
3 changed files with 79 additions and 2 deletions

View File

@ -346,6 +346,33 @@ namespace boost {
x.swap(y); x.swap(y);
} }
#if defined(__SUNPRO_CC)
// Trac ticket #4757; the Sun Solaris compiler can't handle
// syntax like 'T(&get_c_array(boost::array<T,N>& arg))[N]'
//
// We can't just use this for all compilers, because the
// borland compilers can't handle this form.
namespace detail {
template <typename T, std::size_t N> struct c_array
{
typedef T type[N];
};
}
// Specific for boost::array: simply returns its elems data member.
template <typename T, std::size_t N>
typename detail::c_array<T,N>::type& get_c_array(boost::array<T,N>& arg)
{
return arg.elems;
}
// Specific for boost::array: simply returns its elems data member.
template <typename T, std::size_t N>
typename const detail::c_array<T,N>::type& get_c_array(const boost::array<T,N>& arg)
{
return arg.elems;
}
#else
// Specific for boost::array: simply returns its elems data member. // Specific for boost::array: simply returns its elems data member.
template <typename T, std::size_t N> template <typename T, std::size_t N>
T(&get_c_array(boost::array<T,N>& arg))[N] T(&get_c_array(boost::array<T,N>& arg))[N]
@ -359,6 +386,7 @@ namespace boost {
{ {
return arg.elems; return arg.elems;
} }
#endif
#if 0 #if 0
// Overload for std::array, assuming that std::array will have // Overload for std::array, assuming that std::array will have

View File

@ -11,4 +11,5 @@ test-suite array :
[ run array3.cpp ] [ run array3.cpp ]
[ run array4.cpp ] [ run array4.cpp ]
[ run array5.cpp ] [ run array5.cpp ]
[ run array6.cpp ]
; ;

48
test/array6.cpp Normal file
View File

@ -0,0 +1,48 @@
/* tests for using class array<> specialization for size 0
* (C) Copyright Alisdair Meredith 2006.
* 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)
*/
#include <string>
#include <iostream>
#include <boost/array.hpp>
#include <algorithm>
namespace {
unsigned int failed_tests = 0;
void fail_test( const char * reason ) {
++failed_tests;
std::cerr << "Test failure " << failed_tests << ": " << reason << std::endl;
}
template< class T >
void RunTests()
{
typedef boost::array< T, 5 > test_type;
typedef T arr[5];
test_type test_case; // = { 1, 1, 2, 3, 5 };
arr &aRef = get_c_array ( test_case );
if ( &*test_case.begin () != &aRef[0] )
fail_test ( "Array6: Same thing not equal?(1)" );
const arr &caRef = get_c_array ( test_case );
typename test_type::const_iterator iter = test_case.begin ();
if ( &*iter != &caRef[0] )
fail_test ( "Array6: Same thing not equal?(2)" );
}
}
int main()
{
RunTests< bool >();
RunTests< void * >();
RunTests< long double >();
RunTests< std::string >();
return failed_tests;
}