mirror of
https://github.com/boostorg/endian.git
synced 2025-07-31 13:07:24 +02:00
Merge develop
This commit is contained in:
35
README
Normal file
35
README
Normal 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
|
@ -88,26 +88,27 @@ namespace boost
|
||||
{
|
||||
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)
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
float <a href="#reverse_value">reverse_value</a>(float x) noexcept;
|
||||
double <a href="#reverse_value">reverse_value</a>(double x) noexcept;
|
||||
|
||||
void <a href="#reverse">reverse</a>(int16_t& x) noexcept;
|
||||
void <a href="#reverse">reverse</a>(int32_t& x) noexcept;
|
||||
void <a href="#reverse">reverse</a>(int64_t& x) noexcept;
|
||||
void <a href="#reverse">reverse</a>(uint16_t& x) noexcept;
|
||||
void <a href="#reverse">reverse</a>(uint32_t& x) noexcept;
|
||||
void <a href="#reverse">reverse</a>(uint64_t& x) noexcept;
|
||||
void <a href="#reverse">reverse</a>(float& x) noexcept;
|
||||
void <a href="#reverse">reverse</a>(double& x) noexcept;
|
||||
template <class Value>
|
||||
void <a href="#reverse">reverse</a>(Value& x) noexcept;
|
||||
|
||||
// reverse byte order unless native endianness is big
|
||||
template <class ReversibleValue >
|
||||
@ -155,6 +156,9 @@ namespace endian
|
||||
|
||||
} // namespace endian
|
||||
} // 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>
|
||||
<p>The template definitions in this header refer to named
|
||||
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="#convert_generic">convert</a></code> function templates.</p>
|
||||
<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;
|
||||
int64_t reverse_value(int64_t x) noexcept;
|
||||
uint8_t reverse_value(uint8_t x) noexcept;
|
||||
uint16_t reverse_value(uint16_t x) noexcept;
|
||||
uint32_t reverse_value(uint32_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
|
||||
constituent bytes reversed.</p>
|
||||
</blockquote>
|
||||
<pre><a name="reverse"></a>void reverse(int16_t& x) noexcept;
|
||||
void reverse(int32_t& x) noexcept;
|
||||
void reverse(int64_t& x) noexcept;
|
||||
void reverse(uint16_t& x) noexcept;
|
||||
void reverse(uint32_t& x) noexcept;
|
||||
void reverse(uint64_t& x) noexcept;
|
||||
void reverse(float& x) noexcept;
|
||||
void reverse(double& x) noexcept;</pre>
|
||||
<pre><a name="reverse"></a>template <class Value>
|
||||
void reverse(Value& x) noexcept;</pre>
|
||||
<blockquote>
|
||||
<p><i>Postconditions:</i> The order of the constituent bytes of
|
||||
<code>x</code> are reversed.</p>
|
||||
@ -333,10 +333,12 @@ provided.</p>
|
||||
</blockquote>
|
||||
|
||||
<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>
|
||||
<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>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>
|
||||
|
||||
|
354
index.html
354
index.html
@ -46,7 +46,7 @@
|
||||
<a href="#Introduction-to-endianness">Introduction to endianness</a><br>
|
||||
<a href="#Introduction">Introduction to the Boost.Endian library</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="#Timings">Timings</a><br>
|
||||
<a href="#Conclusions">Conclusions</a><br>
|
||||
@ -65,23 +65,15 @@
|
||||
</tr>
|
||||
</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>
|
||||
|
||||
<p>Boost.Endian provides facilities to manipulate the endianness of integers,
|
||||
floating point, and user defined data.</p>
|
||||
<ul>
|
||||
<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>
|
||||
</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>
|
||||
</li>
|
||||
<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>
|
||||
</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>
|
||||
<th><b><a href="conversion.html">Endian conversion functions</a> are better
|
||||
with these needs</b></th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<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
|
||||
and that can simplify program logic and eliminate logic errors.<br>
|
||||
</li>
|
||||
<li>A need to use unusual integer sizes (i.e. 3, 5,
|
||||
and that can simplify program logic and eliminate logic errors.</p></li>
|
||||
<li><p>A need to use unusual integer sizes (i.e. 3, 5,
|
||||
6, or 7 bytes) to reduce internal and external space usage and
|
||||
save I/O time.<br>
|
||||
</li>
|
||||
<li>A need to use unaligned variables. Endian types can eliminate padding bytes in
|
||||
save I/O time.</li>
|
||||
<li><p>A need to use unaligned variables. Endian types can eliminate padding bytes in
|
||||
structures, reducing internal and external space usage and saving I/O
|
||||
time. They can deals with structures defined like this:</li>
|
||||
</ul>
|
||||
time. They can deals with structures defined like this:
|
||||
<blockquote>
|
||||
<p><code>struct S {<br>
|
||||
uint16_t a;<br>
|
||||
uint32_t b;<br>
|
||||
} __attribute__ ((packed));</code></p>
|
||||
</blockquote>
|
||||
} __attribute__ ((packed));</code>
|
||||
</blockquote></p></li>
|
||||
<li>
|
||||
<p>Programmer preference.</p></li>
|
||||
</ul>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<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
|
||||
functions for years.<br>
|
||||
</li>
|
||||
functions for years.</p></li>
|
||||
<li>A need to save CPU time when a variable is used many times
|
||||
relative to its I/O.<br>
|
||||
</li>
|
||||
<li>A need to pass structures to third-party libraries expecting a
|
||||
specific structure format.<br>
|
||||
</li>
|
||||
relative to its I/O.</li>
|
||||
<li>
|
||||
<p>A need to pass structures to third-party libraries expecting a
|
||||
specific structure format.</li>
|
||||
<li>
|
||||
<p>Programmer preference.</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h2><a name="Intrinsic">Intrinsic</a> built-in support</h2>
|
||||
<p>Recent compilers, including GCC, Clang, and Microsoft, supply intrinsic
|
||||
built-in support for byte swapping. Such support is automatically detected and
|
||||
<h2>Built-in support for <a name="Intrinsic">Intrinsic</a>s</h2>
|
||||
<p>Recent compilers, including GCC, Clang, and Microsoft, supply built-in support for byte swapping
|
||||
intrinsics. Such support is automatically detected and
|
||||
used since it may in smaller and faster generated code, particularly for release
|
||||
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
|
||||
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>"no byte swap intrinsics"</code> or a string describing the
|
||||
particular set of intrinsics being used.</p>
|
||||
|
||||
@ -267,9 +260,10 @@ big_endian(x);
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p><b>There will be no performance difference between the two approaches,
|
||||
regardless of the native endianness of the machine.</b> Optimizing compilers will likely
|
||||
generate exactly the same code for both. That conclusion was confirmed by
|
||||
<p><b>There will be no performance difference between the two approaches in
|
||||
release builds,
|
||||
regardless of the native endianness of the machine.</b> That'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>
|
||||
|
||||
<p>Now consider a slightly different problem: </p>
|
||||
@ -337,84 +331,180 @@ setup.
|
||||
32-bit intrinsics.)</p>
|
||||
|
||||
<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"><b> Iterations: 1000000000, Intrinsics: __builtin_bswap16, etc.</b></td></tr>
|
||||
<tr><td><b>Test Case</b></td>
|
||||
<td align="center"><b>Endian<br>type</b></td>
|
||||
<td align="center"><b>Endian<br>conversion<br>function</b></td>
|
||||
<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" dir="ltr"><b> <font size="2">Iterations: 1000000000, Intrinsics: __builtin_bswap16, etc.</font></b></td></tr>
|
||||
<tr><td dir="ltr"><b><font size="2">Test Case</font></b></td>
|
||||
<td align="center" dir="ltr"><b><font size="2">Endian<br>type</font></b></td>
|
||||
<td align="center" dir="ltr"><b><font size="2">Endian<br>conversion<br>function</font></b></td>
|
||||
</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>16-bit aligned little endian</td><td align="right">0.83 s</td><td align="right">0.81 s</td></tr>
|
||||
<tr><td>16-bit unaligned big endian</td><td align="right">1.09 s</td><td align="right">0.83 s</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>32-bit aligned big endian</td><td align="right">0.98 s</td><td align="right">0.27 s</td></tr>
|
||||
<tr><td>32-bit aligned little endian</td><td align="right">0.28 s</td><td align="right">0.27 s</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>32-bit unaligned little endian</td><td align="right">3.82 s</td><td align="right">0.27 s</td></tr>
|
||||
<tr><td>64-bit aligned big endian</td><td align="right">1.65 s</td><td align="right">0.41 s</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>64-bit unaligned big endian</td><td align="right">17.53 s</td><td align="right">0.41 s</td></tr>
|
||||
<tr><td>64-bit unaligned little endian</td><td align="right">17.52 s</td><td align="right">0.41 s</td></tr>
|
||||
<tr><td dir="ltr"><font size="2">16-bit aligned big endian</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">1.37 s</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">0.81 s</font></td></tr>
|
||||
<tr><td dir="ltr"><font size="2">16-bit aligned little endian</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">0.83 s</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">0.81 s</font></td></tr>
|
||||
<tr><td dir="ltr"><font size="2">16-bit unaligned big endian</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">1.09 s</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">0.83 s</font></td></tr>
|
||||
<tr><td dir="ltr"><font size="2">16-bit unaligned little endian</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">1.09 s</font></td>
|
||||
<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><b>Test Case</b></td>
|
||||
<td align="center"><b>Endian<br>type</b></td>
|
||||
<td align="center"><b>Endian<br>conversion<br>function</b></td>
|
||||
<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 dir="ltr"><b><font size="2">Test Case</font></b></td>
|
||||
<td align="center" dir="ltr"><b><font size="2">Endian<br>type</font></b></td>
|
||||
<td align="center" dir="ltr"><b><font size="2">Endian<br>conversion<br>function</font></b></td>
|
||||
</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>16-bit aligned little endian</td><td align="right">0.83 s</td><td align="right">0.81 s</td></tr>
|
||||
<tr><td>16-bit unaligned big endian</td><td align="right">1.19 s</td><td align="right">0.81 s</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>32-bit aligned big endian</td><td align="right">0.97 s</td><td align="right">0.28 s</td></tr>
|
||||
<tr><td>32-bit aligned little endian</td><td align="right">0.27 s</td><td align="right">0.28 s</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>32-bit unaligned little endian</td><td align="right">4.10 s</td><td align="right">0.27 s</td></tr>
|
||||
<tr><td>64-bit aligned big endian</td><td align="right">1.64 s</td><td align="right">0.42 s</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>64-bit unaligned big endian</td><td align="right">17.52 s</td><td align="right">0.42 s</td></tr>
|
||||
<tr><td>64-bit unaligned little endian</td><td align="right">17.52 s</td><td align="right">0.41 s</td></tr>
|
||||
<tr><td dir="ltr"><font size="2">16-bit aligned big endian</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">1.95 s</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">0.81 s</font></td></tr>
|
||||
<tr><td dir="ltr"><font size="2">16-bit aligned little endian</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">0.83 s</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">0.81 s</font></td></tr>
|
||||
<tr><td dir="ltr"><font size="2">16-bit unaligned big endian</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">1.19 s</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">0.81 s</font></td></tr>
|
||||
<tr><td dir="ltr"><font size="2">16-bit unaligned little endian</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">1.20 s</font></td>
|
||||
<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>
|
||||
|
||||
<p></p>
|
||||
|
||||
<table border="1" cellpadding="5" cellspacing="0"style="border-collapse: collapse" bordercolor="#111111">
|
||||
<tr><td colspan="6" align="center"><b>Microsoft Visual C++ version 11.0</b></td></tr>
|
||||
<tr><td colspan="6" align="center"><b> Iterations: 1000000000, Intrinsics: cstdlib _byteswap_ushort, etc.</b></td></tr>
|
||||
<tr><td><b>Test Case</b></td>
|
||||
<td align="center"><b>Endian<br>type</b></td>
|
||||
<td align="center"><b>Endian<br>conversion<br>function</b></td>
|
||||
<table border="1" cellpadding="5" cellspacing="0"style="border-collapse: collapse" bordercolor="#111111" dir="ltr">
|
||||
<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" dir="ltr"><b> <font size="2">Iterations: 1000000000, Intrinsics: cstdlib _byteswap_ushort, etc.</font></b></td></tr>
|
||||
<tr><td dir="ltr"><b><font size="2">Test Case</font></b></td>
|
||||
<td align="center" dir="ltr"><b><font size="2">Endian<br>type</font></b></td>
|
||||
<td align="center" dir="ltr"><b><font size="2">Endian<br>conversion<br>function</font></b></td>
|
||||
</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>16-bit aligned little endian</td><td align="right">0.51 s</td><td align="right">0.50 s</td></tr>
|
||||
<tr><td>16-bit unaligned big endian</td><td align="right">1.37 s</td><td align="right">0.51 s</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>32-bit aligned big endian</td><td align="right" bgcolor="#CCFFCC">0.81 s</td><td align="right">0.50 s</td></tr>
|
||||
<tr><td>32-bit aligned little endian</td><td align="right">0.51 s</td><td align="right">0.51 s</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>32-bit unaligned little endian</td><td align="right">3.00 s</td><td align="right">0.51 s</td></tr>
|
||||
<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>
|
||||
<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>64-bit unaligned big endian</td><td align="right">7.05 s</td><td align="right">0.33 s</td></tr>
|
||||
<tr><td>64-bit unaligned little endian</td><td align="right">7.11 s</td><td align="right">0.31 s</td></tr>
|
||||
<tr><td dir="ltr"><font size="2">16-bit aligned big endian</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">0.83 s</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">0.51 s</font></td></tr>
|
||||
<tr><td dir="ltr"><font size="2">16-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.50 s</font></td></tr>
|
||||
<tr><td dir="ltr"><font size="2">16-bit unaligned big endian</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">1.37 s</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">0.51 s</font></td></tr>
|
||||
<tr><td dir="ltr"><font size="2">16-bit unaligned little endian</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">1.37 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 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><b>Test Case</b></td>
|
||||
<td align="center"><b>Endian<br>type</b></td>
|
||||
<td align="center"><b>Endian<br>conversion<br>function</b></td>
|
||||
<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 dir="ltr"><b><font size="2">Test Case</font></b></td>
|
||||
<td align="center" dir="ltr"><b><font size="2">Endian<br>type</font></b></td>
|
||||
<td align="center" dir="ltr"><b><font size="2">Endian<br>conversion<br>function</font></b></td>
|
||||
</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>16-bit aligned little endian</td><td align="right">0.51 s</td><td align="right">0.51 s</td></tr>
|
||||
<tr><td>16-bit unaligned big endian</td><td align="right">1.36 s</td><td align="right">0.51 s</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>32-bit aligned big endian</td><td align="right" bgcolor="#FFCACA">3.42 s</td><td align="right">0.50 s</td></tr>
|
||||
<tr><td>32-bit aligned little endian</td><td align="right">0.51 s</td><td align="right">0.51 s</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>32-bit unaligned little endian</td><td align="right">2.95 s</td><td align="right">0.50 s</td></tr>
|
||||
<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>
|
||||
<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>64-bit unaligned big endian</td><td align="right">7.02 s</td><td align="right">0.27 s</td></tr>
|
||||
<tr><td>64-bit unaligned little endian</td><td align="right">7.02 s</td><td align="right">0.27 s</td></tr>
|
||||
<tr><td dir="ltr"><font size="2">16-bit aligned big endian</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">0.83 s</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">0.51 s</font></td></tr>
|
||||
<tr><td dir="ltr"><font size="2">16-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">16-bit unaligned big endian</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">1.36 s</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">0.51 s</font></td></tr>
|
||||
<tr><td dir="ltr"><font size="2">16-bit unaligned little endian</font></td>
|
||||
<td align="right" dir="ltr"><font size="2">1.37 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 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>
|
||||
|
||||
@ -487,9 +577,9 @@ paramount.</p>
|
||||
|
||||
<p><b>Which is better, big-endian or little-endian?</b></p>
|
||||
<blockquote>
|
||||
<p>Big-endian tends to be a
|
||||
bit 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
|
||||
<p>Big-endian tends to be preferred in a networking environment and is a bit
|
||||
more of an industry standard, but little-endian may be preferred for
|
||||
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
|
||||
gives more pros and cons.</p>
|
||||
</blockquote>
|
||||
@ -498,7 +588,7 @@ gives more pros and cons.</p>
|
||||
<blockquote>
|
||||
<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
|
||||
but have no relevance to C++ developers.</p>
|
||||
but have no relevance to today's C++ developers.</p>
|
||||
</blockquote>
|
||||
|
||||
<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>
|
||||
<li>Both the endian types and endian conversion functions now support UDTs, as requested.</li>
|
||||
<li>The endian type aliases have been renamed,
|
||||
using a naming pattern that is consistent for both integer and floating point,
|
||||
and that emphasizes that aligned types are usually preferred compared to
|
||||
unaligned types. Unaligned types are deliberately given slightly uglier names.</li>
|
||||
using a naming pattern that is consistent for both integer and floating point.</li>
|
||||
<li>The conversion functions have been much revised,
|
||||
refactored, and otherwise improved based on review comments.<ul>
|
||||
<li>Functions have been renamed to clarify their functionality.</li>
|
||||
<li>Both return-by-value and modify-in-place interfaces are provided, as
|
||||
requested.</li>
|
||||
<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>
|
||||
<li>In addition to the named-endianness functions, functions that perform
|
||||
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,
|
||||
and thus the intrinsics,
|
||||
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
|
||||
supporting C++03 compilers.</li>
|
||||
<li>Acknowledgements have been updated.</li>
|
||||
<li>Headers have been reorganized to make them easier to read,
|
||||
with a synopsis at the front and implementation following, as requested.</li>
|
||||
<li>Documentation has been revised to address most, but not all, concerns
|
||||
raised during formal review.</li>
|
||||
<li>Acknowledgements have been updated.</li>
|
||||
</ul>
|
||||
|
||||
<h2><a name="Acknowledgements">Acknowledgements</a></h2>
|
||||
<p>Comments and suggestions were
|
||||
received from
|
||||
Adder, Benaka Moorthi,
|
||||
Christopher Kohlhoff,
|
||||
Cliff Green, Daniel James, Gennaro Proto,
|
||||
Giovanni Piero Deretta, Gordon Woodhull, dizzy, Hartmut Kaiser, Jeff Flinn,
|
||||
John Filo, John Maddock,
|
||||
Kim Barrett,
|
||||
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>
|
||||
<p>Comments and suggestions were received from Adder, Benaka Moorthi,
|
||||
Christopher Kohlhoff, Cliff Green, Daniel James, Gennaro Proto, Giovanni Piero
|
||||
Deretta, Gordon Woodhull, dizzy, Hartmut Kaiser, Jeff Flinn, John Filo, John
|
||||
Maddock, Kim Barrett, Marsh Ray, Martin Bonner, Mathias Gaunard, Matias
|
||||
Capeletto, Neil Mayhew, Paul Bristow, Pierre Talbot, 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>
|
||||
<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>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>
|
||||
|
133
types.html
133
types.html
@ -76,7 +76,7 @@
|
||||
</table>
|
||||
<h2><a name="Introduction">Introduction</a></h2>
|
||||
<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
|
||||
for common configurations.</p>
|
||||
<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>>>=</code>. Binary relational operators are <code>==</code>, <code>!=</code>,
|
||||
<code><</code>, <code><=</code>, <code>></code>, <code>>=</code>.</p>
|
||||
<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>
|
||||
<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>
|
||||
@ -207,6 +207,7 @@ will no longer be relying on unspecified behavior.</p>
|
||||
<p>Two scoped enums are provided:</p>
|
||||
<blockquote>
|
||||
<pre>enum class order {big, little, native};
|
||||
|
||||
enum class align {no, yes}; </pre>
|
||||
</blockquote>
|
||||
<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
|
||||
|
||||
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};
|
||||
|
||||
template <order Order, typename T, std::size_t n_bits, align A = align::no>
|
||||
@ -361,13 +368,14 @@ usual operations on integers are supplied.</p>
|
||||
// if BOOST_ENDIAN_FORCE_PODNESS is defined && C++11 POD's are not
|
||||
// available then these two constructors will not be present
|
||||
<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& <a href="#operator-eq">operator=</a>(T v) noexcept;
|
||||
<a href="#operator-T">operator T</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& x) noexcept;
|
||||
endian& operator+=(endian& x, value_type y) noexcept;
|
||||
endian& operator-=(endian& x, value_type y) noexcept;
|
||||
@ -387,43 +395,44 @@ usual operations on integers are supplied.</p>
|
||||
endian operator--(endian& x, int) noexcept;
|
||||
};
|
||||
|
||||
typedef endian<order::big, float, 32, align::yes> big_align_float32_t;
|
||||
typedef endian<order::big, double, 64, align::yes> big_align_float64_t;
|
||||
// aligned big endian floating point types
|
||||
typedef endian<order::big, float, 32, align::yes> big_align_float32_t;
|
||||
typedef endian<order::big, double, 64, align::yes> big_align_float64_t;
|
||||
|
||||
// aligned little endian floating point types
|
||||
typedef endian<order::little, float, 32, align::yes> little_align_float32_t;
|
||||
typedef endian<order::little, double, 64, align::yes> little_align_float64_t;
|
||||
// aligned little endian floating point types
|
||||
typedef endian<order::little, float, 32, align::yes> little_align_float32_t;
|
||||
typedef endian<order::little, double, 64, align::yes> little_align_float64_t;
|
||||
|
||||
// unaligned big endian floating point types
|
||||
typedef endian<order::big, float, 32, align::no> big_float32un_t;
|
||||
typedef endian<order::big, double, 64, align::no> big_float64un_t;
|
||||
// unaligned big endian floating point types
|
||||
typedef endian<order::big, float, 32, align::no> big_float32un_t;
|
||||
typedef endian<order::big, double, 64, align::no> big_float64un_t;
|
||||
|
||||
// unaligned little endian floating point types
|
||||
typedef endian<order::little, float, 32, align::no> little_float32un_t;
|
||||
typedef endian<order::little, double, 64, align::no> little_float64un_t;
|
||||
typedef endian<order::little, float, 32, align::no> little_float32un_t;
|
||||
typedef endian<order::little, double, 64, align::no> little_float64un_t;
|
||||
|
||||
// aligned big endian signed integer types
|
||||
typedef endian<order::big, int16_t, 16, align::yes> big_align_int16_t;
|
||||
typedef endian<order::big, int32_t, 32, align::yes> big_align_int32_t;
|
||||
typedef endian<order::big, int64_t, 64, align::yes> big_align_int64_t;
|
||||
typedef endian<order::big, int16_t, 16, align::yes> big_align_int16_t;
|
||||
typedef endian<order::big, int32_t, 32, align::yes> big_align_int32_t;
|
||||
typedef endian<order::big, int64_t, 64, align::yes> big_align_int64_t;
|
||||
|
||||
// aligned big endian unsigned integer types
|
||||
typedef endian<order::big, uint16_t, 16, align::yes> big_align_uint16_t;
|
||||
typedef endian<order::big, uint32_t, 32, align::yes> big_align_uint32_t;
|
||||
typedef endian<order::big, uint64_t, 64, align::yes> big_align_uint64_t;
|
||||
// aligned big endian unsigned integer types
|
||||
typedef endian<order::big, uint16_t, 16, align::yes> big_align_uint16_t;
|
||||
typedef endian<order::big, uint32_t, 32, align::yes> big_align_uint32_t;
|
||||
typedef endian<order::big, uint64_t, 64, align::yes> big_align_uint64_t;
|
||||
|
||||
// aligned little endian signed integer types
|
||||
typedef endian<order::little, int16_t, 16, align::yes> little_align_int16_t;
|
||||
typedef endian<order::little, int32_t, 32, align::yes> little_align_int32_t;
|
||||
typedef endian<order::little, int64_t, 64, align::yes> little_align_int64_t;
|
||||
// aligned little endian signed integer types
|
||||
typedef endian<order::little, int16_t, 16, align::yes> little_align_int16_t;
|
||||
typedef endian<order::little, int32_t, 32, align::yes> little_align_int32_t;
|
||||
typedef endian<order::little, int64_t, 64, align::yes> little_align_int64_t;
|
||||
|
||||
// aligned little endian unsigned integer types
|
||||
typedef endian<order::little, uint16_t, 16, align::yes> little_align_uint16_t;
|
||||
typedef endian<order::little, uint32_t, 32, align::yes> little_align_uint32_t;
|
||||
typedef endian<order::little, uint64_t, 64, align::yes> little_align_uint64_t;
|
||||
// aligned little endian unsigned integer types
|
||||
typedef endian<order::little, uint16_t, 16, align::yes> little_align_uint16_t;
|
||||
typedef endian<order::little, uint32_t, 32, align::yes> little_align_uint32_t;
|
||||
typedef endian<order::little, uint64_t, 64, align::yes> little_align_uint64_t;
|
||||
|
||||
// aligned native endian typedefs are not provided because
|
||||
// <cstdint> types are superior for this use case
|
||||
// aligned native endian typedefs are not provided because
|
||||
// <cstdint> types are superior for that use case
|
||||
|
||||
// unaligned big endian signed integer types
|
||||
typedef endian<order::big, int_least8_t, 8> big_int8_t;
|
||||
@ -465,51 +474,56 @@ usual operations on integers are supplied.</p>
|
||||
typedef endian<order::little, uint_least64_t, 56> little_uint56_t;
|
||||
typedef endian<order::little, uint_least64_t, 64> little_uint64_t;
|
||||
|
||||
// unaligned native endian signed integer types
|
||||
typedef endian<order::native, int_least8_t, 8> native_int8_t;
|
||||
typedef endian<order::native, int_least16_t, 16> native_int16_t;
|
||||
typedef endian<order::native, int_least32_t, 24> native_int24_t;
|
||||
typedef endian<order::native, int_least32_t, 32> native_int32_t;
|
||||
typedef endian<order::native, int_least64_t, 40> native_int40_t;
|
||||
typedef endian<order::native, int_least64_t, 48> native_int48_t;
|
||||
typedef endian<order::native, int_least64_t, 56> native_int56_t;
|
||||
typedef endian<order::native, int_least64_t, 64> native_int64_t;
|
||||
|
||||
// unaligned native endian unsigned integer types
|
||||
typedef endian<order::native, uint_least8_t, 8> native_uint8_t;
|
||||
typedef endian<order::native, uint_least16_t, 16> native_uint16_t;
|
||||
typedef endian<order::native, uint_least32_t, 24> native_uint24_t;
|
||||
typedef endian<order::native, uint_least32_t, 32> native_uint32_t;
|
||||
typedef endian<order::native, uint_least64_t, 40> native_uint40_t;
|
||||
typedef endian<order::native, uint_least64_t, 48> native_uint48_t;
|
||||
typedef endian<order::native, uint_least64_t, 56> native_uint56_t;
|
||||
typedef endian<order::native, uint_least64_t, 64> native_uint64_t;
|
||||
// unaligned native endian signed integer types
|
||||
typedef <b><i>implementation-defined</i></b>_int8_t native_int8_t;
|
||||
typedef <b><i>implementation-defined</i></b>_int16_t native_int16_t;
|
||||
typedef <b><i>implementation-defined</i></b>_int24_t native_int24_t;
|
||||
typedef <b><i>implementation-defined</i></b>_int32_t native_int32_t;
|
||||
typedef <b><i>implementation-defined</i></b>_int40_t native_int40_t;
|
||||
typedef <b><i>implementation-defined</i></b>_int48_t native_int48_t;
|
||||
typedef <b><i>implementation-defined</i></b>_int56_t native_int56_t;
|
||||
typedef <b><i>implementation-defined</i></b>_int64_t native_int64_t;
|
||||
|
||||
// unaligned native endian unsigned integer types
|
||||
typedef <b><i>implementation-defined</i></b>_uint8_t native_uint8_t;
|
||||
typedef <b><i>implementation-defined</i></b>_uint16_t native_uint16_t;
|
||||
typedef <b><i>implementation-defined</i></b>_uint24_t native_uint24_t;
|
||||
typedef <b><i>implementation-defined</i></b>_uint32_t native_uint32_t;
|
||||
typedef <b><i>implementation-defined</i></b>_uint40_t native_uint40_t;
|
||||
typedef <b><i>implementation-defined</i></b>_uint48_t native_uint48_t;
|
||||
typedef <b><i>implementation-defined</i></b>_uint56_t native_uint56_t;
|
||||
typedef <b><i>implementation-defined</i></b>_uint64_t native_uint64_t;
|
||||
|
||||
} // namespace endian
|
||||
} // 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>
|
||||
<p><code><a name="endian">endian</a>() = default; // C++03: endian(){}</code></p>
|
||||
<div dir="ltr">
|
||||
<pre><code><a name="endian">endian</a>() = default; // C++03: endian(){}</code></pre>
|
||||
</div>
|
||||
<blockquote>
|
||||
<p><i>Effects:</i> Constructs an object of type <code>endian<E, T, n_bits, A></code>.</p>
|
||||
</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>
|
||||
<p><i>Effects:</i> Constructs an object of type <code>endian<E, T, n_bits, A></code>.</p>
|
||||
<p><i>Postcondition:</i> <code>x == v,</code> where <code>x</code> is the
|
||||
constructed object.</p>
|
||||
</blockquote>
|
||||
<p><code>endian& <a name="operator-eq">operator=</a>(T v);</code></p>
|
||||
<pre><code>endian& <a name="operator-eq">operator=</a>(T v);</code></pre>
|
||||
<blockquote>
|
||||
<p><i>Postcondition:</i> <code>x == v,</code> where <code>x</code> is the
|
||||
constructed object.</p>
|
||||
<p><i>Returns:</i> <code>*this</code>.</p>
|
||||
</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>
|
||||
<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>
|
||||
<pre><code>const char* <a name="data">data</a>() const;</code></pre>
|
||||
<blockquote>
|
||||
<p><i>Returns:</i> A pointer to the first byte of the endian binary value stored
|
||||
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
|
||||
unsigned.</li>
|
||||
<li>Unaligned types must not cause compilers to insert padding bytes.</li>
|
||||
<li>The implementation should supply optimizations only in very limited
|
||||
circumstances. Experience has shown that optimizations of endian
|
||||
<li>The implementation should supply optimizations with great care. Experience has shown that optimizations of endian
|
||||
integers often become pessimizations when changing
|
||||
machines or compilers. Pessimizations can also happen when changing compiler switches,
|
||||
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>
|
||||
<h2><a name="Experience">Experience</a></h2>
|
||||
<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>
|
||||
<hr>
|
||||
<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>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>
|
||||
|
Reference in New Issue
Block a user