$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r62439 - in sandbox/endian: boost/integer libs/integer libs/integer/doc libs/integer/test
From: bdawes_at_[hidden]
Date: 2010-06-05 07:45:24
Author: bemandawes
Date: 2010-06-05 07:45:21 EDT (Sat, 05 Jun 2010)
New Revision: 62439
URL: http://svn.boost.org/trac/boost/changeset/62439
Log:
Add data() member
Text files modified: 
   sandbox/endian/boost/integer/endian.hpp                     |     5 +                                       
   sandbox/endian/boost/integer/endian_binary_stream.hpp       |     2                                         
   sandbox/endian/libs/integer/doc/endian.html                 |    40 +++++++--                               
   sandbox/endian/libs/integer/test/endian_operations_test.cpp |    18 ++++                                    
   sandbox/endian/libs/integer/test/endian_test.cpp            |   149 ++++++++++++++++++++++++++++++++++++++++
   sandbox/endian/libs/integer/test/test.bat                   |    40 +++++++++-                              
   sandbox/endian/libs/integer/zip-endian.bat                  |     2                                         
   7 files changed, 237 insertions(+), 19 deletions(-)
Modified: sandbox/endian/boost/integer/endian.hpp
==============================================================================
--- sandbox/endian/boost/integer/endian.hpp	(original)
+++ sandbox/endian/boost/integer/endian.hpp	2010-06-05 07:45:21 EDT (Sat, 05 Jun 2010)
@@ -198,6 +198,7 @@
 #       endif
           return detail::load_big_endian<T, n_bits/8>(m_value);
         }
+        const char* data() const  { return m_value; }
       private:
               char m_value[n_bits/8];
     };
@@ -230,6 +231,7 @@
 #       endif
           return detail::load_little_endian<T, n_bits/8>(m_value);
         }
+        const char* data() const  { return m_value; }
       private:
               char m_value[n_bits/8];
     };
@@ -257,6 +259,7 @@
         endian & operator=(T val) { detail::store_little_endian<T, n_bits/8>(m_value, val); return *this; }
         operator T() const        { return detail::load_little_endian<T, n_bits/8>(m_value); }
 #   endif
+        const char* data() const  { return m_value; }
       private:
               char m_value[n_bits/8];
     };
@@ -288,6 +291,7 @@
         endian & operator=(T val) { detail::store_big_endian<T, sizeof(T)>(&m_value, val); return *this; }
         operator T() const        { return detail::load_big_endian<T, sizeof(T)>(&m_value); }
 #   endif  
+        const char* data() const  { return reinterpret_cast<const char *>(&m_value); }
       private:
               T m_value;
     };
@@ -316,6 +320,7 @@
         endian & operator=(T val) { detail::store_little_endian<T, sizeof(T)>(&m_value, val); return *this; }
         operator T() const        { return detail::load_little_endian<T, sizeof(T)>(&m_value); }
     #endif
+        const char* data() const  { return reinterpret_cast<const char *>(&m_value); }
       private:
               T m_value;
     };
Modified: sandbox/endian/boost/integer/endian_binary_stream.hpp
==============================================================================
--- sandbox/endian/boost/integer/endian_binary_stream.hpp	(original)
+++ sandbox/endian/boost/integer/endian_binary_stream.hpp	2010-06-05 07:45:21 EDT (Sat, 05 Jun 2010)
@@ -119,7 +119,7 @@
        inline typename boost::enable_if< is_endian<Endian>, std::ostream & >::type
          operator<=( std::ostream & os, const Endian & e )
      {
-       return os.write( reinterpret_cast<const char*>(&e), sizeof(e) );
+       return os.write( e.data(), sizeof(e) );
      }
 
      template < class Endian >
Modified: sandbox/endian/libs/integer/doc/endian.html
==============================================================================
--- sandbox/endian/libs/integer/doc/endian.html	(original)
+++ sandbox/endian/libs/integer/doc/endian.html	2010-06-05 07:45:21 EDT (Sat, 05 Jun 2010)
@@ -12,12 +12,12 @@
 <body>
 
 
-<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">
+<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="710">
   <tr>
     <td width="277">
 <a href="../../../index.html">
 <img src="../../../boost.png" alt="boost.png (6897 bytes)" align="middle" width="277" height="86" border="0"></a></td>
-    <td width="337" align="middle">
+    <td width="413" align="middle">
     <font size="7">Endian Integers</font>
     </td>
   </tr>
@@ -51,6 +51,7 @@
       <a href="#Example">Example</a><br>
       <a href="#Design">Design</a><br>
       <a href="#Experience">Experience</a><br>
+      Motivating use cases<br>
       <a href="#C++0x">C++0x</a><br>
       <a href="#Compilation">Compilation</a><br>
       <a href="#Acknowledgements">Acknowledgements</a>
@@ -290,10 +291,15 @@
     {
     public:
       typedef T value_type;
+
+      // if BOOST_ENDIAN_FORCE_PODNESS is defined && C++0x POD's are not
+      // available then these two constructors will not be present
       <a href="#endian">endian</a>() = default;       // = default replaced by {} on C++03
       explicit endian(T v);
+
       endian & operator=(T v);
       <a href="#operator-T">operator T</a>() const;
+      const char* data() const;
     };
 
     // unaligned big endian signed integer types
@@ -406,6 +412,11 @@
 <p><i>Returns:</i> The current value stored in <code>*this</code>, converted to
 <code>value_type</code>.</p>
 </blockquote>
+<p><code>const char* <a name="data">data</a>() const;</code></p>
+<blockquote>
+<p><i>Returns:</i> A pointer to the first byte of the endian binary value stored 
+in <code>*this</code>.</p>
+</blockquote>
 <h3>Other operators</h3>
 <p>Other operators on endian objects are forwarded to the equivalent 
 operator on <code>value_type</code>.</p>
@@ -436,10 +447,12 @@
 inserters and extractors, or to serialization.</p>
 <p><b>Are endian types POD's?</b> Yes for C++0x. No for C++03, although several
 <a href="#Compilation">macros</a> are available to force PODness in all cases.</p>
-<p><b>What are the implications endian types not being POD's of C++03?</b> They 
-can't be used in unions. In theory, compilers aren't required to align or lay 
-out storage in portable ways, although this problem has never been observed in a 
-real compiler.</p>
+<p><b>What are the implications endian types not being POD's with C++03 
+compilers?</b> They 
+can't be used in unions. Also, compilers aren't required to align or lay 
+out storage in portable ways, although this potential problem hasn't prevented 
+use of Boost.Endian with 
+real compilers.</p>
 <p><b>Which is better, big-endian or little-endian?</b> Big-endian tends to be a 
 bit more of an industry standard, but little-endian may be preferred for 
 applications that run primarily on x86 (Intel/AMD) and other little-endian 
@@ -585,6 +598,11 @@
 applications for many years. These independently developed endian libraries 
 often evolved from C libraries that were also widely used. Endian integers have proven widely useful across a wide 
 range of computer architectures and applications.</p>
+<h2><a name="Motivating-use-cases">Motivating use cases</a></h2>
+<p>Neil Mayhew writes: "I can also provide a meaningful use-case for this 
+library: reading TrueType font files from disk and processing the contents. The 
+data format has fixed endianness (big) and has unaligned values in various 
+places. Using Boost.Endian simplifies and cleans the code wonderfully."</p>
 <h2><a name="C++0x">C++0x</a></h2>
 <p>The availability of the C++0x
 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm">
@@ -622,20 +640,20 @@
 Christopher Kohlhoff,
 Cliff Green, 
 Gennaro Proto,
-Jeff Flinn,
+Giovanni Piero Deretta, dizzy, Jeff Flinn,
 John Maddock,
 Kim Barrett,
 Marsh Ray,
 Martin Bonner,
 Matias Capeletto,
-Rene Rivera,
-Scott McMurray, 
+Neil Mayhew, Phil Endecott, Rene Rivera,
+Roland Schwarz, Scott McMurray, 
 Sebastian Redl, 
-Tomas Puverle, and
+Tomas Puverle, Vincente Botet, and
 Yuval Ronen.</p>
 <hr>
 <p>Last revised:
-<!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->19 March, 2009<!--webbot bot="Timestamp" endspan i-checksum="29039" --></p>
+<!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->25 March, 2009<!--webbot bot="Timestamp" endspan i-checksum="29032" --></p>
 <p>© Copyright Beman Dawes, 2006-2009</p>
 <p>Distributed under the Boost Software License, Version 1.0. (See accompanying 
 file LICENSE_1_0.txt or copy at
Modified: sandbox/endian/libs/integer/test/endian_operations_test.cpp
==============================================================================
--- sandbox/endian/libs/integer/test/endian_operations_test.cpp	(original)
+++ sandbox/endian/libs/integer/test/endian_operations_test.cpp	2010-06-05 07:45:21 EDT (Sat, 05 Jun 2010)
@@ -264,6 +264,8 @@
 #endif
 }
 
+//  main  ------------------------------------------------------------------------------//
+
 int main()
 {
   bi::endian_log = false;
@@ -339,7 +341,21 @@
   std::clog << "\n";
 
   bi::endian_log = false;
-  
+
+  //  test from Roland Schwarz that detected ambiguities
+  unsigned u;
+  bi::ulittle32_t u1;
+  bi::ulittle32_t u2;
+
+  u = 1;
+  u1 = 1;
+  u2 = u1 + u;
+
+  //  one more wrinkle
+  bi::ulittle16_t u3(3);
+  u3 = 3;
+  u2 = u1 + u3;
+    
   //  perform the indicated test on ~60*60 operand types
 
   op_test<default_construct>();
Modified: sandbox/endian/libs/integer/test/endian_test.cpp
==============================================================================
--- sandbox/endian/libs/integer/test/endian_test.cpp	(original)
+++ sandbox/endian/libs/integer/test/endian_test.cpp	2010-06-05 07:45:21 EDT (Sat, 05 Jun 2010)
@@ -142,6 +142,152 @@
     cout << "That should not matter and is presented for your information only.\n";
   } // detect_endianness
 
+  //  check_data  ------------------------------------------------------------//
+
+  void check_data()
+  {
+    big8_t big8;
+    big16_t big16;
+    big24_t big24;
+    big32_t big32;
+    big40_t big40;
+    big48_t big48;
+    big56_t big56;
+    big64_t big64;
+
+    ubig8_t ubig8;
+    ubig16_t ubig16;
+    ubig24_t ubig24;
+    ubig32_t ubig32;
+    ubig40_t ubig40;
+    ubig48_t ubig48;
+    ubig56_t ubig56;
+    ubig64_t ubig64;
+
+    little8_t little8;
+    little16_t little16;
+    little24_t little24;
+    little32_t little32;
+    little40_t little40;
+    little48_t little48;
+    little56_t little56;
+    little64_t little64;
+
+    ulittle8_t ulittle8;
+    ulittle16_t ulittle16;
+    ulittle24_t ulittle24;
+    ulittle32_t ulittle32;
+    ulittle40_t ulittle40;
+    ulittle48_t ulittle48;
+    ulittle56_t ulittle56;
+    ulittle64_t ulittle64;
+
+    native8_t native8;
+    native16_t native16;
+    native24_t native24;
+    native32_t native32;
+    native40_t native40;
+    native48_t native48;
+    native56_t native56;
+    native64_t native64;
+
+    unative8_t unative8;
+    unative16_t unative16;
+    unative24_t unative24;
+    unative32_t unative32;
+    unative40_t unative40;
+    unative48_t unative48;
+    unative56_t unative56;
+    unative64_t unative64;
+
+    aligned_big16_t  aligned_big16;
+    aligned_big32_t  aligned_big32;
+    aligned_big64_t  aligned_big64;
+
+    aligned_ubig16_t aligned_ubig16;
+    aligned_ubig32_t aligned_ubig32;
+    aligned_ubig64_t aligned_ubig64;
+
+    aligned_little16_t  aligned_little16;
+    aligned_little32_t  aligned_little32;
+    aligned_little64_t  aligned_little64;
+
+    aligned_ulittle16_t aligned_ulittle16 ;
+    aligned_ulittle32_t aligned_ulittle32 ;
+    aligned_ulittle64_t aligned_ulittle64 ;
+
+    VERIFY(big8.data() == reinterpret_cast<const char *>(&big8));
+    VERIFY(big16.data() == reinterpret_cast<const char *>(&big16));
+    VERIFY(big24.data() == reinterpret_cast<const char *>(&big24));
+    VERIFY(big32.data() == reinterpret_cast<const char *>(&big32));
+    VERIFY(big40.data() == reinterpret_cast<const char *>(&big40));
+    VERIFY(big48.data() == reinterpret_cast<const char *>(&big48));
+    VERIFY(big56.data() == reinterpret_cast<const char *>(&big56));
+    VERIFY(big64.data() == reinterpret_cast<const char *>(&big64));
+
+    VERIFY(ubig8.data() == reinterpret_cast<const char *>(&ubig8));
+    VERIFY(ubig16.data() == reinterpret_cast<const char *>(&ubig16));
+    VERIFY(ubig24.data() == reinterpret_cast<const char *>(&ubig24));
+    VERIFY(ubig32.data() == reinterpret_cast<const char *>(&ubig32));
+    VERIFY(ubig40.data() == reinterpret_cast<const char *>(&ubig40));
+    VERIFY(ubig48.data() == reinterpret_cast<const char *>(&ubig48));
+    VERIFY(ubig56.data() == reinterpret_cast<const char *>(&ubig56));
+    VERIFY(ubig64.data() == reinterpret_cast<const char *>(&ubig64));
+
+    VERIFY(little8.data() == reinterpret_cast<const char *>(&little8));
+    VERIFY(little16.data() == reinterpret_cast<const char *>(&little16));
+    VERIFY(little24.data() == reinterpret_cast<const char *>(&little24));
+    VERIFY(little32.data() == reinterpret_cast<const char *>(&little32));
+    VERIFY(little40.data() == reinterpret_cast<const char *>(&little40));
+    VERIFY(little48.data() == reinterpret_cast<const char *>(&little48));
+    VERIFY(little56.data() == reinterpret_cast<const char *>(&little56));
+    VERIFY(little64.data() == reinterpret_cast<const char *>(&little64));
+
+    VERIFY(ulittle8.data() == reinterpret_cast<const char *>(&ulittle8));
+    VERIFY(ulittle16.data() == reinterpret_cast<const char *>(&ulittle16));
+    VERIFY(ulittle24.data() == reinterpret_cast<const char *>(&ulittle24));
+    VERIFY(ulittle32.data() == reinterpret_cast<const char *>(&ulittle32));
+    VERIFY(ulittle40.data() == reinterpret_cast<const char *>(&ulittle40));
+    VERIFY(ulittle48.data() == reinterpret_cast<const char *>(&ulittle48));
+    VERIFY(ulittle56.data() == reinterpret_cast<const char *>(&ulittle56));
+    VERIFY(ulittle64.data() == reinterpret_cast<const char *>(&ulittle64));
+
+    VERIFY(native8.data() == reinterpret_cast<const char *>(&native8));
+    VERIFY(native16.data() == reinterpret_cast<const char *>(&native16));
+    VERIFY(native24.data() == reinterpret_cast<const char *>(&native24));
+    VERIFY(native32.data() == reinterpret_cast<const char *>(&native32));
+    VERIFY(native40.data() == reinterpret_cast<const char *>(&native40));
+    VERIFY(native48.data() == reinterpret_cast<const char *>(&native48));
+    VERIFY(native56.data() == reinterpret_cast<const char *>(&native56));
+    VERIFY(native64.data() == reinterpret_cast<const char *>(&native64));
+
+    VERIFY(unative8.data() == reinterpret_cast<const char *>(&unative8));
+    VERIFY(unative16.data() == reinterpret_cast<const char *>(&unative16));
+    VERIFY(unative24.data() == reinterpret_cast<const char *>(&unative24));
+    VERIFY(unative32.data() == reinterpret_cast<const char *>(&unative32));
+    VERIFY(unative40.data() == reinterpret_cast<const char *>(&unative40));
+    VERIFY(unative48.data() == reinterpret_cast<const char *>(&unative48));
+    VERIFY(unative56.data() == reinterpret_cast<const char *>(&unative56));
+    VERIFY(unative64.data() == reinterpret_cast<const char *>(&unative64));
+
+    VERIFY(aligned_big16.data() == reinterpret_cast<const char *>(&aligned_big16));
+    VERIFY(aligned_big32.data() == reinterpret_cast<const char *>(&aligned_big32));
+    VERIFY(aligned_big64.data() == reinterpret_cast<const char *>(&aligned_big64));
+
+    VERIFY(aligned_ubig16.data() == reinterpret_cast<const char *>(&aligned_ubig16));
+    VERIFY(aligned_ubig32.data() == reinterpret_cast<const char *>(&aligned_ubig32));
+    VERIFY(aligned_ubig64.data() == reinterpret_cast<const char *>(&aligned_ubig64));
+
+    VERIFY(aligned_little16.data() == reinterpret_cast<const char *>(&aligned_little16));
+    VERIFY(aligned_little32.data() == reinterpret_cast<const char *>(&aligned_little32));
+    VERIFY(aligned_little64.data() == reinterpret_cast<const char *>(&aligned_little64));
+
+    VERIFY(aligned_ulittle16.data() == reinterpret_cast<const char *>(&aligned_ulittle16));
+    VERIFY(aligned_ulittle32.data() == reinterpret_cast<const char *>(&aligned_ulittle32));
+    VERIFY(aligned_ulittle64.data() == reinterpret_cast<const char *>(&aligned_ulittle64));
+ 
+  }
+
   //  check_size  ------------------------------------------------------------//
 
   void check_size()
@@ -572,6 +718,8 @@
 
 } // unnamed namespace
 
+//  main  ------------------------------------------------------------------------------//
+
 int main( int argc, char * argv[] )
 {
   cout << "Usage: "
@@ -586,6 +734,7 @@
   check_size();
   check_alignment();
   check_representation_and_range_and_ops();
+  check_data();
 
   //timing_test<big32_t> ( "big32_t" );
   //timing_test<aligned_big32_t>( "aligned_big32_t" );
Modified: sandbox/endian/libs/integer/test/test.bat
==============================================================================
--- sandbox/endian/libs/integer/test/test.bat	(original)
+++ sandbox/endian/libs/integer/test/test.bat	2010-06-05 07:45:21 EDT (Sat, 05 Jun 2010)
@@ -1,11 +1,41 @@
-set ENDIAN_LOCATE_ROOT=%TEMP%\endian-regr
-md %ENDIAN_LOCATE_ROOT% 2>nul
+@echo off
+echo Special version of boost_test for sandbox version of endian library.
+xcopy /D %BOOST_TRUNK%\boost-build.jam ..\..\..
+xcopy /D %BOOST_TRUNK%\Jamroot ..\..\..
+set BOOST_BUILD_PATH=%BOOST_TRUNK%\tools\build\v2
 
+if not $%1==$--help goto nohelp
+echo Invoke: boost_test [-ts toolset] [bjam-options]
+echo Default -ts is gcc-4.3,msvc-8.0,msvc-9.0express,msvc-10.0express
+goto done
+:nohelp
+ 
+if $%1==$-ts goto toolset
+
+echo Begin test processing...
+bjam include=%BOOST_TRUNK% --v2 --dump-tests --toolset=gcc-4.3,msvc-8.0,msvc-9.0express,msvc-10.0express %* >bjam.log 2>&1
+goto jam_log
+
+:toolset
 echo Begin test processing...
-bjam --dump-tests includes=/boost/trunk "-sALL_LOCATE_TARGET=%ENDIAN_LOCATE_ROOT%" %* >bjam.log 2>&1
+bjam include=%BOOST_TRUNK% --v2 --dump-tests --toolset=%2 %3 %4 %5 %6 %7 %8 %9 >bjam.log 2>&1
+
+:jam_log
 echo Begin log processing...
-process_jam_log %ENDIAN_LOCATE_ROOT% <bjam.log
+process_jam_log --v2 <bjam.log
 start bjam.log
+
 echo Begin compiler status processing...
-compiler_status --locate-root %ENDIAN_LOCATE_ROOT% ..\..\.. test_status.html test_links.html
+call boost_relative_root
+rem compiler_status barfs on a relative root, so convert it to absolute
+dir %BOOST_RELATIVE_ROOT% | grep " Directory of " >%TEMP%\babsr.bat
+%UTIL%\change %TEMP%\babsr.bat " Directory of " "set BOOST_TEST_ABS_ROOT=" >nul
+%UTIL%\change %TEMP%\babsr.bat "C:" "c:" >nul
+%UTIL%\change %TEMP%\babsr.bat "D:" "d:" >nul
+%UTIL%\change %TEMP%\babsr.bat "E:" "e:" >nul
+%UTIL%\change %TEMP%\babsr.bat "F:" "f:" >nul
+call %TEMP%\babsr.bat
+compiler_status --v2 %BOOST_TEST_ABS_ROOT% test_status.html test_links.html
 start test_status.html
+
+:done
Modified: sandbox/endian/libs/integer/zip-endian.bat
==============================================================================
--- sandbox/endian/libs/integer/zip-endian.bat	(original)
+++ sandbox/endian/libs/integer/zip-endian.bat	2010-06-05 07:45:21 EDT (Sat, 05 Jun 2010)
@@ -13,7 +13,7 @@
 md libs\integer\test
 popd
 copy ..\..\boost.png \temp\%1
-copy ..\..\boost\doc\html\minimal.css \temp\%1\doc\html
+copy ..\..\doc\html\minimal.css \temp\%1\doc\html
 copy ..\..\boost\binary_stream.hpp \temp\%1\boost
 copy ..\..\boost\integer\endian.hpp \temp\%1\boost\integer
 copy ..\..\boost\integer\endian_binary_stream.hpp \temp\%1\boost\integer