diff --git a/include/boost/array.hpp b/include/boost/array.hpp index 7df2771..a5bee24 100644 --- a/include/boost/array.hpp +++ b/include/boost/array.hpp @@ -346,7 +346,34 @@ namespace boost { x.swap(y); } - // Specific for boost::array: simply returns its elems data member. +#if defined(__SUNPRO_CC) +// Trac ticket #4757; the Sun Solaris compiler can't handle +// syntax like 'T(&get_c_array(boost::array& arg))[N]' +// +// We can't just use this for all compilers, because the +// borland compilers can't handle this form. + namespace detail { + template struct c_array + { + typedef T type[N]; + }; + } + + // Specific for boost::array: simply returns its elems data member. + template + typename detail::c_array::type& get_c_array(boost::array& arg) + { + return arg.elems; + } + + // Specific for boost::array: simply returns its elems data member. + template + typename const detail::c_array::type& get_c_array(const boost::array& arg) + { + return arg.elems; + } +#else +// Specific for boost::array: simply returns its elems data member. template T(&get_c_array(boost::array& arg))[N] { @@ -359,7 +386,8 @@ namespace boost { { return arg.elems; } - +#endif + #if 0 // Overload for std::array, assuming that std::array will have // explicit conversion functions as discussed at the WG21 meeting diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 1379a5b..2deb3d5 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -11,4 +11,5 @@ test-suite array : [ run array3.cpp ] [ run array4.cpp ] [ run array5.cpp ] + [ run array6.cpp ] ; diff --git a/test/array6.cpp b/test/array6.cpp new file mode 100644 index 0000000..388b39f --- /dev/null +++ b/test/array6.cpp @@ -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 +#include +#include +#include + +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; +} +