$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r82089 - in trunk: boost libs/array/test
From: marshall_at_[hidden]
Date: 2012-12-18 19:53:32
Author: marshall
Date: 2012-12-18 19:53:31 EST (Tue, 18 Dec 2012)
New Revision: 82089
URL: http://svn.boost.org/trac/boost/changeset/82089
Log:
Add boost::get<> support to Boost.Array
Added:
   trunk/libs/array/test/array_getfail1.cpp   (contents, props changed)
   trunk/libs/array/test/array_getfail2.cpp   (contents, props changed)
Text files modified: 
   trunk/boost/array.hpp                |    14 +++++++                                 
   trunk/libs/array/test/Jamfile.v2     |     2 +                                       
   trunk/libs/array/test/array6.cpp     |    39 +++++++++------------                   
   trunk/libs/array/test/array7.cpp     |    71 +++++++++++++++++++++++---------------- 
   trunk/libs/array/test/array_hash.cpp |    39 +++++++++------------                   
   5 files changed, 90 insertions(+), 75 deletions(-)
Modified: trunk/boost/array.hpp
==============================================================================
--- trunk/boost/array.hpp	(original)
+++ trunk/boost/array.hpp	2012-12-18 19:53:31 EST (Tue, 18 Dec 2012)
@@ -437,10 +437,22 @@
         return boost::hash_range(arr.begin(), arr.end());
     }
 
+   template <size_t Idx, typename T, size_t N>
+   T &get(boost::array<T,N> &arr) BOOST_NOEXCEPT {
+       BOOST_STATIC_ASSERT_MSG ( Idx < N, "boost::get<>(boost::array &) index out of range" );
+       return arr[Idx];
+       }
+    
+   template <size_t Idx, typename T, size_t N>
+   const T &get(const boost::array<T,N> &arr) BOOST_NOEXCEPT {
+       BOOST_STATIC_ASSERT_MSG ( Idx < N, "boost::get<>(const boost::array &) index out of range" );
+       return arr[Idx];
+       }
+
 } /* namespace boost */
 
 #ifndef BOOST_NO_CXX11_HDR_ARRAY
-//	If we don't have std::array, I'm assuming that we don't have std::get
+//  If we don't have std::array, I'm assuming that we don't have std::get
 namespace std {
    template <size_t Idx, typename T, size_t N>
    T &get(boost::array<T,N> &arr) BOOST_NOEXCEPT {
Modified: trunk/libs/array/test/Jamfile.v2
==============================================================================
--- trunk/libs/array/test/Jamfile.v2	(original)
+++ trunk/libs/array/test/Jamfile.v2	2012-12-18 19:53:31 EST (Tue, 18 Dec 2012)
@@ -13,5 +13,7 @@
     [ run array5.cpp ]
     [ run array6.cpp ]
     [ run array7.cpp ]
+    [ compile-fail array_getfail1.cpp ]
+    [ compile-fail array_getfail2.cpp ]
     [ run array_hash.cpp ]
     ;
Modified: trunk/libs/array/test/array6.cpp
==============================================================================
--- trunk/libs/array/test/array6.cpp	(original)
+++ trunk/libs/array/test/array6.cpp	2012-12-18 19:53:31 EST (Tue, 18 Dec 2012)
@@ -10,39 +10,32 @@
 #include <boost/array.hpp>
 #include <algorithm>
 
-namespace {
-unsigned int failed_tests = 0;
+#include <boost/test/included/test_exec_monitor.hpp>
 
-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 };
+namespace {
+    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)" );
+        arr &aRef = get_c_array ( test_case );
+        BOOST_CHECK ( &*test_case.begin () == &aRef[0] );
         
-    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)" );
-}
-
+        const arr &caRef = get_c_array ( test_case );
+        typename test_type::const_iterator iter = test_case.begin ();
+        BOOST_CHECK ( &*iter == &caRef[0] );
+    }
 }
 
-int main()
+int test_main( int , char* [] )
 {
     RunTests< bool >();
     RunTests< void * >();
     RunTests< long double >();
     RunTests< std::string >();
-    return failed_tests;
+    return 0;
 }
 
Modified: trunk/libs/array/test/array7.cpp
==============================================================================
--- trunk/libs/array/test/array7.cpp	(original)
+++ trunk/libs/array/test/array7.cpp	2012-12-18 19:53:31 EST (Tue, 18 Dec 2012)
@@ -1,5 +1,5 @@
-/* tests for using class array<> specialization for size 0
- * (C) Copyright Alisdair Meredith 2006.
+/* tests using std::get on boost:array
+ * (C) Copyright Marshall Clow 2012
  * 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)
@@ -13,42 +13,55 @@
 #include <array>
 #endif
 
-namespace {
-unsigned int failed_tests = 0;
+#include <boost/test/included/test_exec_monitor.hpp>
 
-#ifndef BOOST_NO_CXX11_HDR_ARRAY
-void    fail_test( const char * reason ) {
-    ++failed_tests;
-    std::cerr << "Test failure " << failed_tests << ": " << reason << std::endl;
-}
+namespace {
 
-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 };
+    #ifndef BOOST_NO_CXX11_HDR_ARRAY
+    template< class T >
+    void    RunStdTests()
+    {
+        typedef boost::array< T, 5 >    test_type;
+        typedef T arr[5];
+        test_type           test_case; //   =   { 1, 1, 2, 3, 5 };
     
-    T &aRef = std::get<0> ( test_case );
-    if ( &*test_case.begin () != &aRef )
-        fail_test ( "Array7: Same thing not equal?(1)" );
+        T &aRef = std::get<0> ( test_case );
+        BOOST_CHECK ( &*test_case.begin () == &aRef );
         
-    const T &caRef = std::get<0> ( test_case );
-    if ( &*test_case.cbegin () != &caRef )
-        fail_test ( "Array7: Same thing not equal?(2)" );
-}
-#endif
+        const T &caRef = std::get<0> ( test_case );
+        BOOST_CHECK ( &*test_case.cbegin () == &caRef );
+    }
+    #endif
+
+    template< class T >
+    void    RunBoostTests()
+    {
+        typedef boost::array< T, 5 >    test_type;
+        typedef T arr[5];
+        test_type           test_case; //   =   { 1, 1, 2, 3, 5 };
+    
+        T &aRef = boost::get<0> ( test_case );
+        BOOST_CHECK ( &*test_case.begin () == &aRef );
+        
+        const T &caRef = boost::get<0> ( test_case );
+        BOOST_CHECK ( &*test_case.cbegin () == &caRef );
+    }
 
 }
 
-int main()
+int test_main( int , char* [] )
 {
+    RunBoostTests< bool >();
+    RunBoostTests< void * >();
+    RunBoostTests< long double >();
+    RunBoostTests< std::string >();
+
 #ifndef BOOST_NO_CXX11_HDR_ARRAY
-    RunTests< bool >();
-    RunTests< void * >();
-    RunTests< long double >();
-    RunTests< std::string >();
+    RunStdTests< bool >();
+    RunStdTests< void * >();
+    RunStdTests< long double >();
+    RunStdTests< std::string >();
 #endif
-    return failed_tests;
+    return 0;
 }
 
Added: trunk/libs/array/test/array_getfail1.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/array/test/array_getfail1.cpp	2012-12-18 19:53:31 EST (Tue, 18 Dec 2012)
@@ -0,0 +1,51 @@
+/* tests using std::get on boost:array
+ * (C) Copyright Marshall Clow 2012
+ * 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 <algorithm>
+#ifndef BOOST_NO_CXX11_HDR_ARRAY
+#include <array>
+#endif
+
+#include <boost/array.hpp>
+#include <boost/static_assert.hpp>
+
+
+#include <boost/test/included/test_exec_monitor.hpp>
+
+namespace {
+
+    #ifndef BOOST_NO_CXX11_HDR_ARRAY
+    template< class T >
+    void    RunStdTests()
+    {
+        typedef boost::array< T, 5 >    test_type;
+        typedef T arr[5];
+        test_type           test_case; //   =   { 1, 1, 2, 3, 5 };
+    
+        T &aRef = std::get<5> ( test_case );	// should fail to compile
+        BOOST_CHECK ( &*test_case.begin () == &aRef );
+    }
+    #endif
+
+}
+
+int test_main( int , char* [] )
+{
+
+#ifndef BOOST_NO_CXX11_HDR_ARRAY
+    RunStdTests< bool >();
+    RunStdTests< void * >();
+    RunStdTests< long double >();
+    RunStdTests< std::string >();
+#else
+	BOOST_STATIC_ASSERT ( false );	// fail on C++03 systems.
+#endif
+    return 0;
+}
+
Added: trunk/libs/array/test/array_getfail2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/array/test/array_getfail2.cpp	2012-12-18 19:53:31 EST (Tue, 18 Dec 2012)
@@ -0,0 +1,64 @@
+/* tests using std::get on boost:array
+ * (C) Copyright Marshall Clow 2012
+ * 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>
+#ifndef BOOST_NO_CXX11_HDR_ARRAY
+#include <array>
+#endif
+
+#include <boost/test/included/test_exec_monitor.hpp>
+
+namespace {
+
+    #ifndef BOOST_NO_CXX11_HDR_ARRAY
+    template< class T >
+    void    RunStdTests()
+    {
+        typedef boost::array< T, 5 >    test_type;
+        typedef T arr[5];
+        test_type           test_case; //   =   { 1, 1, 2, 3, 5 };
+    
+        T &aRef = std::get<0> ( test_case );
+        BOOST_CHECK ( &*test_case.begin () == &aRef );
+        
+        const T &caRef = std::get<0> ( test_case );
+        BOOST_CHECK ( &*test_case.cbegin () == &caRef );
+    }
+    #endif
+
+    template< class T >
+    void    RunBoostTests()
+    {
+        typedef boost::array< T, 5 >    test_type;
+        typedef T arr[5];
+        test_type           test_case; //   =   { 1, 1, 2, 3, 5 };
+    
+        T &aRef = boost::get<5> ( test_case );
+        BOOST_CHECK ( &*test_case.begin () == &aRef );
+    }
+
+}
+
+int test_main( int , char* [] )
+{
+    RunBoostTests< bool >();
+    RunBoostTests< void * >();
+    RunBoostTests< long double >();
+    RunBoostTests< std::string >();
+
+#ifndef BOOST_NO_CXX11_HDR_ARRAY
+    RunStdTests< bool >();
+    RunStdTests< void * >();
+    RunStdTests< long double >();
+    RunStdTests< std::string >();
+#endif
+    return 0;
+}
+
Modified: trunk/libs/array/test/array_hash.cpp
==============================================================================
--- trunk/libs/array/test/array_hash.cpp	(original)
+++ trunk/libs/array/test/array_hash.cpp	2012-12-18 19:53:31 EST (Tue, 18 Dec 2012)
@@ -11,39 +11,34 @@
 #include <algorithm>
 #include <boost/functional/hash.hpp>
 
-namespace {
-unsigned int failed_tests = 0;
+#include <boost/test/included/test_exec_monitor.hpp>
 
-void    fail_test( const char * reason ) {
-    ++failed_tests;
-    std::cerr << "Test failure " << failed_tests << ": " << reason << std::endl;
-}
+namespace {
 
-template< class T >
-void    RunTests()
-{
-//    std::size_t hash0 = boost::hash<boost::array<T,0> > () ( boost::array<T, 0> ());
-//    std::size_t hash1 = boost::hash<boost::array<T,1> > () ( boost::array<T, 1> ());
+    template< class T >
+    void    RunTests()
+    {
+    //    std::size_t hash0 = boost::hash<boost::array<T,0> > () ( boost::array<T, 0> ());
+    //    std::size_t hash1 = boost::hash<boost::array<T,1> > () ( boost::array<T, 1> ());
     
-    typedef boost::array< T, 5 >    barr;
-    typedef T arr[5];
-    barr           test_barr =   {{ 1, 1, 2, 3, 5 }};
-    arr            test_arr  =    { 1, 1, 2, 3, 5 };
+        typedef boost::array< T, 5 >    barr;
+        typedef T arr[5];
+        barr           test_barr =   {{ 1, 1, 2, 3, 5 }};
+        arr            test_arr  =    { 1, 1, 2, 3, 5 };
     
-    std::size_t bhash = boost::hash<barr> () ( test_barr );
-    std::size_t ahash = boost::hash<arr>  () ( test_arr );
-    if ( ahash != bhash )
-        fail_test ( "Array_hash: Hash-mismatch on " );
-}
+        std::size_t bhash = boost::hash<barr> () ( test_barr );
+        std::size_t ahash = boost::hash<arr>  () ( test_arr );
+        BOOST_CHECK ( ahash == bhash );
+    }
 
 }
 
-int main()
+int test_main( int , char* [] )
 {
     RunTests< int >();
     RunTests< long >();
     RunTests< long double >();
 
-    return failed_tests;
+    return 0;
 }