From 3dba05fc94d370c9a5cfbff9c2d17496e325faa6 Mon Sep 17 00:00:00 2001 From: nobody Date: Thu, 7 Jun 2007 20:53:46 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create tag 'merged_to_RC_1_34_0'. [SVN r37938] --- array0.cpp | 107 ------------------------------- include/boost/array.hpp | 135 ++-------------------------------------- 2 files changed, 6 insertions(+), 236 deletions(-) delete mode 100644 array0.cpp diff --git a/array0.cpp b/array0.cpp deleted file mode 100644 index e6e5e8b..0000000 --- a/array0.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* 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 - -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 BadValue( const T & ) -{ - fail_test( "Unexpected value" ); -} - -template< class T > -void RunTests() -{ - typedef boost::array< T, 0 > test_type; - - // Test value and aggegrate initialization - test_type test_case = {}; - const boost::array< T, 0 > const_test_case = test_type(); - - test_case.assign( T() ); - - // front/back and operator[] must compile, but calling them is undefined - // Likewise, all tests below should evaluate to false, avoiding undefined behaviour - if( !test_case.empty() ) { - BadValue( test_case.front() ); - } - - if( !const_test_case.empty() ) { - BadValue( const_test_case.back() ); - } - - if( test_case.size() > 0 ) { - BadValue( test_case[ 0 ] ); - } - - if( const_test_case.max_size() > 0 ) { - BadValue( const_test_case[ 0 ] ); - } - - // Assert requirements of TR1 6.2.2.4 - if( test_case.begin() != test_case.end() ) { - fail_test( "Not an empty range" ); - } - if( const_test_case.begin() != const_test_case.end() ) { - fail_test( "Not an empty range" ); - } - - if( test_case.begin() == const_test_case.begin() ) { - fail_test( "iterators for different containers are not distinct" ); - } - - if( test_case.data() == const_test_case.data() ) { - // Value of data is unspecified in TR1, so no requirement this test pass or fail - // However, it must compile! - } - - - // Check can safely use all iterator types with std algorithms - std::for_each( test_case.begin(), test_case.end(), BadValue< T > ); - std::for_each( test_case.rbegin(), test_case.rend(), BadValue< T > ); - std::for_each( const_test_case.begin(), const_test_case.end(), BadValue< T > ); - std::for_each( const_test_case.rbegin(), const_test_case.rend(), BadValue< T > ); - - // Check swap is well formed - std::swap( test_case, test_case ); - - // Check assigment operator and overloads are well formed - test_case = const_test_case; - - // Confirm at() throws the std lib defined exception - try { - BadValue( test_case.at( 0 ) ); - } catch ( const std::range_error & ) { - } - - try { - BadValue( const_test_case.at( 0 ) ); - } catch ( const std::range_error & ) { - } -} - -} - -int main() -{ - RunTests< bool >(); - RunTests< void * >(); - RunTests< long double >(); - RunTests< std::string >(); - return failed_tests; -} - diff --git a/include/boost/array.hpp b/include/boost/array.hpp index b41c656..ce9eda7 100644 --- a/include/boost/array.hpp +++ b/include/boost/array.hpp @@ -2,13 +2,13 @@ * an STL container (as wrapper) for arrays of constant size. * * See - * http://www.boost.org/libs/array/ + * http://www.josuttis.com/cppcode + * for details and the latest version. + * See + * http://www.boost.org/libs/array for Documentation. * for documentation. * - * The original author site is at: http://www.josuttis.com/ - * * (C) Copyright Nicolai M. Josuttis 2001. - * * 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) @@ -30,7 +30,6 @@ // Handles broken standard libraries better than #include -#include #include // FIXES for broken compilers @@ -53,7 +52,7 @@ namespace boost { typedef const T& const_reference; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; - + // iterator support iterator begin() { return elems; } const_iterator begin() const { return elems; } @@ -136,7 +135,6 @@ namespace boost { // direct access to data (read-only) const T* data() const { return elems; } - T* data() { return elems; } // use array as C array (direct read/write access to data) T* c_array() { return elems; } @@ -156,134 +154,13 @@ namespace boost { // check range (may be private because it is static) static void rangecheck (size_type i) { - if (i >= size()) { + if (i >= size()) { throw std::range_error("array<>: index out of range"); } } }; -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - template< class T > - class array< T, 0 > { - - public: - // type definitions - typedef T value_type; - typedef T* iterator; - typedef const T* const_iterator; - typedef T& reference; - typedef const T& const_reference; - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - - // iterator support - iterator begin() { return iterator( reinterpret_cast< T * >( this ) ); } - const_iterator begin() const { return const_iterator( reinterpret_cast< const T * >( this ) ); } - iterator end() { return begin(); } - const_iterator end() const { return begin(); } - - // reverse iterator support -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS) - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; -#elif defined(_MSC_VER) && (_MSC_VER == 1300) && defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB == 310) - // workaround for broken reverse_iterator in VC7 - typedef std::reverse_iterator > reverse_iterator; - typedef std::reverse_iterator > const_reverse_iterator; -#else - // workaround for broken reverse_iterator implementations - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; -#endif - - reverse_iterator rbegin() { return reverse_iterator(end()); } - const_reverse_iterator rbegin() const { - return const_reverse_iterator(end()); - } - reverse_iterator rend() { return reverse_iterator(begin()); } - const_reverse_iterator rend() const { - return const_reverse_iterator(begin()); - } - - // operator[] - reference operator[](size_type i) - { - return failed_rangecheck(); - } - - const_reference operator[](size_type i) const - { - return failed_rangecheck(); - } - - // at() with range check - reference at(size_type i) { return failed_rangecheck(); } - const_reference at(size_type i) const { return failed_rangecheck(); } - - // front() and back() - reference front() - { - return failed_rangecheck(); - } - - const_reference front() const - { - return failed_rangecheck(); - } - - reference back() - { - return failed_rangecheck(); - } - - const_reference back() const - { - return failed_rangecheck(); - } - - // size is constant - static size_type size() { return 0; } - static bool empty() { return true; } - static size_type max_size() { return 0; } - enum { static_size = 0 }; - - void swap (array& y) { - } - - // direct access to data (read-only) - const T* data() const { return 0; } - T* data() { return 0; } - - // use array as C array (direct read/write access to data) - T* c_array() { return 0; } - - // assignment with type conversion - template - array& operator= (const array& ) { - return *this; - } - - // assign one value to all elements - void assign (const T& ) { } - - // check range (may be private because it is static) - static reference failed_rangecheck () { - std::range_error e("attempt to access element of an empty array"); - boost::throw_exception(e); - // - // We need to return something here to keep - // some compilers happy: however we will never - // actually get here.... - // - static T placeholder; - return placeholder; - } - }; -#endif - // comparisons template bool operator== (const array& x, const array& y) {