Merge develop

This commit is contained in:
Beman
2014-08-13 08:31:11 -04:00
parent 8713dd08a2
commit 84ad1a041f
4 changed files with 350 additions and 214 deletions

35
README Normal file
View File

@@ -0,0 +1,35 @@
Boost Endian library
To experiment with the Endian library, various other boost libraries must be
available. So you need to clone or install a current version of Boost if you
have notalready done so.
Boost.Endian is a header-only library, so there is no need to run a build
for it. These instructions do assume bootstrap has been run so that b2 is
in your path environmental variable.
Windows
=======
cd boost-root\libs
git clone git://github.com/Beman/endian.git
cd ..\boost
mklink /d endian ..\libs\endian\include\boost\endian
cd ..\libs\endian\test
b2
Others
======
cd boost-root/libs
git clone git://github.com/Beman/endian.git
cd ../boost
ln -s ../libs/endian/include/boost/endian endian
cd ../libs/endian/test
b2
---------------------------
Copyright Beman Dawes, 2013
Distributed under the Boost Software License, Version 1.0.
http://www.boost.org/LICENSE_1_0.txt

View File

@@ -88,26 +88,27 @@ namespace boost
{ {
namespace endian namespace endian
{ {
enum class <a name="order">order</a> {big, little, native}; enum class <a name="order">order</a>
{
big, // big-endian
little, // little-endian
native = <b><i>implementation-defined</i></b> // same as order::big or order::little<b><i>
</i></b>};
// reverse byte order (i.e. endianness) // reverse byte order (i.e. endianness)
int8_t <a href="#reverse_value">reverse_value</a>(int8_t x) noexcept;
int16_t <a href="#reverse_value">reverse_value</a>(int16_t x) noexcept; int16_t <a href="#reverse_value">reverse_value</a>(int16_t x) noexcept;
int32_t <a href="#reverse_value">reverse_value</a>(int32_t x) noexcept; int32_t <a href="#reverse_value">reverse_value</a>(int32_t x) noexcept;
int64_t <a href="#reverse_value">reverse_value</a>(int64_t x) noexcept; int64_t <a href="#reverse_value">reverse_value</a>(int64_t x) noexcept;
uint8_t <a href="#reverse_value">reverse_value</a>(uint8_t x) noexcept;
uint16_t <a href="#reverse_value">reverse_value</a>(uint16_t x) noexcept; uint16_t <a href="#reverse_value">reverse_value</a>(uint16_t x) noexcept;
uint32_t <a href="#reverse_value">reverse_value</a>(uint32_t x) noexcept; uint32_t <a href="#reverse_value">reverse_value</a>(uint32_t x) noexcept;
uint64_t <a href="#reverse_value">reverse_value</a>(uint64_t x) noexcept; uint64_t <a href="#reverse_value">reverse_value</a>(uint64_t x) noexcept;
float <a href="#reverse_value">reverse_value</a>(float x) noexcept; float <a href="#reverse_value">reverse_value</a>(float x) noexcept;
double <a href="#reverse_value">reverse_value</a>(double x) noexcept; double <a href="#reverse_value">reverse_value</a>(double x) noexcept;
void <a href="#reverse">reverse</a>(int16_t&amp; x) noexcept; template &lt;class Value&gt;
void <a href="#reverse">reverse</a>(int32_t&amp; x) noexcept; void <a href="#reverse">reverse</a>(Value&amp; x) noexcept;
void <a href="#reverse">reverse</a>(int64_t&amp; x) noexcept;
void <a href="#reverse">reverse</a>(uint16_t&amp; x) noexcept;
void <a href="#reverse">reverse</a>(uint32_t&amp; x) noexcept;
void <a href="#reverse">reverse</a>(uint64_t&amp; x) noexcept;
void <a href="#reverse">reverse</a>(float&amp; x) noexcept;
void <a href="#reverse">reverse</a>(double&amp; x) noexcept;
// reverse byte order unless native endianness is big // reverse byte order unless native endianness is big
template &lt;class ReversibleValue &gt; template &lt;class ReversibleValue &gt;
@@ -155,6 +156,9 @@ namespace endian
} // namespace endian } // namespace endian
} // namespace boost</pre> } // namespace boost</pre>
<p>The <i><b><code>implementation-defined</code></b></i> text above is either
<code>big</code> or <code>little</code> according to the endianness of the
platform.</p>
<h3><a name="Requirements">Requirements</a></h3> <h3><a name="Requirements">Requirements</a></h3>
<p>The template definitions in this header refer to named <p>The template definitions in this header refer to named
requirements whose details are set out in this section. User defined types may requirements whose details are set out in this section. User defined types may
@@ -203,9 +207,11 @@ udt_conversion_example.cpp</a> for an example of a UDT that can used in the
<a href="#little_endian">little_endian</a></code>, and <code> <a href="#little_endian">little_endian</a></code>, and <code>
<a href="#convert_generic">convert</a></code> function templates.</p> <a href="#convert_generic">convert</a></code> function templates.</p>
<h3><a name="Functions">Functions</a></h3> <h3><a name="Functions">Functions</a></h3>
<pre><a name="reverse_value"></a>int16_t reverse_value(int16_t x) noexcept; <pre><a name="reverse_value"></a>int8_t reverse_value(int8_t x) noexcept;
int16_t reverse_value(int16_t x) noexcept;
int32_t reverse_value(int32_t x) noexcept; int32_t reverse_value(int32_t x) noexcept;
int64_t reverse_value(int64_t x) noexcept; int64_t reverse_value(int64_t x) noexcept;
uint8_t reverse_value(uint8_t x) noexcept;
uint16_t reverse_value(uint16_t x) noexcept; uint16_t reverse_value(uint16_t x) noexcept;
uint32_t reverse_value(uint32_t x) noexcept; uint32_t reverse_value(uint32_t x) noexcept;
uint64_t reverse_value(uint64_t x) noexcept; uint64_t reverse_value(uint64_t x) noexcept;
@@ -215,14 +221,8 @@ double reverse_value(double x) noexcept;</pre>
<p><i>Returns:</i> <i><code>x</code></i>, with the order of its <p><i>Returns:</i> <i><code>x</code></i>, with the order of its
constituent bytes reversed.</p> constituent bytes reversed.</p>
</blockquote> </blockquote>
<pre><a name="reverse"></a>void reverse(int16_t&amp; x) noexcept; <pre><a name="reverse"></a>template &lt;class Value&gt;
void reverse(int32_t&amp; x) noexcept; void reverse(Value&amp; x) noexcept;</pre>
void reverse(int64_t&amp; x) noexcept;
void reverse(uint16_t&amp; x) noexcept;
void reverse(uint32_t&amp; x) noexcept;
void reverse(uint64_t&amp; x) noexcept;
void reverse(float&amp; x) noexcept;
void reverse(double&amp; x) noexcept;</pre>
<blockquote> <blockquote>
<p><i>Postconditions:</i> The order of the constituent bytes of <p><i>Postconditions:</i> The order of the constituent bytes of
<code>x</code> are reversed.</p> <code>x</code> are reversed.</p>
@@ -333,10 +333,12 @@ provided.</p>
</blockquote> </blockquote>
<h2><a name="Acknowledgements">Acknowledgements</a></h2><p>Tomas Puverle was instrumental in identifying and articulating the need to <h2><a name="Acknowledgements">Acknowledgements</a></h2><p>Tomas Puverle was instrumental in identifying and articulating the need to
support endian conversion as separate from endian integer types. Phil Endecott suggested the form of the value returning signatures. Vicente Botet and other reviewers suggested supporting floating point types and user defined types. General reverse template implementation approach using std::reverse suggested by Mathias Gaunard. Portable implementation approach for 16, 32, and 64-bit integers suggested by tymofey, with avoidance of undefined behavior as suggested by Giovanni Piero Deretta, and a further refinement suggested by Pyry Jahkola. Intrinsic builtins implementation approach for 16, 32, and 64-bit integers suggested by several reviewers, and by David Stone, who provided his Boost licensed macro implementation that became the starting point for <a href="../include/boost/endian/detail/intrinsic.hpp">boost/endian/detail/intrinsic.hpp</a>.</p> support endian conversion as separate from endian integer types. Phil Endecott suggested the form of the value returning signatures. Vicente Botet and other reviewers suggested supporting floating point types and user defined types. General reverse template implementation approach using std::reverse suggested by Mathias Gaunard. Portable implementation approach for 16, 32, and 64-bit integers suggested by tymofey, with avoidance of undefined behavior as suggested by Giovanni Piero Deretta, and a further refinement suggested by Pyry Jahkola. Intrinsic builtins implementation approach for 16, 32, and 64-bit integers suggested by several reviewers, and by David Stone, who provided his Boost licensed macro implementation that became the starting point for <a href="../include/boost/endian/detail/intrinsic.hpp">boost/endian/detail/intrinsic.hpp</a>.
Pierre Talbot provided the <code>int8_t reverse_value()</code> and templated
<code>reverse()</code> implementations.</p>
<hr> <hr>
<p>Last revised: <p>Last revised:
<!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->29 May, 2013<!--webbot bot="Timestamp" endspan i-checksum="13994" --></p> <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->12 August, 2014<!--webbot bot="Timestamp" endspan i-checksum="34569" --></p>
<p>© Copyright Beman Dawes, 2011, 2013</p> <p>© Copyright Beman Dawes, 2011, 2013</p>
<p>Distributed under the Boost Software License, Version 1.0. See <a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/ LICENSE_1_0.txt</a></p> <p>Distributed under the Boost Software License, Version 1.0. See <a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/ LICENSE_1_0.txt</a></p>

View File

@@ -46,7 +46,7 @@
<a href="#Introduction-to-endianness">Introduction to endianness</a><br> <a href="#Introduction-to-endianness">Introduction to endianness</a><br>
<a href="#Introduction">Introduction to the Boost.Endian library</a><br> <a href="#Introduction">Introduction to the Boost.Endian library</a><br>
<a href="#Choosing">Choosing approaches</a><br> <a href="#Choosing">Choosing approaches</a><br>
<a href="#Intrinsic">Intrinsic built-in support</a><br> <a href="#Intrinsic">Built-in support for Intrinsics</a><br>
<a href="#Performance">Performance</a><br> <a href="#Performance">Performance</a><br>
&nbsp;&nbsp;&nbsp; <a href="#Timings">Timings</a><br> &nbsp;&nbsp;&nbsp; <a href="#Timings">Timings</a><br>
&nbsp;&nbsp;&nbsp; <a href="#Conclusions">Conclusions</a><br> &nbsp;&nbsp;&nbsp; <a href="#Conclusions">Conclusions</a><br>
@@ -65,23 +65,15 @@
</tr> </tr>
</table> </table>
<table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">
<tr>
<td>Heads up: As development has continues, there have been breaking
changes. Most recently, the <a href="types.html">endian types</a> were
renamed.</td>
</tr>
</table>
<h2><a name="Abstract">Abstract</a></h2> <h2><a name="Abstract">Abstract</a></h2>
<p>Boost.Endian provides facilities to manipulate the endianness of integers, <p>Boost.Endian provides facilities to manipulate the endianness of integers,
floating point, and user defined data.</p> floating point, and user defined data.</p>
<ul> <ul>
<li>The primary use case is binary I/O for portable data exchange with <li>The primary use case is binary I/O for portable data exchange with
other systems, via either file or network transmission.<br> other systems, via either external media or network transmission.<br>
&nbsp;</li> &nbsp;</li>
<li>A secondary use case is minimizing storage size via sizes and/or <li>A second use case is minimizing storage size via sizes and/or
alignments not supported by the built-in types.<br> alignments not supported by the built-in types.<br>
&nbsp;</li> &nbsp;</li>
<li>Two distinct approaches to dealing with endianness are provided. Each approach has a <li>Two distinct approaches to dealing with endianness are provided. Each approach has a
@@ -167,59 +159,60 @@ application needs.</p>
<th colspan="2">Needs that favor one approach over the other</th> <th colspan="2">Needs that favor one approach over the other</th>
</tr> </tr>
<tr> <tr>
<th width="50%"><b><a href="types.html">Endian types</a> are better with <th width="50%"><b><a href="types.html">Endian types</a> may be better for
these needs</b></th>
<th><b><a href="conversion.html">Endian conversion functions</a> may be
better for
these needs</b></th> these needs</b></th>
<th><b><a href="conversion.html">Endian conversion functions</a> are better
with these needs</b></th>
</tr> </tr>
<tr> <tr>
<td valign="top"> <td valign="top">
<ul> <ul>
<li>A need to simplify program logic and eliminate logic <li><p>A need to simplify program logic and eliminate logic
errors. Since the endian types mimic the built-in types, there is no need to reason about the current endianness of variables errors. Since the endian types mimic the built-in types, there is no need to reason about the current endianness of variables
and that can simplify program logic and eliminate logic errors.<br> and that can simplify program logic and eliminate logic errors.</p></li>
&nbsp;</li> <li><p>A need to use unusual integer sizes (i.e. 3, 5,
<li>A need to use unusual integer sizes (i.e. 3, 5,
6, or 7 bytes) to reduce internal and external space usage and 6, or 7 bytes) to reduce internal and external space usage and
save I/O time.<br> save I/O time.</li>
&nbsp;</li> <li><p>A need to use unaligned variables. Endian types can eliminate padding bytes in
<li>A need to use unaligned variables. Endian types can eliminate padding bytes in
structures, reducing internal and external space usage and saving I/O structures, reducing internal and external space usage and saving I/O
time. They can deals with structures defined like this:</li> time. They can deals with structures defined like this:
</ul>
<blockquote> <blockquote>
<p><code>struct S {<br> <p><code>struct S {<br>
&nbsp; uint16_t a;<br> &nbsp; uint16_t a;<br>
&nbsp; uint32_t b;<br> &nbsp; uint32_t b;<br>
} __attribute__ ((packed));</code></p> } __attribute__ ((packed));</code>
</blockquote> </blockquote></p></li>
<li>
<p>Programmer preference.</p></li>
</ul>
</td> </td>
<td valign="top"> <td valign="top">
<ul> <ul>
<li>A need to leverage knowledge of developers who have been using C byte <li><p>A need to leverage knowledge of developers who have been using C byte
swapping swapping
functions for years.<br> functions for years.</p></li>
&nbsp;</li>
<li>A need to save CPU time when a variable is used many times <li>A need to save CPU time when a variable is used many times
relative to its I/O.<br> relative to its I/O.</li>
&nbsp;</li> <li>
<li>A need to pass structures to third-party libraries expecting a <p>A need to pass structures to third-party libraries expecting a
specific structure format.<br> specific structure format.</li>
&nbsp;</li> <li>
<p>Programmer preference.</li>
</ul> </ul>
</td> </td>
</tr> </tr>
</table> </table>
<h2><a name="Intrinsic">Intrinsic</a> built-in support</h2> <h2>Built-in support for <a name="Intrinsic">Intrinsic</a>s</h2>
<p>Recent compilers, including GCC, Clang, and Microsoft, supply intrinsic <p>Recent compilers, including GCC, Clang, and Microsoft, supply built-in support for byte swapping
built-in support for byte swapping. Such support is automatically detected and intrinsics. Such support is automatically detected and
used since it may in smaller and faster generated code, particularly for release used since it may in smaller and faster generated code, particularly for release
builds.</p> builds.</p>
<p dir="ltr">Defining <code>BOOST_ENDIAN_NO_INTRINSICS</code> will suppress use <p>Defining <code>BOOST_ENDIAN_NO_INTRINSICS</code> will suppress use
of the intrinsics. Please try defining it if you get compiler errors, such as of the intrinsics. Please try defining it if you get compiler errors, such as
header byteswap.h not being found.</p> header byteswap.h not being found.</p>
<p dir="ltr">The macro <code>BOOST_ENDIAN_INTRINSIC_MSG</code> is defined as <p>The macro <code>BOOST_ENDIAN_INTRINSIC_MSG</code> is defined as
either <code>&quot;no byte swap intrinsics&quot;</code> or a string describing the either <code>&quot;no byte swap intrinsics&quot;</code> or a string describing the
particular set of intrinsics being used.</p> particular set of intrinsics being used.</p>
@@ -267,9 +260,10 @@ big_endian(x);
</tr> </tr>
</table> </table>
<p><b>There will be no performance difference between the two approaches, <p><b>There will be no performance difference between the two approaches in
regardless of the native endianness of the machine.</b> Optimizing compilers will likely release builds,
generate exactly the same code for both. That conclusion was confirmed by regardless of the native endianness of the machine.</b> That&#39;s because optimizing compilers will likely
generate exactly the same code for each. That conclusion was confirmed by
studying the generated assembly code for GCC and Visual C++.</p> studying the generated assembly code for GCC and Visual C++.</p>
<p>Now consider a slightly different problem:&nbsp; </p> <p>Now consider a slightly different problem:&nbsp; </p>
@@ -337,84 +331,180 @@ setup.
32-bit intrinsics.)</p> 32-bit intrinsics.)</p>
<table border="1" cellpadding="5" cellspacing="0"style="border-collapse: collapse" bordercolor="#111111"> <table border="1" cellpadding="5" cellspacing="0"style="border-collapse: collapse" bordercolor="#111111">
<tr><td colspan="6" align="center"><b>GNU C++ version 4.7.0</b></td></tr> <tr><td colspan="6" align="center" dir="ltr"><b><font size="2">GNU C++ version 4.7.0</font></b></td></tr>
<tr><td colspan="6" align="center"><b> Iterations: 1000000000, Intrinsics: __builtin_bswap16, etc.</b></td></tr> <tr><td colspan="6" align="center" dir="ltr"><b> <font size="2">Iterations: 1000000000, Intrinsics: __builtin_bswap16, etc.</font></b></td></tr>
<tr><td><b>Test Case</b></td> <tr><td dir="ltr"><b><font size="2">Test Case</font></b></td>
<td align="center"><b>Endian<br>type</b></td> <td align="center" dir="ltr"><b><font size="2">Endian<br>type</font></b></td>
<td align="center"><b>Endian<br>conversion<br>function</b></td> <td align="center" dir="ltr"><b><font size="2">Endian<br>conversion<br>function</font></b></td>
</tr> </tr>
<tr><td>16-bit aligned big endian</td><td align="right">1.37 s</td><td align="right">0.81 s</td></tr> <tr><td dir="ltr"><font size="2">16-bit aligned big endian</font></td>
<tr><td>16-bit aligned little endian</td><td align="right">0.83 s</td><td align="right">0.81 s</td></tr> <td align="right" dir="ltr"><font size="2">1.37 s</font></td>
<tr><td>16-bit unaligned big endian</td><td align="right">1.09 s</td><td align="right">0.83 s</td></tr> <td align="right" dir="ltr"><font size="2">0.81 s</font></td></tr>
<tr><td>16-bit unaligned little endian</td><td align="right">1.09 s</td><td align="right">0.81 s</td></tr> <tr><td dir="ltr"><font size="2">16-bit aligned little endian</font></td>
<tr><td>32-bit aligned big endian</td><td align="right">0.98 s</td><td align="right">0.27 s</td></tr> <td align="right" dir="ltr"><font size="2">0.83 s</font></td>
<tr><td>32-bit aligned little endian</td><td align="right">0.28 s</td><td align="right">0.27 s</td></tr> <td align="right" dir="ltr"><font size="2">0.81 s</font></td></tr>
<tr><td>32-bit unaligned big endian</td><td align="right">3.82 s</td><td align="right">0.27 s</td></tr> <tr><td dir="ltr"><font size="2">16-bit unaligned big endian</font></td>
<tr><td>32-bit unaligned little endian</td><td align="right">3.82 s</td><td align="right">0.27 s</td></tr> <td align="right" dir="ltr"><font size="2">1.09 s</font></td>
<tr><td>64-bit aligned big endian</td><td align="right">1.65 s</td><td align="right">0.41 s</td></tr> <td align="right" dir="ltr"><font size="2">0.83 s</font></td></tr>
<tr><td>64-bit aligned little endian</td><td align="right">0.41 s</td><td align="right">0.41 s</td></tr> <tr><td dir="ltr"><font size="2">16-bit unaligned little endian</font></td>
<tr><td>64-bit unaligned big endian</td><td align="right">17.53 s</td><td align="right">0.41 s</td></tr> <td align="right" dir="ltr"><font size="2">1.09 s</font></td>
<tr><td>64-bit unaligned little endian</td><td align="right">17.52 s</td><td align="right">0.41 s</td></tr> <td align="right" dir="ltr"><font size="2">0.81 s</font></td></tr>
<tr><td dir="ltr"><font size="2">32-bit aligned big endian</font></td>
<td align="right" dir="ltr"><font size="2">0.98 s</font></td>
<td align="right" dir="ltr"><font size="2">0.27 s</font></td></tr>
<tr><td dir="ltr"><font size="2">32-bit aligned little endian</font></td>
<td align="right" dir="ltr"><font size="2">0.28 s</font></td>
<td align="right" dir="ltr"><font size="2">0.27 s</font></td></tr>
<tr><td dir="ltr"><font size="2">32-bit unaligned big endian</font></td>
<td align="right" dir="ltr"><font size="2">3.82 s</font></td>
<td align="right" dir="ltr"><font size="2">0.27 s</font></td></tr>
<tr><td dir="ltr"><font size="2">32-bit unaligned little endian</font></td>
<td align="right" dir="ltr"><font size="2">3.82 s</font></td>
<td align="right" dir="ltr"><font size="2">0.27 s</font></td></tr>
<tr><td dir="ltr"><font size="2">64-bit aligned big endian</font></td>
<td align="right" dir="ltr"><font size="2">1.65 s</font></td>
<td align="right" dir="ltr"><font size="2">0.41 s</font></td></tr>
<tr><td dir="ltr"><font size="2">64-bit aligned little endian</font></td>
<td align="right" dir="ltr"><font size="2">0.41 s</font></td>
<td align="right" dir="ltr"><font size="2">0.41 s</font></td></tr>
<tr><td dir="ltr"><font size="2">64-bit unaligned big endian</font></td>
<td align="right" dir="ltr"><font size="2">17.53 s</font></td>
<td align="right" dir="ltr"><font size="2">0.41 s</font></td></tr>
<tr><td dir="ltr"><font size="2">64-bit unaligned little endian</font></td>
<td align="right" dir="ltr"><font size="2">17.52 s</font></td>
<td align="right" dir="ltr"><font size="2">0.41 s</font></td></tr>
<tr><td colspan="6" align="center"><b> Iterations: 1000000000, Intrinsics: no byte swap intrinsics</b></td></tr> <tr><td colspan="6" align="center" dir="ltr"><b> <font size="2">Iterations: 1000000000, Intrinsics: no byte swap intrinsics</font></b></td></tr>
<tr><td><b>Test Case</b></td> <tr><td dir="ltr"><b><font size="2">Test Case</font></b></td>
<td align="center"><b>Endian<br>type</b></td> <td align="center" dir="ltr"><b><font size="2">Endian<br>type</font></b></td>
<td align="center"><b>Endian<br>conversion<br>function</b></td> <td align="center" dir="ltr"><b><font size="2">Endian<br>conversion<br>function</font></b></td>
</tr> </tr>
<tr><td>16-bit aligned big endian</td><td align="right">1.95 s</td><td align="right">0.81 s</td></tr> <tr><td dir="ltr"><font size="2">16-bit aligned big endian</font></td>
<tr><td>16-bit aligned little endian</td><td align="right">0.83 s</td><td align="right">0.81 s</td></tr> <td align="right" dir="ltr"><font size="2">1.95 s</font></td>
<tr><td>16-bit unaligned big endian</td><td align="right">1.19 s</td><td align="right">0.81 s</td></tr> <td align="right" dir="ltr"><font size="2">0.81 s</font></td></tr>
<tr><td>16-bit unaligned little endian</td><td align="right">1.20 s</td><td align="right">0.81 s</td></tr> <tr><td dir="ltr"><font size="2">16-bit aligned little endian</font></td>
<tr><td>32-bit aligned big endian</td><td align="right">0.97 s</td><td align="right">0.28 s</td></tr> <td align="right" dir="ltr"><font size="2">0.83 s</font></td>
<tr><td>32-bit aligned little endian</td><td align="right">0.27 s</td><td align="right">0.28 s</td></tr> <td align="right" dir="ltr"><font size="2">0.81 s</font></td></tr>
<tr><td>32-bit unaligned big endian</td><td align="right">4.10 s</td><td align="right">0.27 s</td></tr> <tr><td dir="ltr"><font size="2">16-bit unaligned big endian</font></td>
<tr><td>32-bit unaligned little endian</td><td align="right">4.10 s</td><td align="right">0.27 s</td></tr> <td align="right" dir="ltr"><font size="2">1.19 s</font></td>
<tr><td>64-bit aligned big endian</td><td align="right">1.64 s</td><td align="right">0.42 s</td></tr> <td align="right" dir="ltr"><font size="2">0.81 s</font></td></tr>
<tr><td>64-bit aligned little endian</td><td align="right">0.41 s</td><td align="right">0.41 s</td></tr> <tr><td dir="ltr"><font size="2">16-bit unaligned little endian</font></td>
<tr><td>64-bit unaligned big endian</td><td align="right">17.52 s</td><td align="right">0.42 s</td></tr> <td align="right" dir="ltr"><font size="2">1.20 s</font></td>
<tr><td>64-bit unaligned little endian</td><td align="right">17.52 s</td><td align="right">0.41 s</td></tr> <td align="right" dir="ltr"><font size="2">0.81 s</font></td></tr>
<tr><td dir="ltr"><font size="2">32-bit aligned big endian</font></td>
<td align="right" dir="ltr"><font size="2">0.97 s</font></td>
<td align="right" dir="ltr"><font size="2">0.28 s</font></td></tr>
<tr><td dir="ltr"><font size="2">32-bit aligned little endian</font></td>
<td align="right" dir="ltr"><font size="2">0.27 s</font></td>
<td align="right" dir="ltr"><font size="2">0.28 s</font></td></tr>
<tr><td dir="ltr"><font size="2">32-bit unaligned big endian</font></td>
<td align="right" dir="ltr"><font size="2">4.10 s</font></td>
<td align="right" dir="ltr"><font size="2">0.27 s</font></td></tr>
<tr><td dir="ltr"><font size="2">32-bit unaligned little endian</font></td>
<td align="right" dir="ltr"><font size="2">4.10 s</font></td>
<td align="right" dir="ltr"><font size="2">0.27 s</font></td></tr>
<tr><td dir="ltr"><font size="2">64-bit aligned big endian</font></td>
<td align="right" dir="ltr"><font size="2">1.64 s</font></td>
<td align="right" dir="ltr"><font size="2">0.42 s</font></td></tr>
<tr><td dir="ltr"><font size="2">64-bit aligned little endian</font></td>
<td align="right" dir="ltr"><font size="2">0.41 s</font></td>
<td align="right" dir="ltr"><font size="2">0.41 s</font></td></tr>
<tr><td dir="ltr"><font size="2">64-bit unaligned big endian</font></td>
<td align="right" dir="ltr"><font size="2">17.52 s</font></td>
<td align="right" dir="ltr"><font size="2">0.42 s</font></td></tr>
<tr><td dir="ltr"><font size="2">64-bit unaligned little endian</font></td>
<td align="right" dir="ltr"><font size="2">17.52 s</font></td>
<td align="right" dir="ltr"><font size="2">0.41 s</font></td></tr>
</table> </table>
<p></p> <p></p>
<table border="1" cellpadding="5" cellspacing="0"style="border-collapse: collapse" bordercolor="#111111"> <table border="1" cellpadding="5" cellspacing="0"style="border-collapse: collapse" bordercolor="#111111" dir="ltr">
<tr><td colspan="6" align="center"><b>Microsoft Visual C++ version 11.0</b></td></tr> <tr><td colspan="6" align="center" dir="ltr"><b><font size="2">Microsoft Visual C++ version 11.0</font></b></td></tr>
<tr><td colspan="6" align="center"><b> Iterations: 1000000000, Intrinsics: cstdlib _byteswap_ushort, etc.</b></td></tr> <tr><td colspan="6" align="center" dir="ltr"><b> <font size="2">Iterations: 1000000000, Intrinsics: cstdlib _byteswap_ushort, etc.</font></b></td></tr>
<tr><td><b>Test Case</b></td> <tr><td dir="ltr"><b><font size="2">Test Case</font></b></td>
<td align="center"><b>Endian<br>type</b></td> <td align="center" dir="ltr"><b><font size="2">Endian<br>type</font></b></td>
<td align="center"><b>Endian<br>conversion<br>function</b></td> <td align="center" dir="ltr"><b><font size="2">Endian<br>conversion<br>function</font></b></td>
</tr> </tr>
<tr><td>16-bit aligned big endian</td><td align="right">0.83 s</td><td align="right">0.51 s</td></tr> <tr><td dir="ltr"><font size="2">16-bit aligned big endian</font></td>
<tr><td>16-bit aligned little endian</td><td align="right">0.51 s</td><td align="right">0.50 s</td></tr> <td align="right" dir="ltr"><font size="2">0.83 s</font></td>
<tr><td>16-bit unaligned big endian</td><td align="right">1.37 s</td><td align="right">0.51 s</td></tr> <td align="right" dir="ltr"><font size="2">0.51 s</font></td></tr>
<tr><td>16-bit unaligned little endian</td><td align="right">1.37 s</td><td align="right">0.50 s</td></tr> <tr><td dir="ltr"><font size="2">16-bit aligned little endian</font></td>
<tr><td>32-bit aligned big endian</td><td align="right" bgcolor="#CCFFCC">0.81 s</td><td align="right">0.50 s</td></tr> <td align="right" dir="ltr"><font size="2">0.51 s</font></td>
<tr><td>32-bit aligned little endian</td><td align="right">0.51 s</td><td align="right">0.51 s</td></tr> <td align="right" dir="ltr"><font size="2">0.50 s</font></td></tr>
<tr><td>32-bit unaligned big endian</td><td align="right">2.98 s</td><td align="right">0.53 s</td></tr> <tr><td dir="ltr"><font size="2">16-bit unaligned big endian</font></td>
<tr><td>32-bit unaligned little endian</td><td align="right">3.00 s</td><td align="right">0.51 s</td></tr> <td align="right" dir="ltr"><font size="2">1.37 s</font></td>
<tr><td>64-bit aligned big endian</td><td align="right" bgcolor="#CCFFCC">1.33 s</td><td align="right">0.33 s</td></tr> <td align="right" dir="ltr"><font size="2">0.51 s</font></td></tr>
<tr><td>64-bit aligned little endian</td><td align="right">0.34 s</td><td align="right">0.27 s</td></tr> <tr><td dir="ltr"><font size="2">16-bit unaligned little endian</font></td>
<tr><td>64-bit unaligned big endian</td><td align="right">7.05 s</td><td align="right">0.33 s</td></tr> <td align="right" dir="ltr"><font size="2">1.37 s</font></td>
<tr><td>64-bit unaligned little endian</td><td align="right">7.11 s</td><td align="right">0.31 s</td></tr> <td align="right" dir="ltr"><font size="2">0.50 s</font></td></tr>
<tr><td dir="ltr"><font size="2">32-bit aligned big endian</font></td>
<td align="right" bgcolor="#CCFFCC" dir="ltr"><font size="2">0.81 s</font></td>
<td align="right" dir="ltr"><font size="2">0.50 s</font></td></tr>
<tr><td dir="ltr"><font size="2">32-bit aligned little endian</font></td>
<td align="right" dir="ltr"><font size="2">0.51 s</font></td>
<td align="right" dir="ltr"><font size="2">0.51 s</font></td></tr>
<tr><td dir="ltr"><font size="2">32-bit unaligned big endian</font></td>
<td align="right" dir="ltr"><font size="2">2.98 s</font></td>
<td align="right" dir="ltr"><font size="2">0.53 s</font></td></tr>
<tr><td dir="ltr"><font size="2">32-bit unaligned little endian</font></td>
<td align="right" dir="ltr"><font size="2">3.00 s</font></td>
<td align="right" dir="ltr"><font size="2">0.51 s</font></td></tr>
<tr><td dir="ltr"><font size="2">64-bit aligned big endian</font></td>
<td align="right" bgcolor="#CCFFCC" dir="ltr"><font size="2">1.33 s</font></td>
<td align="right" dir="ltr"><font size="2">0.33 s</font></td></tr>
<tr><td dir="ltr"><font size="2">64-bit aligned little endian</font></td>
<td align="right" dir="ltr"><font size="2">0.34 s</font></td>
<td align="right" dir="ltr"><font size="2">0.27 s</font></td></tr>
<tr><td dir="ltr"><font size="2">64-bit unaligned big endian</font></td>
<td align="right" dir="ltr"><font size="2">7.05 s</font></td>
<td align="right" dir="ltr"><font size="2">0.33 s</font></td></tr>
<tr><td dir="ltr"><font size="2">64-bit unaligned little endian</font></td>
<td align="right" dir="ltr"><font size="2">7.11 s</font></td>
<td align="right" dir="ltr"><font size="2">0.31 s</font></td></tr>
<tr><td colspan="6" align="center"><b> Iterations: 1000000000, Intrinsics: no byte swap intrinsics</b></td></tr> <tr><td colspan="6" align="center" dir="ltr"><b> <font size="2">Iterations: 1000000000, Intrinsics: no byte swap intrinsics</font></b></td></tr>
<tr><td><b>Test Case</b></td> <tr><td dir="ltr"><b><font size="2">Test Case</font></b></td>
<td align="center"><b>Endian<br>type</b></td> <td align="center" dir="ltr"><b><font size="2">Endian<br>type</font></b></td>
<td align="center"><b>Endian<br>conversion<br>function</b></td> <td align="center" dir="ltr"><b><font size="2">Endian<br>conversion<br>function</font></b></td>
</tr> </tr>
<tr><td>16-bit aligned big endian</td><td align="right">0.83 s</td><td align="right">0.51 s</td></tr> <tr><td dir="ltr"><font size="2">16-bit aligned big endian</font></td>
<tr><td>16-bit aligned little endian</td><td align="right">0.51 s</td><td align="right">0.51 s</td></tr> <td align="right" dir="ltr"><font size="2">0.83 s</font></td>
<tr><td>16-bit unaligned big endian</td><td align="right">1.36 s</td><td align="right">0.51 s</td></tr> <td align="right" dir="ltr"><font size="2">0.51 s</font></td></tr>
<tr><td>16-bit unaligned little endian</td><td align="right">1.37 s</td><td align="right">0.51 s</td></tr> <tr><td dir="ltr"><font size="2">16-bit aligned little endian</font></td>
<tr><td>32-bit aligned big endian</td><td align="right" bgcolor="#FFCACA">3.42 s</td><td align="right">0.50 s</td></tr> <td align="right" dir="ltr"><font size="2">0.51 s</font></td>
<tr><td>32-bit aligned little endian</td><td align="right">0.51 s</td><td align="right">0.51 s</td></tr> <td align="right" dir="ltr"><font size="2">0.51 s</font></td></tr>
<tr><td>32-bit unaligned big endian</td><td align="right">2.93 s</td><td align="right">0.50 s</td></tr> <tr><td dir="ltr"><font size="2">16-bit unaligned big endian</font></td>
<tr><td>32-bit unaligned little endian</td><td align="right">2.95 s</td><td align="right">0.50 s</td></tr> <td align="right" dir="ltr"><font size="2">1.36 s</font></td>
<tr><td>64-bit aligned big endian</td><td align="right" bgcolor="#FFCACA">5.99 s</td><td align="right">0.33 s</td></tr> <td align="right" dir="ltr"><font size="2">0.51 s</font></td></tr>
<tr><td>64-bit aligned little endian</td><td align="right">0.33 s</td><td align="right">0.33 s</td></tr> <tr><td dir="ltr"><font size="2">16-bit unaligned little endian</font></td>
<tr><td>64-bit unaligned big endian</td><td align="right">7.02 s</td><td align="right">0.27 s</td></tr> <td align="right" dir="ltr"><font size="2">1.37 s</font></td>
<tr><td>64-bit unaligned little endian</td><td align="right">7.02 s</td><td align="right">0.27 s</td></tr> <td align="right" dir="ltr"><font size="2">0.51 s</font></td></tr>
<tr><td dir="ltr"><font size="2">32-bit aligned big endian</font></td>
<td align="right" bgcolor="#FFCACA" dir="ltr"><font size="2">3.42 s</font></td>
<td align="right" dir="ltr"><font size="2">0.50 s</font></td></tr>
<tr><td dir="ltr"><font size="2">32-bit aligned little endian</font></td>
<td align="right" dir="ltr"><font size="2">0.51 s</font></td>
<td align="right" dir="ltr"><font size="2">0.51 s</font></td></tr>
<tr><td dir="ltr"><font size="2">32-bit unaligned big endian</font></td>
<td align="right" dir="ltr"><font size="2">2.93 s</font></td>
<td align="right" dir="ltr"><font size="2">0.50 s</font></td></tr>
<tr><td dir="ltr"><font size="2">32-bit unaligned little endian</font></td>
<td align="right" dir="ltr"><font size="2">2.95 s</font></td>
<td align="right" dir="ltr"><font size="2">0.50 s</font></td></tr>
<tr><td dir="ltr"><font size="2">64-bit aligned big endian</font></td>
<td align="right" bgcolor="#FFCACA" dir="ltr"><font size="2">5.99 s</font></td>
<td align="right" dir="ltr"><font size="2">0.33 s</font></td></tr>
<tr><td dir="ltr"><font size="2">64-bit aligned little endian</font></td>
<td align="right" dir="ltr"><font size="2">0.33 s</font></td>
<td align="right" dir="ltr"><font size="2">0.33 s</font></td></tr>
<tr><td dir="ltr"><font size="2">64-bit unaligned big endian</font></td>
<td align="right" dir="ltr"><font size="2">7.02 s</font></td>
<td align="right" dir="ltr"><font size="2">0.27 s</font></td></tr>
<tr><td dir="ltr"><font size="2">64-bit unaligned little endian</font></td>
<td align="right" dir="ltr"><font size="2">7.02 s</font></td>
<td align="right" dir="ltr"><font size="2">0.27 s</font></td></tr>
</table> </table>
@@ -487,9 +577,9 @@ paramount.</p>
<p><b>Which is better, big-endian or little-endian?</b></p> <p><b>Which is better, big-endian or little-endian?</b></p>
<blockquote> <blockquote>
<p>Big-endian tends to be a <p>Big-endian tends to be preferred in a networking environment and is a bit
bit more of an industry standard, but little-endian may be preferred for more of an industry standard, but little-endian may be preferred for
applications that run primarily Intel/AMD on x86, x64, and other little-endian applications that run primarily on x86, x64, and other little-endian
CPU's. The <a href="http://en.wikipedia.org/wiki/Endian">Wikipedia</a> article CPU's. The <a href="http://en.wikipedia.org/wiki/Endian">Wikipedia</a> article
gives more pros and cons.</p> gives more pros and cons.</p>
</blockquote> </blockquote>
@@ -498,7 +588,7 @@ gives more pros and cons.</p>
<blockquote> <blockquote>
<p>These are the only endian schemes that have any practical value today. PDP-11 <p>These are the only endian schemes that have any practical value today. PDP-11
and the other middle endian approaches are interesting historical curiosities and the other middle endian approaches are interesting historical curiosities
but have no relevance to C++ developers.</p> but have no relevance to today&#39;s C++ developers.</p>
</blockquote> </blockquote>
<p><b>What are the limitations of floating point support?</b></p> <p><b>What are the limitations of floating point support?</b></p>
@@ -534,16 +624,14 @@ and 16, 32, and 64-bit aligned integers.</p>
64-bit <code>(double)</code> floating point, as requested.</li> 64-bit <code>(double)</code> floating point, as requested.</li>
<li>Both the endian types and endian conversion functions now support UDTs, as requested.</li> <li>Both the endian types and endian conversion functions now support UDTs, as requested.</li>
<li>The endian type aliases have been renamed, <li>The endian type aliases have been renamed,
using a naming pattern that is consistent for both integer and floating point, using a naming pattern that is consistent for both integer and floating point.</li>
and that emphasizes that aligned types are usually preferred compared to
unaligned types. Unaligned types are deliberately given slightly uglier names.</li>
<li>The conversion functions have been much revised, <li>The conversion functions have been much revised,
refactored, and otherwise improved based on review comments.<ul> refactored, and otherwise improved based on review comments.<ul>
<li>Functions have been renamed to clarify their functionality.</li> <li>Functions have been renamed to clarify their functionality.</li>
<li>Both return-by-value and modify-in-place interfaces are provided, as <li>Both return-by-value and modify-in-place interfaces are provided, as
requested.</li> requested.</li>
<li>Synonyms for the BSD byte swapping function names popularized by OS X <li>Synonyms for the BSD byte swapping function names popularized by OS X
and Linux are provided, so that that developers already used to these name and Linux are provided, so that that developers already used to these names
can continue to use them if they wish.</li> can continue to use them if they wish.</li>
<li>In addition to the named-endianness functions, functions that perform <li>In addition to the named-endianness functions, functions that perform
compile-time (via template) and run-time (via function argument) dispatch compile-time (via template) and run-time (via function argument) dispatch
@@ -555,34 +643,34 @@ and 16, 32, and 64-bit aligned integers.</p>
<li>For the endian types, the implementation uses the endian conversion functions, <li>For the endian types, the implementation uses the endian conversion functions,
and thus the intrinsics, and thus the intrinsics,
as requested.</li> as requested.</li>
<li><code>order::native</code> is now a synonym for <code>order::big</code>
or <code>order::little</code> according to the endianness of the platform, as
requested. This reduces the number of template specializations required.</li>
<li><code>reverse_value()</code> overloads for <code>int8_t</code> and <code>
uint8_t</code> have been added for improved generality. (Pierre Talbot)</li>
<li>Overloads of <code>reverse()</code> have been replaced with a single <code>
reverse()</code> template. (Pierre Talbot)</li>
<li>C++11 features such as <code>noexcept</code> are now used, while still <li>C++11 features such as <code>noexcept</code> are now used, while still
supporting C++03 compilers.</li> supporting C++03 compilers.</li>
<li>Acknowledgements have been updated.</li>
<li>Headers have been reorganized to make them easier to read, <li>Headers have been reorganized to make them easier to read,
with a synopsis at the front and implementation following, as requested.</li> with a synopsis at the front and implementation following, as requested.</li>
<li>Documentation has been revised to address most, but not all, concerns <li>Documentation has been revised to address most, but not all, concerns
raised during formal review.</li> raised during formal review.</li>
<li>Acknowledgements have been updated.</li>
</ul> </ul>
<h2><a name="Acknowledgements">Acknowledgements</a></h2> <h2><a name="Acknowledgements">Acknowledgements</a></h2>
<p>Comments and suggestions were <p>Comments and suggestions were received from Adder, Benaka Moorthi,
received from Christopher Kohlhoff, Cliff Green, Daniel James, Gennaro Proto, Giovanni Piero
Adder, Benaka Moorthi, Deretta, Gordon Woodhull, dizzy, Hartmut Kaiser, Jeff Flinn, John Filo, John
Christopher Kohlhoff, Maddock, Kim Barrett, Marsh Ray, Martin Bonner, Mathias Gaunard, Matias
Cliff Green, Daniel James, Gennaro Proto, Capeletto, Neil Mayhew, Paul Bristow, Pierre Talbot, Phil Endecott, Pyry Jahkola,
Giovanni Piero Deretta, Gordon Woodhull, dizzy, Hartmut Kaiser, Jeff Flinn, Rene Rivera, Robert Stewart, Roland Schwarz, Scott McMurray, Sebastian Redl, Tim
John Filo, John Maddock, Blechmann, Tim Moore, tymofey, Tomas Puverle, Vincente Botet, Yuval Ronen and
Kim Barrett, Vitaly Budovski,.</p>
Marsh Ray,
Martin Bonner, Mathias Gaunard, Matias Capeletto,
Neil Mayhew, Paul Bristow, Phil Endecott, Pyry Jahkola, Rene Rivera,
Robert Stewart, Roland Schwarz, Scott McMurray,
Sebastian Redl,
Tim Blechmann, Tim Moore, tymofey, Tomas Puverle, Vincente Botet, Yuval Ronen
and Vitaly Budovski,.</p>
<hr> <hr>
<p>Last revised: <p>Last revised:
<!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->01 September, 2013<!--webbot bot="Timestamp" endspan i-checksum="39334" --></p> <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->12 August, 2014<!--webbot bot="Timestamp" endspan i-checksum="34569" --></p>
<p>© Copyright Beman Dawes, 2011, 2013</p> <p>© Copyright Beman Dawes, 2011, 2013</p>
<p>Distributed under the Boost Software License, Version 1.0. See <p>Distributed under the Boost Software License, Version 1.0. See
<a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/ LICENSE_1_0.txt</a></p> <a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/ LICENSE_1_0.txt</a></p>

View File

@@ -76,7 +76,7 @@
</table> </table>
<h2><a name="Introduction">Introduction</a></h2> <h2><a name="Introduction">Introduction</a></h2>
<p>Header <a href="../include/boost/endian/types.hpp">boost/endian/types.hpp</a> <p>Header <a href="../include/boost/endian/types.hpp">boost/endian/types.hpp</a>
provides integer and floating point binary types with explicit control over provides integer and floating point binary types with control over
byte order, value type, size, and alignment. Typedefs provide easy-to-use names byte order, value type, size, and alignment. Typedefs provide easy-to-use names
for common configurations.</p> for common configurations.</p>
<p>These types provide portable byte-holders for integer data, independent of <p>These types provide portable byte-holders for integer data, independent of
@@ -102,7 +102,7 @@ arithmetic operators are <code>+</code>, <code>+=</code>, <code>-</code>, <code>
<code>&gt;&gt;=</code>. Binary relational operators are <code>==</code>, <code>!=</code>, <code>&gt;&gt;=</code>. Binary relational operators are <code>==</code>, <code>!=</code>,
<code>&lt;</code>, <code>&lt;=</code>, <code>&gt;</code>, <code>&gt;=</code>.</p> <code>&lt;</code>, <code>&lt;=</code>, <code>&gt;</code>, <code>&gt;=</code>.</p>
<p>Automatic implicit conversion to the underlying value type is provided. An <p>Automatic implicit conversion to the underlying value type is provided. An
explicit conversion constructor from the underlying value type is provided. </p> conversion constructor from the underlying value type is provided. </p>
<h2><a name="Example">Example</a></h2> <h2><a name="Example">Example</a></h2>
<p>The <a href="../example/endian_example.cpp">endian_example.cpp</a> program writes a <p>The <a href="../example/endian_example.cpp">endian_example.cpp</a> program writes a
binary file containing four byte big-endian and little-endian integers:</p> binary file containing four byte big-endian and little-endian integers:</p>
@@ -207,6 +207,7 @@ will no longer be relying on unspecified behavior.</p>
<p>Two scoped enums are provided:</p> <p>Two scoped enums are provided:</p>
<blockquote> <blockquote>
<pre>enum class order {big, little, native}; <pre>enum class order {big, little, native};
enum class align {no, yes}; </pre> enum class align {no, yes}; </pre>
</blockquote> </blockquote>
<p>One class template is provided:</p> <p>One class template is provided:</p>
@@ -349,7 +350,13 @@ usual operations on integers are supplied.</p>
{ {
// C++11 features emulated if not available // C++11 features emulated if not available
enum class <a name="endianness">order</a> {big, little, native}; enum class <a name="order">order</a>
{
big, // big-endian
little, // little-endian
native = <b><i>implementation-defined</i></b> // same as order::big or order::little<b><i>
</i></b>};
enum class <a name="alignment">align</a> {no, yes}; enum class <a name="alignment">align</a> {no, yes};
template &lt;order Order, typename T, std::size_t n_bits, align A = align::no&gt; template &lt;order Order, typename T, std::size_t n_bits, align A = align::no&gt;
@@ -361,13 +368,14 @@ usual operations on integers are supplied.</p>
// if BOOST_ENDIAN_FORCE_PODNESS is defined &amp;&amp; C++11 POD's are not // if BOOST_ENDIAN_FORCE_PODNESS is defined &amp;&amp; C++11 POD's are not
// available then these two constructors will not be present // available then these two constructors will not be present
<a href="#endian">endian</a>() noexcept = default; <a href="#endian">endian</a>() noexcept = default;
explicit <a href="#explicit-endian">endian</a>(T v) noexcept; <a href="#explicit-endian">endian</a>(T v) noexcept;
endian&amp; <a href="#operator-eq">operator=</a>(T v) noexcept; endian&amp; <a href="#operator-eq">operator=</a>(T v) noexcept;
<a href="#operator-T">operator T</a>() const noexcept; <a href="#operator-T">operator T</a>() const noexcept;
const char* <a href="#data">data</a>() const noexcept; const char* <a href="#data">data</a>() const noexcept;
// arithmetic operations; additional operators provided by value_type // arithmetic operations
// note that additional operations are provided by the value_type
value_type operator+(const endian&amp; x) noexcept; value_type operator+(const endian&amp; x) noexcept;
endian&amp; operator+=(endian&amp; x, value_type y) noexcept; endian&amp; operator+=(endian&amp; x, value_type y) noexcept;
endian&amp; operator-=(endian&amp; x, value_type y) noexcept; endian&amp; operator-=(endian&amp; x, value_type y) noexcept;
@@ -387,43 +395,44 @@ usual operations on integers are supplied.</p>
endian operator--(endian&amp; x, int) noexcept; endian operator--(endian&amp; x, int) noexcept;
}; };
typedef endian&lt;order::big, float, 32, align::yes&gt; big_align_float32_t; // aligned big endian floating point types
typedef endian&lt;order::big, double, 64, align::yes&gt; big_align_float64_t; typedef endian&lt;order::big, float, 32, align::yes&gt; big_align_float32_t;
typedef endian&lt;order::big, double, 64, align::yes&gt; big_align_float64_t;
// aligned little endian floating point types // aligned little endian floating point types
typedef endian&lt;order::little, float, 32, align::yes&gt; little_align_float32_t; typedef endian&lt;order::little, float, 32, align::yes&gt; little_align_float32_t;
typedef endian&lt;order::little, double, 64, align::yes&gt; little_align_float64_t; typedef endian&lt;order::little, double, 64, align::yes&gt; little_align_float64_t;
// unaligned big endian floating point types // unaligned big endian floating point types
typedef endian&lt;order::big, float, 32, align::no&gt; big_float32un_t; typedef endian&lt;order::big, float, 32, align::no&gt; big_float32un_t;
typedef endian&lt;order::big, double, 64, align::no&gt; big_float64un_t; typedef endian&lt;order::big, double, 64, align::no&gt; big_float64un_t;
// unaligned little endian floating point types // unaligned little endian floating point types
typedef endian&lt;order::little, float, 32, align::no&gt; little_float32un_t; typedef endian&lt;order::little, float, 32, align::no&gt; little_float32un_t;
typedef endian&lt;order::little, double, 64, align::no&gt; little_float64un_t; typedef endian&lt;order::little, double, 64, align::no&gt; little_float64un_t;
// aligned big endian signed integer types // aligned big endian signed integer types
typedef endian&lt;order::big, int16_t, 16, align::yes&gt; big_align_int16_t; typedef endian&lt;order::big, int16_t, 16, align::yes&gt; big_align_int16_t;
typedef endian&lt;order::big, int32_t, 32, align::yes&gt; big_align_int32_t; typedef endian&lt;order::big, int32_t, 32, align::yes&gt; big_align_int32_t;
typedef endian&lt;order::big, int64_t, 64, align::yes&gt; big_align_int64_t; typedef endian&lt;order::big, int64_t, 64, align::yes&gt; big_align_int64_t;
// aligned big endian unsigned integer types // aligned big endian unsigned integer types
typedef endian&lt;order::big, uint16_t, 16, align::yes&gt; big_align_uint16_t; typedef endian&lt;order::big, uint16_t, 16, align::yes&gt; big_align_uint16_t;
typedef endian&lt;order::big, uint32_t, 32, align::yes&gt; big_align_uint32_t; typedef endian&lt;order::big, uint32_t, 32, align::yes&gt; big_align_uint32_t;
typedef endian&lt;order::big, uint64_t, 64, align::yes&gt; big_align_uint64_t; typedef endian&lt;order::big, uint64_t, 64, align::yes&gt; big_align_uint64_t;
// aligned little endian signed integer types // aligned little endian signed integer types
typedef endian&lt;order::little, int16_t, 16, align::yes&gt; little_align_int16_t; typedef endian&lt;order::little, int16_t, 16, align::yes&gt; little_align_int16_t;
typedef endian&lt;order::little, int32_t, 32, align::yes&gt; little_align_int32_t; typedef endian&lt;order::little, int32_t, 32, align::yes&gt; little_align_int32_t;
typedef endian&lt;order::little, int64_t, 64, align::yes&gt; little_align_int64_t; typedef endian&lt;order::little, int64_t, 64, align::yes&gt; little_align_int64_t;
// aligned little endian unsigned integer types // aligned little endian unsigned integer types
typedef endian&lt;order::little, uint16_t, 16, align::yes&gt; little_align_uint16_t; typedef endian&lt;order::little, uint16_t, 16, align::yes&gt; little_align_uint16_t;
typedef endian&lt;order::little, uint32_t, 32, align::yes&gt; little_align_uint32_t; typedef endian&lt;order::little, uint32_t, 32, align::yes&gt; little_align_uint32_t;
typedef endian&lt;order::little, uint64_t, 64, align::yes&gt; little_align_uint64_t; typedef endian&lt;order::little, uint64_t, 64, align::yes&gt; little_align_uint64_t;
// aligned native endian typedefs are not provided because // aligned native endian typedefs are not provided because
// &lt;cstdint&gt; types are superior for this use case // &lt;cstdint&gt; types are superior for that use case
// unaligned big endian signed integer types // unaligned big endian signed integer types
typedef endian&lt;order::big, int_least8_t, 8&gt; big_int8_t; typedef endian&lt;order::big, int_least8_t, 8&gt; big_int8_t;
@@ -465,51 +474,56 @@ usual operations on integers are supplied.</p>
typedef endian&lt;order::little, uint_least64_t, 56&gt; little_uint56_t; typedef endian&lt;order::little, uint_least64_t, 56&gt; little_uint56_t;
typedef endian&lt;order::little, uint_least64_t, 64&gt; little_uint64_t; typedef endian&lt;order::little, uint_least64_t, 64&gt; little_uint64_t;
// unaligned native endian signed integer types // unaligned native endian signed integer types
typedef endian&lt;order::native, int_least8_t, 8&gt; native_int8_t; typedef <b><i>implementation-defined</i></b>_int8_t native_int8_t;
typedef endian&lt;order::native, int_least16_t, 16&gt; native_int16_t; typedef <b><i>implementation-defined</i></b>_int16_t native_int16_t;
typedef endian&lt;order::native, int_least32_t, 24&gt; native_int24_t; typedef <b><i>implementation-defined</i></b>_int24_t native_int24_t;
typedef endian&lt;order::native, int_least32_t, 32&gt; native_int32_t; typedef <b><i>implementation-defined</i></b>_int32_t native_int32_t;
typedef endian&lt;order::native, int_least64_t, 40&gt; native_int40_t; typedef <b><i>implementation-defined</i></b>_int40_t native_int40_t;
typedef endian&lt;order::native, int_least64_t, 48&gt; native_int48_t; typedef <b><i>implementation-defined</i></b>_int48_t native_int48_t;
typedef endian&lt;order::native, int_least64_t, 56&gt; native_int56_t; typedef <b><i>implementation-defined</i></b>_int56_t native_int56_t;
typedef endian&lt;order::native, int_least64_t, 64&gt; native_int64_t; typedef <b><i>implementation-defined</i></b>_int64_t native_int64_t;
// unaligned native endian unsigned integer types // unaligned native endian unsigned integer types
typedef endian&lt;order::native, uint_least8_t, 8&gt; native_uint8_t; typedef <b><i>implementation-defined</i></b>_uint8_t native_uint8_t;
typedef endian&lt;order::native, uint_least16_t, 16&gt; native_uint16_t; typedef <b><i>implementation-defined</i></b>_uint16_t native_uint16_t;
typedef endian&lt;order::native, uint_least32_t, 24&gt; native_uint24_t; typedef <b><i>implementation-defined</i></b>_uint24_t native_uint24_t;
typedef endian&lt;order::native, uint_least32_t, 32&gt; native_uint32_t; typedef <b><i>implementation-defined</i></b>_uint32_t native_uint32_t;
typedef endian&lt;order::native, uint_least64_t, 40&gt; native_uint40_t; typedef <b><i>implementation-defined</i></b>_uint40_t native_uint40_t;
typedef endian&lt;order::native, uint_least64_t, 48&gt; native_uint48_t; typedef <b><i>implementation-defined</i></b>_uint48_t native_uint48_t;
typedef endian&lt;order::native, uint_least64_t, 56&gt; native_uint56_t; typedef <b><i>implementation-defined</i></b>_uint56_t native_uint56_t;
typedef endian&lt;order::native, uint_least64_t, 64&gt; native_uint64_t; typedef <b><i>implementation-defined</i></b>_uint64_t native_uint64_t;
} // namespace endian } // namespace endian
} // namespace boost</pre> } // namespace boost</pre>
<p>The <i><b><code>implementation-defined</code></b></i> text above is either
<code>big</code> or <code>little</code> according to the endianness of the
platform.</p>
<h3><a name="Members">Members</a></h3> <h3><a name="Members">Members</a></h3>
<p><code><a name="endian">endian</a>() = default;&nbsp; // C++03: endian(){}</code></p> <div dir="ltr">
<pre><code><a name="endian">endian</a>() = default; // C++03: endian(){}</code></pre>
</div>
<blockquote> <blockquote>
<p><i>Effects:</i> Constructs an object of type <code>endian&lt;E, T, n_bits, A&gt;</code>.</p> <p><i>Effects:</i> Constructs an object of type <code>endian&lt;E, T, n_bits, A&gt;</code>.</p>
</blockquote> </blockquote>
<p><code><a name="explicit-endian">explicit endian</a>(T v);</code></p> <pre><code><a name="explicit-endian">endian</a>(T v);</code></pre>
<blockquote> <blockquote>
<p><i>Effects:</i> Constructs an object of type <code>endian&lt;E, T, n_bits, A&gt;</code>.</p> <p><i>Effects:</i> Constructs an object of type <code>endian&lt;E, T, n_bits, A&gt;</code>.</p>
<p><i>Postcondition:</i> <code>x == v,</code> where <code>x</code> is the <p><i>Postcondition:</i> <code>x == v,</code> where <code>x</code> is the
constructed object.</p> constructed object.</p>
</blockquote> </blockquote>
<p><code>endian&amp; <a name="operator-eq">operator=</a>(T v);</code></p> <pre><code>endian&amp; <a name="operator-eq">operator=</a>(T v);</code></pre>
<blockquote> <blockquote>
<p><i>Postcondition:</i> <code>x == v,</code> where <code>x</code> is the <p><i>Postcondition:</i> <code>x == v,</code> where <code>x</code> is the
constructed object.</p> constructed object.</p>
<p><i>Returns:</i> <code>*this</code>.</p> <p><i>Returns:</i> <code>*this</code>.</p>
</blockquote> </blockquote>
<p><code><a name="operator-T">operator T</a>() const;</code></p> <pre><code><a name="operator-T">operator T</a>() const;</code></pre>
<blockquote> <blockquote>
<p><i>Returns:</i> The current value stored in <code>*this</code>, converted to <p><i>Returns:</i> The current value stored in <code>*this</code>, converted to
<code>value_type</code>.</p> <code>value_type</code>.</p>
</blockquote> </blockquote>
<p><code>const char* <a name="data">data</a>() const;</code></p> <pre><code>const char* <a name="data">data</a>() const;</code></pre>
<blockquote> <blockquote>
<p><i>Returns:</i> A pointer to the first byte of the endian binary value stored <p><i>Returns:</i> A pointer to the first byte of the endian binary value stored
in <code>*this</code>.</p> in <code>*this</code>.</p>
@@ -564,13 +578,10 @@ incrementing a variable in a record. It is very convenient to write:</p>
representation) regardless of whether a compiler treats char as signed or representation) regardless of whether a compiler treats char as signed or
unsigned.</li> unsigned.</li>
<li>Unaligned types must not cause compilers to insert padding bytes.</li> <li>Unaligned types must not cause compilers to insert padding bytes.</li>
<li>The implementation should supply optimizations only in very limited <li>The implementation should supply optimizations with great care. Experience has shown that optimizations of endian
circumstances. Experience has shown that optimizations of endian
integers often become pessimizations when changing integers often become pessimizations when changing
machines or compilers. Pessimizations can also happen when changing compiler switches, machines or compilers. Pessimizations can also happen when changing compiler switches,
compiler versions, or CPU models of the same architecture.</li> compiler versions, or CPU models of the same architecture.</li>
<li>It is better software engineering if the same implementation works regardless
of the CPU endianness. In other words, #ifdefs should be avoided in user code.</li>
</ul> </ul>
<h2><a name="Experience">Experience</a></h2> <h2><a name="Experience">Experience</a></h2>
<p>Classes with similar functionality have been independently developed by <p>Classes with similar functionality have been independently developed by
@@ -617,7 +628,7 @@ differs from endian representation size. Vicente Botet and other reviewers
suggested supporting floating point types.</p> suggested supporting floating point types.</p>
<hr> <hr>
<p>Last revised: <p>Last revised:
<!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->31 August, 2013<!--webbot bot="Timestamp" endspan i-checksum="34505" --></p> <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->12 August, 2014<!--webbot bot="Timestamp" endspan i-checksum="34569" --></p>
<p>© Copyright Beman Dawes, 2006-2009, 2013</p> <p>© Copyright Beman Dawes, 2006-2009, 2013</p>
<p>Distributed under the Boost Software License, Version 1.0. See <p>Distributed under the Boost Software License, Version 1.0. See
<a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/ LICENSE_1_0.txt</a></p> <a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/ LICENSE_1_0.txt</a></p>