~ubuntu-branches/debian/sid/pion/sid

« back to all changes in this revision

Viewing changes to doc/html/algorithm_8cpp_source.html

  • Committer: Package Import Robot
  • Author(s): Roberto C. Sanchez
  • Date: 2013-08-03 11:53:18 UTC
  • mfrom: (1.1.1)
  • Revision ID: package-import@ubuntu.com-20130803115318-3cees1yi7csq8j3m
Tags: 5.0.3+dfsg-1
New upstream release

Show diffs side-by-side

added added

removed removed

Lines of Context:
239
239
<a name="l00216"></a>00216     
240
240
<a name="l00217"></a>00217     <span class="keywordflow">return</span> result;
241
241
<a name="l00218"></a>00218 }
242
 
<a name="l00219"></a>00219     
243
 
<a name="l00220"></a><a class="code" href="structpion_1_1algorithm.html#ab3cce74846661c3585ec5f540a99ff07">00220</a> <span class="keywordtype">void</span> <a class="code" href="structpion_1_1algorithm.html#ab3cce74846661c3585ec5f540a99ff07">algorithm::float_from_bytes</a>(<span class="keywordtype">long</span> <span class="keywordtype">double</span>&amp; value, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *ptr, <span class="keywordtype">size_t</span> num_exp_bits, <span class="keywordtype">size_t</span> num_fraction_bits)
244
 
<a name="l00221"></a>00221 {
245
 
<a name="l00222"></a>00222     <span class="comment">// get sign of the number from the first bit</span>
246
 
<a name="l00223"></a>00223     <span class="keyword">const</span> <span class="keywordtype">int</span> value_sign = (*ptr &amp; 0x80) ? -1 : 1;
247
 
<a name="l00224"></a>00224     
248
 
<a name="l00225"></a>00225     <span class="comment">// build exponent value from bitstream</span>
249
 
<a name="l00226"></a>00226     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> mask = 0x80;
250
 
<a name="l00227"></a>00227     boost::int16_t exponent = 0;
251
 
<a name="l00228"></a>00228     <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> n = 0; n &lt; num_exp_bits; ++n) {
252
 
<a name="l00229"></a>00229         SHIFT_BITMASK(ptr, mask);
253
 
<a name="l00230"></a>00230         exponent *= 2;
254
 
<a name="l00231"></a>00231         <span class="keywordflow">if</span> (*ptr &amp; mask)
255
 
<a name="l00232"></a>00232             exponent += 1;
256
 
<a name="l00233"></a>00233     }
257
 
<a name="l00234"></a>00234     
258
 
<a name="l00235"></a>00235     <span class="comment">// build significand from bitstream</span>
259
 
<a name="l00236"></a>00236     <span class="keywordtype">long</span> <span class="keywordtype">double</span> significand = exponent ? 1.0 : 0.0;
260
 
<a name="l00237"></a>00237     <span class="keywordtype">long</span> <span class="keywordtype">double</span> significand_value = 1.0;
261
 
<a name="l00238"></a>00238     <span class="keywordflow">while</span> (num_fraction_bits) {
262
 
<a name="l00239"></a>00239         SHIFT_BITMASK(ptr, mask);
263
 
<a name="l00240"></a>00240         significand_value /= 2;
264
 
<a name="l00241"></a>00241         <span class="keywordflow">if</span> (*ptr &amp; mask)
265
 
<a name="l00242"></a>00242             significand += significand_value;
266
 
<a name="l00243"></a>00243         --num_fraction_bits;
267
 
<a name="l00244"></a>00244     }
268
 
<a name="l00245"></a>00245     
269
 
<a name="l00246"></a>00246     <span class="comment">// calculate final value</span>
270
 
<a name="l00247"></a>00247     exponent -= (::pow((<span class="keywordtype">long</span> double)2, (<span class="keywordtype">int</span>)(num_exp_bits - 1)) - 1);
271
 
<a name="l00248"></a>00248     value = value_sign * significand * ::pow((<span class="keywordtype">long</span> double)2, exponent);
272
 
<a name="l00249"></a>00249 }
273
 
<a name="l00250"></a>00250 
274
 
<a name="l00251"></a><a class="code" href="structpion_1_1algorithm.html#a61872c7ccf75793a16d8ce7961f28842">00251</a> <span class="keywordtype">void</span> <a class="code" href="structpion_1_1algorithm.html#a61872c7ccf75793a16d8ce7961f28842">algorithm::float_to_bytes</a>(<span class="keywordtype">long</span> <span class="keywordtype">double</span> value, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> num_exp_bits, <span class="keywordtype">size_t</span> num_fraction_bits)
275
 
<a name="l00252"></a>00252 {
276
 
<a name="l00253"></a>00253     <span class="comment">// first initialize output buffer to zeros</span>
277
 
<a name="l00254"></a>00254     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *ptr = buf;
278
 
<a name="l00255"></a>00255     memset(ptr, 0x00, ::ceil(static_cast&lt;float&gt;(num_exp_bits + num_fraction_bits + 1) / 8));
279
 
<a name="l00256"></a>00256     
280
 
<a name="l00257"></a>00257     <span class="comment">// initialize first byte starting with sign of number</span>
281
 
<a name="l00258"></a>00258     <span class="keywordflow">if</span> (value &lt; 0) {
282
 
<a name="l00259"></a>00259         *ptr = 0x80;
283
 
<a name="l00260"></a>00260         value *= -1;
284
 
<a name="l00261"></a>00261     }
285
 
<a name="l00262"></a>00262     
286
 
<a name="l00263"></a>00263     <span class="comment">// break down numbers &gt;= 1.0 by incrementing the exponent &amp; dividing by 2</span>
287
 
<a name="l00264"></a>00264     boost::int16_t exponent = 0;
288
 
<a name="l00265"></a>00265     <span class="keywordflow">while</span> (value &gt;= 1) {
289
 
<a name="l00266"></a>00266         value /= 2;
290
 
<a name="l00267"></a>00267         ++exponent;
291
 
<a name="l00268"></a>00268     }
292
 
<a name="l00269"></a>00269 
293
 
<a name="l00270"></a>00270     <span class="comment">// skip past exponent bits because we don&apos;t know the value yet</span>
294
 
<a name="l00271"></a>00271     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> mask = 0x40;
295
 
<a name="l00272"></a>00272     <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> n = num_exp_bits; n &gt; 0; --n) {
296
 
<a name="l00273"></a>00273         <span class="keywordflow">if</span> (n &gt;= 8) {
297
 
<a name="l00274"></a>00274             ++ptr;
298
 
<a name="l00275"></a>00275             n -= 7;
299
 
<a name="l00276"></a>00276         } <span class="keywordflow">else</span> {
300
 
<a name="l00277"></a>00277             SHIFT_BITMASK(ptr, mask);
301
 
<a name="l00278"></a>00278         }
302
 
<a name="l00279"></a>00279     }
303
 
<a name="l00280"></a>00280     
304
 
<a name="l00281"></a>00281     <span class="comment">// serialize fractional value &lt; 1.0</span>
305
 
<a name="l00282"></a>00282     <span class="keywordtype">bool</span> got_exponent = <span class="keyword">false</span>;
306
 
<a name="l00283"></a>00283     boost::uint16_t num_bits = 0;
307
 
<a name="l00284"></a>00284     <span class="keywordflow">while</span> (value &amp;&amp; num_bits &lt; num_fraction_bits) {
308
 
<a name="l00285"></a>00285         value *= 2;
309
 
<a name="l00286"></a>00286         <span class="keywordflow">if</span> (got_exponent) {
310
 
<a name="l00287"></a>00287             <span class="keywordflow">if</span> (value &gt;= 1.0) {
311
 
<a name="l00288"></a>00288                 *ptr |= mask;
312
 
<a name="l00289"></a>00289                 value -= 1.0;
313
 
<a name="l00290"></a>00290             }
314
 
<a name="l00291"></a>00291             SHIFT_BITMASK(ptr, mask);
315
 
<a name="l00292"></a>00292             ++num_bits;
316
 
<a name="l00293"></a>00293         } <span class="keywordflow">else</span> {
317
 
<a name="l00294"></a>00294             --exponent;
318
 
<a name="l00295"></a>00295             <span class="keywordflow">if</span> (value &gt;= 1.0) {
319
 
<a name="l00296"></a>00296                 value -= 1.0;
320
 
<a name="l00297"></a>00297                 got_exponent = <span class="keyword">true</span>;
321
 
<a name="l00298"></a>00298             }
322
 
<a name="l00299"></a>00299         }
323
 
<a name="l00300"></a>00300     }
324
 
<a name="l00301"></a>00301     
325
 
<a name="l00302"></a>00302     <span class="comment">// normalize exponent.</span>
326
 
<a name="l00303"></a>00303     <span class="comment">// note: we should have a zero exponent if value == 0</span>
327
 
<a name="l00304"></a>00304     boost::int32_t high_bit = ::pow((<span class="keywordtype">long</span> double)2, (<span class="keywordtype">int</span>)(num_exp_bits - 1));
328
 
<a name="l00305"></a>00305     <span class="keywordflow">if</span> (got_exponent)
329
 
<a name="l00306"></a>00306         exponent += (high_bit - 1);
330
 
<a name="l00307"></a>00307     <span class="keywordflow">else</span>
331
 
<a name="l00308"></a>00308         exponent = 0;
332
 
<a name="l00309"></a>00309     
333
 
<a name="l00310"></a>00310     <span class="comment">// serialize exponent bits</span>
334
 
<a name="l00311"></a>00311     ptr = buf;
335
 
<a name="l00312"></a>00312     mask = 0x80;
336
 
<a name="l00313"></a>00313     <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> n = 0; n &lt; num_exp_bits; ++n) {
337
 
<a name="l00314"></a>00314         SHIFT_BITMASK(ptr, mask);
338
 
<a name="l00315"></a>00315         <span class="keywordflow">if</span> (exponent &gt;= high_bit) {
339
 
<a name="l00316"></a>00316             *ptr |= mask;
340
 
<a name="l00317"></a>00317             exponent -= high_bit;
341
 
<a name="l00318"></a>00318         }
342
 
<a name="l00319"></a>00319         high_bit /= 2;
343
 
<a name="l00320"></a>00320     }
344
 
<a name="l00321"></a>00321 }
345
 
<a name="l00322"></a>00322     
346
 
<a name="l00323"></a>00323 }   <span class="comment">// end namespace pion</span>
 
242
<a name="l00219"></a>00219 
 
243
<a name="l00220"></a>00220 <span class="comment">// TODO</span>
 
244
<a name="l00221"></a>00221 <span class="comment">//std::string algorithm::xml_decode(const std::string&amp; str)</span>
 
245
<a name="l00222"></a>00222 <span class="comment">//{</span>
 
246
<a name="l00223"></a>00223 <span class="comment">//}</span>
 
247
<a name="l00224"></a>00224 
 
248
<a name="l00225"></a><a class="code" href="structpion_1_1algorithm.html#a2177ca0d0f01e6ef6d4d3bceb73d82bb">00225</a> std::string <a class="code" href="structpion_1_1algorithm.html#a2177ca0d0f01e6ef6d4d3bceb73d82bb" title="TODO: escapes XML/HTML-encoded strings (1 &amp;lt; 2).">algorithm::xml_encode</a>(<span class="keyword">const</span> std::string&amp; str)
 
249
<a name="l00226"></a>00226 {
 
250
<a name="l00227"></a>00227     std::string result;
 
251
<a name="l00228"></a>00228     result.reserve(str.size() + 20);    <span class="comment">// Assume ~5 characters converted (length increases)</span>
 
252
<a name="l00229"></a>00229     <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *ptr = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*<span class="keyword">&gt;</span>(str.c_str());
 
253
<a name="l00230"></a>00230     <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *end_ptr = ptr + str.size();
 
254
<a name="l00231"></a>00231     <span class="keywordflow">while</span> (ptr &lt; end_ptr) {
 
255
<a name="l00232"></a>00232         <span class="comment">// check byte ranges for valid UTF-8</span>
 
256
<a name="l00233"></a>00233         <span class="comment">// see http://en.wikipedia.org/wiki/UTF-8</span>
 
257
<a name="l00234"></a>00234         <span class="comment">// also, see http://www.w3.org/TR/REC-xml/#charsets</span>
 
258
<a name="l00235"></a>00235         <span class="comment">// this implementation is the strictest subset of both</span>
 
259
<a name="l00236"></a>00236         <span class="keywordflow">if</span> ((*ptr &gt;= 0x20 &amp;&amp; *ptr &lt;= 0x7F) || *ptr == 0x9 || *ptr == 0xa || *ptr == 0xd) {
 
260
<a name="l00237"></a>00237             <span class="comment">// regular ASCII character</span>
 
261
<a name="l00238"></a>00238             <span class="keywordflow">switch</span>(*ptr) {
 
262
<a name="l00239"></a>00239                     <span class="comment">// Escape special XML characters.</span>
 
263
<a name="l00240"></a>00240                 <span class="keywordflow">case</span> <span class="charliteral">&apos;&amp;&apos;</span>:
 
264
<a name="l00241"></a>00241                     result += <span class="stringliteral">&quot;&amp;amp;&quot;</span>;
 
265
<a name="l00242"></a>00242                     <span class="keywordflow">break</span>;
 
266
<a name="l00243"></a>00243                 <span class="keywordflow">case</span> <span class="charliteral">&apos;&lt;&apos;</span>:
 
267
<a name="l00244"></a>00244                     result += <span class="stringliteral">&quot;&amp;lt;&quot;</span>;
 
268
<a name="l00245"></a>00245                     <span class="keywordflow">break</span>;
 
269
<a name="l00246"></a>00246                 <span class="keywordflow">case</span> <span class="charliteral">&apos;&gt;&apos;</span>:
 
270
<a name="l00247"></a>00247                     result += <span class="stringliteral">&quot;&amp;gt;&quot;</span>;
 
271
<a name="l00248"></a>00248                     <span class="keywordflow">break</span>;
 
272
<a name="l00249"></a>00249                 <span class="keywordflow">case</span> <span class="charliteral">&apos;\&quot;&apos;</span>:
 
273
<a name="l00250"></a>00250                     result += <span class="stringliteral">&quot;&amp;quot;&quot;</span>;
 
274
<a name="l00251"></a>00251                     <span class="keywordflow">break</span>;
 
275
<a name="l00252"></a>00252                 <span class="keywordflow">case</span> <span class="charliteral">&apos;\&apos;&apos;</span>:
 
276
<a name="l00253"></a>00253                     result += <span class="stringliteral">&quot;&amp;apos;&quot;</span>;
 
277
<a name="l00254"></a>00254                     <span class="keywordflow">break</span>;
 
278
<a name="l00255"></a>00255                 <span class="keywordflow">default</span>:
 
279
<a name="l00256"></a>00256                     result += *ptr;
 
280
<a name="l00257"></a>00257             }
 
281
<a name="l00258"></a>00258         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr &gt;= 0xC2 &amp;&amp; *ptr &lt;= 0xDF) {
 
282
<a name="l00259"></a>00259             <span class="comment">// two-byte sequence</span>
 
283
<a name="l00260"></a>00260             <span class="keywordflow">if</span> (*(ptr+1) &gt;= 0x80 &amp;&amp; *(ptr+1) &lt;= 0xBF) {
 
284
<a name="l00261"></a>00261                 result += *ptr;
 
285
<a name="l00262"></a>00262                 result += *(++ptr);
 
286
<a name="l00263"></a>00263             } <span class="keywordflow">else</span> {
 
287
<a name="l00264"></a>00264                 <span class="comment">// insert replacement char</span>
 
288
<a name="l00265"></a>00265                 result += 0xef;
 
289
<a name="l00266"></a>00266                 result += 0xbf;
 
290
<a name="l00267"></a>00267                 result += 0xbd;
 
291
<a name="l00268"></a>00268             }
 
292
<a name="l00269"></a>00269         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr &gt;= 0xE0 &amp;&amp; *ptr &lt;= 0xEF) {
 
293
<a name="l00270"></a>00270             <span class="comment">// three-byte sequence</span>
 
294
<a name="l00271"></a>00271             <span class="keywordflow">if</span> (*(ptr+1) &gt;= 0x80 &amp;&amp; *(ptr+1) &lt;= 0xBF
 
295
<a name="l00272"></a>00272                 &amp;&amp; *(ptr+2) &gt;= 0x80 &amp;&amp; *(ptr+2) &lt;= 0xBF) {
 
296
<a name="l00273"></a>00273                 result += *ptr;
 
297
<a name="l00274"></a>00274                 result += *(++ptr);
 
298
<a name="l00275"></a>00275                 result += *(++ptr);
 
299
<a name="l00276"></a>00276             } <span class="keywordflow">else</span> {
 
300
<a name="l00277"></a>00277                 <span class="comment">// insert replacement char</span>
 
301
<a name="l00278"></a>00278                 result += 0xef;
 
302
<a name="l00279"></a>00279                 result += 0xbf;
 
303
<a name="l00280"></a>00280                 result += 0xbd;
 
304
<a name="l00281"></a>00281             }
 
305
<a name="l00282"></a>00282         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*ptr &gt;= 0xF0 &amp;&amp; *ptr &lt;= 0xF4) {
 
306
<a name="l00283"></a>00283             <span class="comment">// four-byte sequence</span>
 
307
<a name="l00284"></a>00284             <span class="keywordflow">if</span> (*(ptr+1) &gt;= 0x80 &amp;&amp; *(ptr+1) &lt;= 0xBF
 
308
<a name="l00285"></a>00285                 &amp;&amp; *(ptr+2) &gt;= 0x80 &amp;&amp; *(ptr+2) &lt;= 0xBF
 
309
<a name="l00286"></a>00286                 &amp;&amp; *(ptr+3) &gt;= 0x80 &amp;&amp; *(ptr+3) &lt;= 0xBF) {
 
310
<a name="l00287"></a>00287                 result += *ptr;
 
311
<a name="l00288"></a>00288                 result += *(++ptr);
 
312
<a name="l00289"></a>00289                 result += *(++ptr);
 
313
<a name="l00290"></a>00290                 result += *(++ptr);
 
314
<a name="l00291"></a>00291             } <span class="keywordflow">else</span> {
 
315
<a name="l00292"></a>00292                 <span class="comment">// insert replacement char</span>
 
316
<a name="l00293"></a>00293                 result += 0xef;
 
317
<a name="l00294"></a>00294                 result += 0xbf;
 
318
<a name="l00295"></a>00295                 result += 0xbd;
 
319
<a name="l00296"></a>00296             }
 
320
<a name="l00297"></a>00297         } <span class="keywordflow">else</span> {
 
321
<a name="l00298"></a>00298             <span class="comment">// insert replacement char</span>
 
322
<a name="l00299"></a>00299             result += 0xef;
 
323
<a name="l00300"></a>00300             result += 0xbf;
 
324
<a name="l00301"></a>00301             result += 0xbd;
 
325
<a name="l00302"></a>00302         }
 
326
<a name="l00303"></a>00303         ++ptr;
 
327
<a name="l00304"></a>00304     }
 
328
<a name="l00305"></a>00305     
 
329
<a name="l00306"></a>00306     <span class="keywordflow">return</span> result;
 
330
<a name="l00307"></a>00307 }
 
331
<a name="l00308"></a>00308 
 
332
<a name="l00309"></a><a class="code" href="structpion_1_1algorithm.html#ab3cce74846661c3585ec5f540a99ff07">00309</a> <span class="keywordtype">void</span> <a class="code" href="structpion_1_1algorithm.html#ab3cce74846661c3585ec5f540a99ff07">algorithm::float_from_bytes</a>(<span class="keywordtype">long</span> <span class="keywordtype">double</span>&amp; value, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *ptr, <span class="keywordtype">size_t</span> num_exp_bits, <span class="keywordtype">size_t</span> num_fraction_bits)
 
333
<a name="l00310"></a>00310 {
 
334
<a name="l00311"></a>00311     <span class="comment">// get sign of the number from the first bit</span>
 
335
<a name="l00312"></a>00312     <span class="keyword">const</span> <span class="keywordtype">int</span> value_sign = (*ptr &amp; 0x80) ? -1 : 1;
 
336
<a name="l00313"></a>00313     
 
337
<a name="l00314"></a>00314     <span class="comment">// build exponent value from bitstream</span>
 
338
<a name="l00315"></a>00315     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> mask = 0x80;
 
339
<a name="l00316"></a>00316     boost::int16_t exponent = 0;
 
340
<a name="l00317"></a>00317     <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> n = 0; n &lt; num_exp_bits; ++n) {
 
341
<a name="l00318"></a>00318         SHIFT_BITMASK(ptr, mask);
 
342
<a name="l00319"></a>00319         exponent *= 2;
 
343
<a name="l00320"></a>00320         <span class="keywordflow">if</span> (*ptr &amp; mask)
 
344
<a name="l00321"></a>00321             exponent += 1;
 
345
<a name="l00322"></a>00322     }
 
346
<a name="l00323"></a>00323     
 
347
<a name="l00324"></a>00324     <span class="comment">// build significand from bitstream</span>
 
348
<a name="l00325"></a>00325     <span class="keywordtype">long</span> <span class="keywordtype">double</span> significand = exponent ? 1.0 : 0.0;
 
349
<a name="l00326"></a>00326     <span class="keywordtype">long</span> <span class="keywordtype">double</span> significand_value = 1.0;
 
350
<a name="l00327"></a>00327     <span class="keywordflow">while</span> (num_fraction_bits) {
 
351
<a name="l00328"></a>00328         SHIFT_BITMASK(ptr, mask);
 
352
<a name="l00329"></a>00329         significand_value /= 2;
 
353
<a name="l00330"></a>00330         <span class="keywordflow">if</span> (*ptr &amp; mask)
 
354
<a name="l00331"></a>00331             significand += significand_value;
 
355
<a name="l00332"></a>00332         --num_fraction_bits;
 
356
<a name="l00333"></a>00333     }
 
357
<a name="l00334"></a>00334     
 
358
<a name="l00335"></a>00335     <span class="comment">// calculate final value</span>
 
359
<a name="l00336"></a>00336     exponent -= (::pow((<span class="keywordtype">long</span> double)2, (<span class="keywordtype">int</span>)(num_exp_bits - 1)) - 1);
 
360
<a name="l00337"></a>00337     value = value_sign * significand * ::pow((<span class="keywordtype">long</span> double)2, exponent);
 
361
<a name="l00338"></a>00338 }
 
362
<a name="l00339"></a>00339 
 
363
<a name="l00340"></a><a class="code" href="structpion_1_1algorithm.html#a61872c7ccf75793a16d8ce7961f28842">00340</a> <span class="keywordtype">void</span> <a class="code" href="structpion_1_1algorithm.html#a61872c7ccf75793a16d8ce7961f28842">algorithm::float_to_bytes</a>(<span class="keywordtype">long</span> <span class="keywordtype">double</span> value, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> num_exp_bits, <span class="keywordtype">size_t</span> num_fraction_bits)
 
364
<a name="l00341"></a>00341 {
 
365
<a name="l00342"></a>00342     <span class="comment">// first initialize output buffer to zeros</span>
 
366
<a name="l00343"></a>00343     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *ptr = buf;
 
367
<a name="l00344"></a>00344     memset(ptr, 0x00, ::ceil(static_cast&lt;float&gt;(num_exp_bits + num_fraction_bits + 1) / 8));
 
368
<a name="l00345"></a>00345     
 
369
<a name="l00346"></a>00346     <span class="comment">// initialize first byte starting with sign of number</span>
 
370
<a name="l00347"></a>00347     <span class="keywordflow">if</span> (value &lt; 0) {
 
371
<a name="l00348"></a>00348         *ptr = 0x80;
 
372
<a name="l00349"></a>00349         value *= -1;
 
373
<a name="l00350"></a>00350     }
 
374
<a name="l00351"></a>00351     
 
375
<a name="l00352"></a>00352     <span class="comment">// break down numbers &gt;= 1.0 by incrementing the exponent &amp; dividing by 2</span>
 
376
<a name="l00353"></a>00353     boost::int16_t exponent = 0;
 
377
<a name="l00354"></a>00354     <span class="keywordflow">while</span> (value &gt;= 1) {
 
378
<a name="l00355"></a>00355         value /= 2;
 
379
<a name="l00356"></a>00356         ++exponent;
 
380
<a name="l00357"></a>00357     }
 
381
<a name="l00358"></a>00358 
 
382
<a name="l00359"></a>00359     <span class="comment">// skip past exponent bits because we don&apos;t know the value yet</span>
 
383
<a name="l00360"></a>00360     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> mask = 0x40;
 
384
<a name="l00361"></a>00361     <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> n = num_exp_bits; n &gt; 0; --n) {
 
385
<a name="l00362"></a>00362         <span class="keywordflow">if</span> (n &gt;= 8) {
 
386
<a name="l00363"></a>00363             ++ptr;
 
387
<a name="l00364"></a>00364             n -= 7;
 
388
<a name="l00365"></a>00365         } <span class="keywordflow">else</span> {
 
389
<a name="l00366"></a>00366             SHIFT_BITMASK(ptr, mask);
 
390
<a name="l00367"></a>00367         }
 
391
<a name="l00368"></a>00368     }
 
392
<a name="l00369"></a>00369     
 
393
<a name="l00370"></a>00370     <span class="comment">// serialize fractional value &lt; 1.0</span>
 
394
<a name="l00371"></a>00371     <span class="keywordtype">bool</span> got_exponent = <span class="keyword">false</span>;
 
395
<a name="l00372"></a>00372     boost::uint16_t num_bits = 0;
 
396
<a name="l00373"></a>00373     <span class="keywordflow">while</span> (value &amp;&amp; num_bits &lt; num_fraction_bits) {
 
397
<a name="l00374"></a>00374         value *= 2;
 
398
<a name="l00375"></a>00375         <span class="keywordflow">if</span> (got_exponent) {
 
399
<a name="l00376"></a>00376             <span class="keywordflow">if</span> (value &gt;= 1.0) {
 
400
<a name="l00377"></a>00377                 *ptr |= mask;
 
401
<a name="l00378"></a>00378                 value -= 1.0;
 
402
<a name="l00379"></a>00379             }
 
403
<a name="l00380"></a>00380             SHIFT_BITMASK(ptr, mask);
 
404
<a name="l00381"></a>00381             ++num_bits;
 
405
<a name="l00382"></a>00382         } <span class="keywordflow">else</span> {
 
406
<a name="l00383"></a>00383             --exponent;
 
407
<a name="l00384"></a>00384             <span class="keywordflow">if</span> (value &gt;= 1.0) {
 
408
<a name="l00385"></a>00385                 value -= 1.0;
 
409
<a name="l00386"></a>00386                 got_exponent = <span class="keyword">true</span>;
 
410
<a name="l00387"></a>00387             }
 
411
<a name="l00388"></a>00388         }
 
412
<a name="l00389"></a>00389     }
 
413
<a name="l00390"></a>00390     
 
414
<a name="l00391"></a>00391     <span class="comment">// normalize exponent.</span>
 
415
<a name="l00392"></a>00392     <span class="comment">// note: we should have a zero exponent if value == 0</span>
 
416
<a name="l00393"></a>00393     boost::int32_t high_bit = ::pow((<span class="keywordtype">long</span> double)2, (<span class="keywordtype">int</span>)(num_exp_bits - 1));
 
417
<a name="l00394"></a>00394     <span class="keywordflow">if</span> (got_exponent)
 
418
<a name="l00395"></a>00395         exponent += (high_bit - 1);
 
419
<a name="l00396"></a>00396     <span class="keywordflow">else</span>
 
420
<a name="l00397"></a>00397         exponent = 0;
 
421
<a name="l00398"></a>00398     
 
422
<a name="l00399"></a>00399     <span class="comment">// serialize exponent bits</span>
 
423
<a name="l00400"></a>00400     ptr = buf;
 
424
<a name="l00401"></a>00401     mask = 0x80;
 
425
<a name="l00402"></a>00402     <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> n = 0; n &lt; num_exp_bits; ++n) {
 
426
<a name="l00403"></a>00403         SHIFT_BITMASK(ptr, mask);
 
427
<a name="l00404"></a>00404         <span class="keywordflow">if</span> (exponent &gt;= high_bit) {
 
428
<a name="l00405"></a>00405             *ptr |= mask;
 
429
<a name="l00406"></a>00406             exponent -= high_bit;
 
430
<a name="l00407"></a>00407         }
 
431
<a name="l00408"></a>00408         high_bit /= 2;
 
432
<a name="l00409"></a>00409     }
 
433
<a name="l00410"></a>00410 }
 
434
<a name="l00411"></a>00411     
 
435
<a name="l00412"></a>00412 }   <span class="comment">// end namespace pion</span>
347
436
</pre></div></div>
348
 
<hr size="1"/><address style="text-align: right;"><small>Generated on 15 Apr 2013 for pion by&nbsp;
 
437
<hr size="1"/><address style="text-align: right;"><small>Generated on 26 Jul 2013 for pion by&nbsp;
349
438
<a href="http://www.doxygen.org/index.html">
350
439
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
351
440
</body>