Matter SDK Coverage Report
Current view: top level - lib/core - CHIPEncoding.h (source / functions) Coverage Total Hit
Test: SHA:b879ecb8e99e175eea0a293a888bda853da2b19c Lines: 97.1 % 69 67
Test Date: 2025-01-17 19:00:11 Functions: 96.4 % 28 27

            Line data    Source code
       1              : /*
       2              :  *
       3              :  *    Copyright (c) 2020 Project CHIP Authors
       4              :  *    Copyright (c) 2013-2017 Nest Labs, Inc.
       5              :  *
       6              :  *    Licensed under the Apache License, Version 2.0 (the "License");
       7              :  *    you may not use this file except in compliance with the License.
       8              :  *    You may obtain a copy of the License at
       9              :  *
      10              :  *        http://www.apache.org/licenses/LICENSE-2.0
      11              :  *
      12              :  *    Unless required by applicable law or agreed to in writing, software
      13              :  *    distributed under the License is distributed on an "AS IS" BASIS,
      14              :  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      15              :  *    See the License for the specific language governing permissions and
      16              :  *    limitations under the License.
      17              :  */
      18              : 
      19              : /**
      20              :  *    @file
      21              :  *      This file provides functions for:
      22              :  *
      23              :  *      <ul>
      24              :  *         <li>Performing byte reordering by value for 16-, 32-, and 64-bit
      25              :  *         types.</li>
      26              :  *         <li>Safely performing simple, efficient memory-mapped
      27              :  *         accesses, potentially to unaligned memory locations, with or
      28              :  *         without byte reordering, to 8-, 16-, 32-, and 64-bit
      29              :  *         quantities, both with and without pointer management.</li>
      30              :  *      </ul>
      31              :  *
      32              :  */
      33              : 
      34              : #pragma once
      35              : 
      36              : // The nlio headers use [inout] instead of [in,out], which makes the clang
      37              : // documentation warning unhappy.  Suppress it for those headers.
      38              : #pragma GCC diagnostic push
      39              : #ifdef __clang__
      40              : #pragma GCC diagnostic ignored "-Wdocumentation"
      41              : #endif // __clang__
      42              : 
      43              : #include <nlbyteorder.hpp>
      44              : #include <nlio-byteorder.hpp>
      45              : #include <nlio.hpp>
      46              : 
      47              : #pragma GCC diagnostic pop
      48              : 
      49              : #include <stdint.h>
      50              : 
      51              : namespace chip {
      52              : 
      53              : /**
      54              :  *  @namespace chip::Encoding
      55              :  *
      56              :  *  This namespace provides functions for:
      57              :  *
      58              :  *  <ul>
      59              :  *     <li>Performing byte reordering by value for 16-, 32-, and 64-bit
      60              :  *     types.</li>
      61              :  *     <li>Safely performing simple, efficient memory-mapped
      62              :  *     accesses, potentially to unaligned memory locations, with or
      63              :  *     without byte reordering, to 8-, 16-, 32-, and 64-bit
      64              :  *     quantities, both with and without pointer management.</li>
      65              :  *  </ul>
      66              :  *
      67              :  */
      68              : namespace Encoding {
      69              : 
      70              : /**
      71              :  * This unconditionally performs a byte order swap by value of the
      72              :  * specified 16-bit value.
      73              :  *
      74              :  * @param[in]  v  The 16-bit value to be byte order swapped.
      75              :  *
      76              :  * @return The input value, byte order swapped.
      77              :  */
      78              : inline uint16_t Swap16(uint16_t v)
      79              : {
      80              :     return nl::ByteOrder::Swap16(v);
      81              : }
      82              : 
      83              : /**
      84              :  * This unconditionally performs a byte order swap by value of the
      85              :  * specified 32-bit value.
      86              :  *
      87              :  * @param[in]  v  The 32-bit value to be byte order swapped.
      88              :  *
      89              :  * @return The input value, byte order swapped.
      90              :  */
      91              : inline uint32_t Swap32(uint32_t v)
      92              : {
      93              :     return nl::ByteOrder::Swap32(v);
      94              : }
      95              : 
      96              : /**
      97              :  * This unconditionally performs a byte order swap by value of the
      98              :  * specified 64-bit value.
      99              :  *
     100              :  * @param[in]  v  The 64-bit value to be byte order swapped.
     101              :  *
     102              :  * @return The input value, byte order swapped.
     103              :  */
     104              : inline uint64_t Swap64(uint64_t v)
     105              : {
     106              :     return nl::ByteOrder::Swap64(v);
     107              : }
     108              : 
     109              : /**
     110              :  * Perform a, potentially unaligned, memory read of the 8-bit value
     111              :  * from the specified pointer address.
     112              :  *
     113              :  * @param[in]  p      A pointer address, potentially unaligned, to read
     114              :  *                    the 8-bit value from.
     115              :  *
     116              :  * @return The 8-bit value at the specified pointer address.
     117              :  */
     118              : inline uint8_t Get8(const uint8_t * p)
     119              : {
     120              :     return nl::IO::Get8(p);
     121              : }
     122              : 
     123              : /**
     124              :  * Perform a, potentially unaligned, memory write of the target system
     125              :  * byte ordered 8-bit value to the specified pointer address.
     126              :  *
     127              :  * @param[in]  p      A pointer address, potentially unaligned, to write
     128              :  *                    the 8-bit value to.
     129              :  *
     130              :  * @param[in]  v      The 8-bit value to write.
     131              :  *
     132              :  */
     133              : inline void Put8(uint8_t * p, uint8_t v)
     134              : {
     135              :     nl::IO::Put8(p, v);
     136              : }
     137              : 
     138              : /**
     139              :  * Perform a, potentially unaligned, memory read of the 8-bit value
     140              :  * from the specified pointer address and increment the pointer by
     141              :  * 8-bits (1 byte).
     142              :  *
     143              :  * @param[in,out] p   A reference to a constant pointer address,
     144              :  *                    potentially unaligned, to read the 8-bit value
     145              :  *                    from and to then increment by 8-bits (1 byte).
     146              :  *
     147              :  * @return The 8-bit value at the specified pointer address.
     148              :  */
     149      3613415 : inline uint8_t Read8(const uint8_t *& p)
     150              : {
     151      3613415 :     return nl::IO::Read8(reinterpret_cast<const void *&>(p));
     152              : }
     153              : 
     154              : /**
     155              :  * Perform a, potentially unaligned, memory read of the 8-bit value
     156              :  * from the specified pointer address and increment the pointer by
     157              :  * 8-bits (1 byte).
     158              :  *
     159              :  * @param[in,out] p   A reference to a pointer address, potentially
     160              :  *                    unaligned, to read the 8-bit value from and to
     161              :  *                    then increment by 8-bits (1 byte).
     162              :  *
     163              :  * @return The 8-bit value at the specified pointer address.
     164              :  */
     165              : inline uint8_t Read8(uint8_t *& p)
     166              : {
     167              :     return Read8(const_cast<const uint8_t *&>(p));
     168              : }
     169              : 
     170              : /**
     171              :  * Perform a, potentially unaligned, memory write of the 8-bit value
     172              :  * to the specified pointer address and increment the pointer by
     173              :  * 8-bits (1 byte).
     174              :  *
     175              :  * @param[in,out] p   A reference to a pointer address, potentially
     176              :  *                    unaligned, to read the 8-bit value from and to
     177              :  *                    then increment by 8-bits (1 byte).
     178              :  *
     179              :  * @param[in]     v   The 8-bit value to write.
     180              :  *
     181              :  */
     182        78161 : inline void Write8(uint8_t *& p, uint8_t v)
     183              : {
     184        78161 :     *p++ = v;
     185        78161 : }
     186              : 
     187              : /**
     188              :  *  @namespace chip::Encoding::LittleEndian
     189              :  *
     190              :  *  This namespace provides functions for:
     191              :  *
     192              :  *  <ul>
     193              :  *     <li>Performing byte reordering, relative to the host system, by
     194              :  *     value of little endian byte ordered values for 16-, 32-, and
     195              :  *     64-bit types.</li>
     196              :  *     <li>Safely performing simple, efficient memory-mapped accesses,
     197              :  *     potentially to unaligned memory locations, with or without byte
     198              :  *     reordering, to 8-, 16-, 32-, and 64-bit little endian byte
     199              :  *     ordered quantities, both with and without pointer
     200              :  *     management.</li>
     201              :  *  </ul>
     202              :  *
     203              :  *  On little endian host systems no actual byte reordering will
     204              :  *  occur. On other systems, byte reordering is performed as
     205              :  *  appropriate.
     206              :  *
     207              :  */
     208              : namespace LittleEndian {
     209              : 
     210              : /**
     211              :  * This conditionally performs, as necessary for the target system, a
     212              :  * byte order swap by value of the specified value, presumed to be in
     213              :  * little endian byte ordering to the target system (i.e. host)
     214              :  * byte ordering.
     215              :  */
     216              : template <typename T>
     217              : inline T HostSwap(T v);
     218              : 
     219              : // For completeness of the set, we have identity.
     220              : template <>
     221        99138 : inline uint8_t HostSwap<uint8_t>(uint8_t v)
     222              : {
     223        99138 :     return v;
     224              : }
     225              : 
     226              : /**
     227              :  * This conditionally performs, as necessary for the target system, a
     228              :  * byte order swap by value of the specified 16-bit value, presumed to
     229              :  * be in little endian byte ordering to the target system (i.e. host)
     230              :  * byte ordering.
     231              :  *
     232              :  * Consequently, on little endian target systems, this is a no-op and
     233              :  * on big endian target systems, this performs a reordering.
     234              :  *
     235              :  * @param[in]  v  The 16-bit value to be byte order swapped.
     236              :  *
     237              :  * @return The input value, if necessary, byte order swapped.
     238              :  */
     239        55397 : inline uint16_t HostSwap16(uint16_t v)
     240              : {
     241        55397 :     return nl::ByteOrder::Swap16LittleToHost(v);
     242              : }
     243              : 
     244              : template <>
     245        55397 : inline uint16_t HostSwap<uint16_t>(uint16_t v)
     246              : {
     247        55397 :     return HostSwap16(v);
     248              : }
     249              : 
     250              : /**
     251              :  * This conditionally performs, as necessary for the target system, a
     252              :  * byte order swap by value of the specified 32-bit value, presumed to
     253              :  * be in little endian byte ordering to the target system (i.e. host)
     254              :  * byte ordering.
     255              :  *
     256              :  * Consequently, on little endian target systems, this is a no-op and
     257              :  * on big endian target systems, this performs a reordering.
     258              :  *
     259              :  * @param[in]  v  The 32-bit value to be byte order swapped.
     260              :  *
     261              :  * @return The input value, if necessary, byte order swapped.
     262              :  */
     263        34081 : inline uint32_t HostSwap32(uint32_t v)
     264              : {
     265        34081 :     return nl::ByteOrder::Swap32LittleToHost(v);
     266              : }
     267              : 
     268              : template <>
     269        34081 : inline uint32_t HostSwap<uint32_t>(uint32_t v)
     270              : {
     271        34081 :     return HostSwap32(v);
     272              : }
     273              : 
     274              : /**
     275              :  * This conditionally performs, as necessary for the target system, a
     276              :  * byte order swap by value of the specified 64-bit value, presumed to
     277              :  * be in little endian byte ordering to the target system (i.e. host)
     278              :  * byte ordering.
     279              :  *
     280              :  * Consequently, on little endian target systems, this is a no-op and
     281              :  * on big endian target systems, this performs a reordering.
     282              :  *
     283              :  * @param[in]  v  The 64-bit value to be byte order swapped.
     284              :  *
     285              :  * @return The input value, if necessary, byte order swapped.
     286              :  */
     287      8815879 : inline uint64_t HostSwap64(uint64_t v)
     288              : {
     289      8815879 :     return nl::ByteOrder::Swap64LittleToHost(v);
     290              : }
     291              : 
     292              : template <>
     293      8815879 : inline uint64_t HostSwap<uint64_t>(uint64_t v)
     294              : {
     295      8815879 :     return HostSwap64(v);
     296              : }
     297              : 
     298              : /**
     299              :  * Perform a, potentially unaligned, memory read of the little endian
     300              :  * byte ordered 16-bit value from the specified pointer address,
     301              :  * perform byte reordering, as necessary, for the target system to
     302              :  * put the value in target system byte ordering.
     303              :  *
     304              :  * @param[in]  p      A pointer address, potentially unaligned, to read
     305              :  *                    the 16-bit little endian byte ordered value from.
     306              :  *
     307              :  * @return The 16-bit value at the specified pointer address, if
     308              :  *         necessary, byte reordered.
     309              :  */
     310            0 : inline uint16_t Get16(const uint8_t * p)
     311              : {
     312            0 :     return nl::IO::LittleEndian::GetUnaligned16(p);
     313              : }
     314              : 
     315              : /**
     316              :  * Perform a, potentially unaligned, memory read of the little endian
     317              :  * byte ordered 32-bit value from the specified pointer address,
     318              :  * perform byte reordering, as necessary, for the target system to
     319              :  * put the value in target system byte ordering.
     320              :  *
     321              :  * @param[in]  p      A pointer address, potentially unaligned, to read
     322              :  *                    the 32-bit little endian byte ordered value from.
     323              :  *
     324              :  * @return The 32-bit value at the specified pointer address, if
     325              :  *         necessary, byte reordered.
     326              :  */
     327           34 : inline uint32_t Get32(const uint8_t * p)
     328              : {
     329           34 :     return nl::IO::LittleEndian::GetUnaligned32(p);
     330              : }
     331              : 
     332              : /**
     333              :  * Perform a, potentially unaligned, memory read of the little endian
     334              :  * byte ordered 64-bit value from the specified pointer address,
     335              :  * perform byte reordering, as necessary, for the target system to
     336              :  * put the value in target system byte ordering.
     337              :  *
     338              :  * @param[in]  p      A pointer address, potentially unaligned, to read
     339              :  *                    the 64-bit little endian byte ordered value from.
     340              :  *
     341              :  * @return The 64-bit value at the specified pointer address, if
     342              :  *         necessary, byte reordered.
     343              :  */
     344              : inline uint64_t Get64(const uint8_t * p)
     345              : {
     346              :     return nl::IO::LittleEndian::GetUnaligned64(p);
     347              : }
     348              : 
     349              : /**
     350              :  * Perform a, potentially unaligned, memory write of the target system
     351              :  * byte ordered 16-bit value to the specified pointer address,
     352              :  * perform byte reordering, as necessary, for the target system to
     353              :  * put the value in little endian byte ordering.
     354              :  *
     355              :  * @param[in]  p      A pointer address, potentially unaligned, to write
     356              :  *                    the target system byte ordered 16-bit value to in little
     357              :  *                    endian byte ordering.
     358              :  *
     359              :  * @param[in]  v      The 16-bit value to write, if necessary, byte reordered.
     360              :  *
     361              :  */
     362        13572 : inline void Put16(uint8_t * p, uint16_t v)
     363              : {
     364        13572 :     nl::IO::LittleEndian::PutUnaligned16(p, v);
     365        13572 : }
     366              : 
     367              : /**
     368              :  * Perform a, potentially unaligned, memory write of the target system
     369              :  * byte ordered 32-bit value to the specified pointer address,
     370              :  * perform byte reordering, as necessary, for the target system to
     371              :  * put the value in little endian byte ordering.
     372              :  *
     373              :  * @param[in]  p      A pointer address, potentially unaligned, to write
     374              :  *                    the target system byte ordered 32-bit value to in little
     375              :  *                    endian byte ordering.
     376              :  *
     377              :  * @param[in]  v      The 32-bit value to write, if necessary, byte reordered.
     378              :  *
     379              :  */
     380        37923 : inline void Put32(uint8_t * p, uint32_t v)
     381              : {
     382        37923 :     nl::IO::LittleEndian::PutUnaligned32(p, v);
     383        37923 : }
     384              : 
     385              : /**
     386              :  * Perform a, potentially unaligned, memory write of the target system
     387              :  * byte ordered 64-bit value to the specified pointer address,
     388              :  * perform byte reordering, as necessary, for the target system to
     389              :  * put the value in little endian byte ordering.
     390              :  *
     391              :  * @param[in]  p      A pointer address, potentially unaligned, to write
     392              :  *                    the target system byte ordered 64-bit value to in little
     393              :  *                    endian byte ordering.
     394              :  *
     395              :  * @param[in]  v      The 64-bit value to write, if necessary, byte reordered.
     396              :  *
     397              :  */
     398          152 : inline void Put64(uint8_t * p, uint64_t v)
     399              : {
     400          152 :     nl::IO::LittleEndian::PutUnaligned64(p, v);
     401          152 : }
     402              : 
     403              : /**
     404              :  * Perform a, potentially unaligned, memory read of the little endian
     405              :  * byte ordered 16-bit value from the specified pointer address,
     406              :  * perform byte reordering, as necessary, for the target system to put
     407              :  * the value in target system byte ordering, and increment the pointer
     408              :  * by 16-bits (2 bytes).
     409              :  *
     410              :  * @param[in,out] p   A reference to a constant pointer address, potentially
     411              :  *                    unaligned, to read the 16-bit little endian byte
     412              :  *                    ordered value from and to then increment by 16-
     413              :  *                    bits (2 bytes).
     414              :  *
     415              :  * @return The 16-bit value at the specified pointer address, if necessary,
     416              :  *         byte order swapped.
     417              :  */
     418      6762803 : inline uint16_t Read16(const uint8_t *& p)
     419              : {
     420      6762803 :     return nl::IO::LittleEndian::ReadUnaligned16(reinterpret_cast<const void *&>(p));
     421              : }
     422              : 
     423              : /**
     424              :  * Perform a, potentially unaligned, memory read of the little endian
     425              :  * byte ordered 16-bit value from the specified pointer address,
     426              :  * perform byte reordering, as necessary, for the target system to put
     427              :  * the value in target system byte ordering, and increment the pointer
     428              :  * by 16-bits (2 bytes).
     429              :  *
     430              :  * @param[in,out] p   A reference to a pointer address, potentially
     431              :  *                    unaligned, to read the 16-bit little endian byte
     432              :  *                    ordered value from and to then increment by 16-
     433              :  *                    bits (2 bytes).
     434              :  *
     435              :  * @return The 16-bit value at the specified pointer address, if necessary,
     436              :  *         byte order swapped.
     437              :  */
     438              : inline uint16_t Read16(uint8_t *& p)
     439              : {
     440              :     return Read16(const_cast<const uint8_t *&>(p));
     441              : }
     442              : 
     443              : /**
     444              :  * Perform a, potentially unaligned, memory read of the little endian
     445              :  * byte ordered 32-bit value from the specified pointer address,
     446              :  * perform byte reordering, as necessary, for the target system to put
     447              :  * the value in target system byte ordering, and increment the pointer
     448              :  * by 32-bits (4 bytes).
     449              :  *
     450              :  * @param[in,out] p   A reference to a constant pointer address, potentially
     451              :  *                    unaligned, to read the 32-bit little endian byte
     452              :  *                    ordered value from and to then increment by 32-
     453              :  *                    bits (4 bytes).
     454              :  *
     455              :  * @return The 32-bit value at the specified pointer address, if necessary,
     456              :  *         byte order swapped.
     457              :  */
     458         6243 : inline uint32_t Read32(const uint8_t *& p)
     459              : {
     460         6243 :     return nl::IO::LittleEndian::ReadUnaligned32(reinterpret_cast<const void *&>(p));
     461              : }
     462              : 
     463              : /**
     464              :  * Perform a, potentially unaligned, memory read of the little endian
     465              :  * byte ordered 32-bit value from the specified pointer address,
     466              :  * perform byte reordering, as necessary, for the target system to put
     467              :  * the value in target system byte ordering, and increment the pointer
     468              :  * by 32-bits (4 bytes).
     469              :  *
     470              :  * @param[in,out] p   A reference to a pointer address, potentially
     471              :  *                    unaligned, to read the 32-bit little endian byte
     472              :  *                    ordered value from and to then increment by 32-
     473              :  *                    bits (4 bytes).
     474              :  *
     475              :  * @return The 32-bit value at the specified pointer address, if necessary,
     476              :  *         byte order swapped.
     477              :  */
     478              : inline uint32_t Read32(uint8_t *& p)
     479              : {
     480              :     return Read32(const_cast<const uint8_t *&>(p));
     481              : }
     482              : 
     483              : /**
     484              :  * Perform a, potentially unaligned, memory read of the little endian
     485              :  * byte ordered 64-bit value from the specified pointer address,
     486              :  * perform byte reordering, as necessary, for the target system to put
     487              :  * the value in target system byte ordering, and increment the pointer
     488              :  * by 64-bits (8 bytes).
     489              :  *
     490              :  * @param[in,out] p   A reference to a constant pointer address, potentially
     491              :  *                    unaligned, to read the 64-bit little endian byte
     492              :  *                    ordered value from and to then increment by 64-
     493              :  *                    bits (8 bytes).
     494              :  *
     495              :  * @return The 64-bit value at the specified pointer address, if necessary,
     496              :  *         byte order swapped.
     497              :  */
     498              : inline uint64_t Read64(const uint8_t *& p)
     499              : {
     500              :     return nl::IO::LittleEndian::ReadUnaligned64(reinterpret_cast<const void *&>(p));
     501              : }
     502              : 
     503              : /**
     504              :  * Perform a, potentially unaligned, memory read of the little endian
     505              :  * byte ordered 64-bit value from the specified pointer address,
     506              :  * perform byte reordering, as necessary, for the target system to put
     507              :  * the value in target system byte ordering, and increment the pointer
     508              :  * by 64-bits (8 bytes).
     509              :  *
     510              :  * @param[in,out] p   A reference to a pointer address, potentially
     511              :  *                    unaligned, to read the 64-bit little endian byte
     512              :  *                    ordered value from and to then increment by 64-
     513              :  *                    bits (8 bytes).
     514              :  *
     515              :  * @return The 64-bit value at the specified pointer address, if necessary,
     516              :  *         byte order swapped.
     517              :  */
     518              : inline uint64_t Read64(uint8_t *& p)
     519              : {
     520              :     return Read64(const_cast<const uint8_t *&>(p));
     521              : }
     522              : 
     523              : /**
     524              :  * Perform a, potentially unaligned, memory write of the target system
     525              :  * byte ordered 16-bit value to the specified pointer address,
     526              :  * perform byte reordering, as necessary, for the target system to
     527              :  * put the value in little endian byte ordering.
     528              :  *
     529              :  * @param[in]  p      A reference to a pointer address, potentially
     530              :  *                    unaligned, to write the target system byte
     531              :  *                    ordered 16-bit value to in little endian byte
     532              :  *                    ordering and to then increment by 16-bits (2
     533              :  *                    bytes).
     534              :  *
     535              :  * @param[in]  v      The 16-bit value to write, if necessary, byte order
     536              :  *                    swapped.
     537              :  *
     538              :  */
     539        48922 : inline void Write16(uint8_t *& p, uint16_t v)
     540              : {
     541        48922 :     Put16(p, v);
     542        48922 :     p += sizeof(uint16_t);
     543        48922 : }
     544              : 
     545              : /**
     546              :  * Perform a, potentially unaligned, memory write of the target system
     547              :  * byte ordered 32-bit value to the specified pointer address,
     548              :  * perform byte reordering, as necessary, for the target system to
     549              :  * put the value in little endian byte ordering.
     550              :  *
     551              :  * @param[in]  p      A reference to a pointer address, potentially
     552              :  *                    unaligned, to write the target system byte
     553              :  *                    ordered 32-bit value to in little endian byte
     554              :  *                    ordering and to then increment by 32-bits (4
     555              :  *                    bytes).
     556              :  *
     557              :  * @param[in]  v      The 32-bit value to write, if necessary, byte order
     558              :  *                    swapped.
     559              :  *
     560              :  */
     561        37886 : inline void Write32(uint8_t *& p, uint32_t v)
     562              : {
     563        37886 :     Put32(p, v);
     564        37886 :     p += sizeof(uint32_t);
     565        37886 : }
     566              : 
     567              : /**
     568              :  * Perform a, potentially unaligned, memory write of the target system
     569              :  * byte ordered 64-bit value to the specified pointer address,
     570              :  * perform byte reordering, as necessary, for the target system to
     571              :  * put the value in little endian byte ordering.
     572              :  *
     573              :  * @param[in]  p      A reference to a pointer address, potentially
     574              :  *                    unaligned, to write the target system byte
     575              :  *                    ordered 64-bit value to in little endian byte
     576              :  *                    ordering and to then increment by 64-bits (8
     577              :  *                    bytes).
     578              :  *
     579              :  * @param[in]  v      The 64-bit value to write, if necessary, byte order
     580              :  *                    swapped.
     581              :  *
     582              :  */
     583          152 : inline void Write64(uint8_t *& p, uint64_t v)
     584              : {
     585          152 :     Put64(p, v);
     586          152 :     p += sizeof(uint64_t);
     587          152 : }
     588              : 
     589              : } // namespace LittleEndian
     590              : 
     591              : /**
     592              :  *  @namespace chip::Encoding::BigEndian
     593              :  *
     594              :  *  This namespace provides functions for:
     595              :  *
     596              :  *  <ul>
     597              :  *     <li>Performing byte reordering, relative to the host system, by
     598              :  *     value of big endian byte ordered values for 16-, 32-, and
     599              :  *     64-bit types.</li>
     600              :  *     <li>Safely performing simple, efficient memory-mapped accesses,
     601              :  *     potentially to unaligned memory locations, with or without byte
     602              :  *     reordering, to 8-, 16-, 32-, and 64-bit big endian byte
     603              :  *     ordered quantities, both with and without pointer
     604              :  *     management.</li>
     605              :  *  </ul>
     606              :  *
     607              :  *  On big endian host systems no actual byte reordering will
     608              :  *  occur. On other systems, byte reordering is performed as
     609              :  *  appropriate.
     610              :  *
     611              :  */
     612              : namespace BigEndian {
     613              : 
     614              : /**
     615              :  * This conditionally performs, as necessary for the target system, a
     616              :  * byte order swap by value of the specified 16-bit value, presumed to
     617              :  * be in big endian byte ordering to the target system (i.e. host)
     618              :  * byte ordering.
     619              :  *
     620              :  * Consequently, on bit endian target systems, this is a no-op and
     621              :  * on big endian target systems, this performs a reordering.
     622              :  *
     623              :  * @param[in]  v  The 16-bit value to be byte order swapped.
     624              :  *
     625              :  * @return The input value, if necessary, byte order swapped.
     626              :  */
     627              : inline uint16_t HostSwap16(uint16_t v)
     628              : {
     629              :     return nl::ByteOrder::Swap16BigToHost(v);
     630              : }
     631              : 
     632              : /**
     633              :  * This conditionally performs, as necessary for the target system, a
     634              :  * byte order swap by value of the specified 32-bit value, presumed to
     635              :  * be in big endian byte ordering to the target system (i.e. host)
     636              :  * byte ordering.
     637              :  *
     638              :  * Consequently, on bit endian target systems, this is a no-op and
     639              :  * on big endian target systems, this performs a reordering.
     640              :  *
     641              :  * @param[in]  v  The 32-bit value to be byte order swapped.
     642              :  *
     643              :  * @return The input value, if necessary, byte order swapped.
     644              :  */
     645           53 : inline uint32_t HostSwap32(uint32_t v)
     646              : {
     647           53 :     return nl::ByteOrder::Swap32BigToHost(v);
     648              : }
     649              : 
     650              : /**
     651              :  * This conditionally performs, as necessary for the target system, a
     652              :  * byte order swap by value of the specified 64-bit value, presumed to
     653              :  * be in big endian byte ordering to the target system (i.e. host)
     654              :  * byte ordering.
     655              :  *
     656              :  * Consequently, on bit endian target systems, this is a no-op and
     657              :  * on big endian target systems, this performs a reordering.
     658              :  *
     659              :  * @param[in]  v  The 64-bit value to be byte order swapped.
     660              :  *
     661              :  * @return The input value, if necessary, byte order swapped.
     662              :  */
     663              : inline uint64_t HostSwap64(uint64_t v)
     664              : {
     665              :     return nl::ByteOrder::Swap64BigToHost(v);
     666              : }
     667              : 
     668              : /**
     669              :  * Perform a, potentially unaligned, memory read of the big endian
     670              :  * byte ordered 16-bit value from the specified pointer address,
     671              :  * perform byte reordering, as necessary, for the target system to
     672              :  * put the value in target system byte ordering.
     673              :  *
     674              :  * @param[in]  p      A pointer address, potentially unaligned, to read
     675              :  *                    the 16-bit big endian byte ordered value from.
     676              :  *
     677              :  * @return The 16-bit value at the specified pointer address, if
     678              :  *         necessary, byte reordered.
     679              :  */
     680         2381 : inline uint16_t Get16(const uint8_t * p)
     681              : {
     682         2381 :     return nl::IO::BigEndian::GetUnaligned16(p);
     683              : }
     684              : 
     685              : /**
     686              :  * Perform a, potentially unaligned, memory read of the big endian
     687              :  * byte ordered 32-bit value from the specified pointer address,
     688              :  * perform byte reordering, as necessary, for the target system to
     689              :  * put the value in target system byte ordering.
     690              :  *
     691              :  * @param[in]  p      A pointer address, potentially unaligned, to read
     692              :  *                    the 32-bit big endian byte ordered value from.
     693              :  *
     694              :  * @return The 32-bit value at the specified pointer address, if
     695              :  *         necessary, byte reordered.
     696              :  */
     697           28 : inline uint32_t Get32(const uint8_t * p)
     698              : {
     699           28 :     return nl::IO::BigEndian::GetUnaligned32(p);
     700              : }
     701              : 
     702              : /**
     703              :  * Perform a, potentially unaligned, memory read of the big endian
     704              :  * byte ordered 64-bit value from the specified pointer address,
     705              :  * perform byte reordering, as necessary, for the target system to
     706              :  * put the value in target system byte ordering.
     707              :  *
     708              :  * @param[in]  p      A pointer address, potentially unaligned, to read
     709              :  *                    the 64-bit big endian byte ordered value from.
     710              :  *
     711              :  * @return The 64-bit value at the specified pointer address, if
     712              :  *         necessary, byte reordered.
     713              :  */
     714         1187 : inline uint64_t Get64(const uint8_t * p)
     715              : {
     716         1187 :     return nl::IO::BigEndian::GetUnaligned64(p);
     717              : }
     718              : 
     719              : /**
     720              :  * Perform a, potentially unaligned, memory write of the target system
     721              :  * byte ordered 16-bit value to the specified pointer address,
     722              :  * perform byte reordering, as necessary, for the target system to
     723              :  * put the value in big endian byte ordering.
     724              :  *
     725              :  * @param[in]  p      A pointer address, potentially unaligned, to write
     726              :  *                    the target system byte ordered 16-bit value to in big
     727              :  *                    endian byte ordering.
     728              :  *
     729              :  * @param[in]  v      The 16-bit value to write, if necessary, byte order
     730              :  *                    swapped.
     731              :  *
     732              :  */
     733          492 : inline void Put16(uint8_t * p, uint16_t v)
     734              : {
     735          492 :     nl::IO::BigEndian::PutUnaligned16(p, v);
     736          492 : }
     737              : 
     738              : /**
     739              :  * Perform a, potentially unaligned, memory write of the target system
     740              :  * byte ordered 32-bit value to the specified pointer address,
     741              :  * perform byte reordering, as necessary, for the target system to
     742              :  * put the value in big endian byte ordering.
     743              :  *
     744              :  * @param[in]  p      A pointer address, potentially unaligned, to write
     745              :  *                    the target system byte ordered 32-bit value to in big
     746              :  *                    endian byte ordering.
     747              :  *
     748              :  * @param[in]  v      The 32-bit value to write, if necessary, byte order
     749              :  *                    swapped.
     750              :  *
     751              :  */
     752          123 : inline void Put32(uint8_t * p, uint32_t v)
     753              : {
     754          123 :     nl::IO::BigEndian::PutUnaligned32(p, v);
     755          123 : }
     756              : 
     757              : /**
     758              :  * Perform a, potentially unaligned, memory write of the target system
     759              :  * byte ordered 64-bit value to the specified pointer address,
     760              :  * perform byte reordering, as necessary, for the target system to
     761              :  * put the value in big endian byte ordering.
     762              :  *
     763              :  * @param[in]  p      A pointer address, potentially unaligned, to write
     764              :  *                    the target system byte ordered 64-bit value to in big
     765              :  *                    endian byte ordering.
     766              :  *
     767              :  * @param[in]  v      The 64-bit value to write, if necessary, byte order
     768              :  *                    swapped.
     769              :  *
     770              :  */
     771        11705 : inline void Put64(uint8_t * p, uint64_t v)
     772              : {
     773        11705 :     nl::IO::BigEndian::PutUnaligned64(p, v);
     774        11705 : }
     775              : 
     776              : /**
     777              :  * Perform a, potentially unaligned, memory read of the big endian
     778              :  * byte ordered 16-bit value from the specified pointer address,
     779              :  * perform byte reordering, as necessary, for the target system to put
     780              :  * the value in target system byte ordering, and increment the pointer
     781              :  * by 16-bits (2 bytes).
     782              :  *
     783              :  * @param[in,out] p   A reference to a constant pointer address, potentially
     784              :  *                    unaligned, to read the 16-bit big endian byte
     785              :  *                    ordered value from and to then increment by 16-
     786              :  *                    bits (2 bytes).
     787              :  *
     788              :  * @return The 16-bit value at the specified pointer address, if necessary,
     789              :  *         byte order swapped.
     790              :  */
     791         1231 : inline uint16_t Read16(const uint8_t *& p)
     792              : {
     793         1231 :     return nl::IO::BigEndian::ReadUnaligned16(reinterpret_cast<const void *&>(p));
     794              : }
     795              : 
     796              : /**
     797              :  * Perform a, potentially unaligned, memory read of the big endian
     798              :  * byte ordered 16-bit value from the specified pointer address,
     799              :  * perform byte reordering, as necessary, for the target system to put
     800              :  * the value in target system byte ordering, and increment the pointer
     801              :  * by 16-bits (2 bytes).
     802              :  *
     803              :  * @param[in,out] p   A reference to a pointer address, potentially
     804              :  *                    unaligned, to read the 16-bit big endian byte
     805              :  *                    ordered value from and to then increment by 16-
     806              :  *                    bits (2 bytes).
     807              :  *
     808              :  * @return The 16-bit value at the specified pointer address, if necessary,
     809              :  *         byte order swapped.
     810              :  */
     811              : inline uint16_t Read16(uint8_t *& p)
     812              : {
     813              :     return Read16(const_cast<const uint8_t *&>(p));
     814              : }
     815              : 
     816              : /**
     817              :  * Perform a, potentially unaligned, memory read of the big endian
     818              :  * byte ordered 32-bit value from the specified pointer address,
     819              :  * perform byte reordering, as necessary, for the target system to put
     820              :  * the value in target system byte ordering, and increment the pointer
     821              :  * by 32-bits (4 bytes).
     822              :  *
     823              :  * @param[in,out] p   A reference to a constant pointer address, potentially
     824              :  *                    unaligned, to read the 32-bit big endian byte
     825              :  *                    ordered value from and to then increment by 32-
     826              :  *                    bits (4 bytes).
     827              :  *
     828              :  * @return The 32-bit value at the specified pointer address, if necessary,
     829              :  *         byte order swapped.
     830              :  */
     831          328 : inline uint32_t Read32(const uint8_t *& p)
     832              : {
     833          328 :     return nl::IO::BigEndian::ReadUnaligned32(reinterpret_cast<const void *&>(p));
     834              : }
     835              : 
     836              : /**
     837              :  * Perform a, potentially unaligned, memory read of the big endian
     838              :  * byte ordered 32-bit value from the specified pointer address,
     839              :  * perform byte reordering, as necessary, for the target system to put
     840              :  * the value in target system byte ordering, and increment the pointer
     841              :  * by 32-bits (4 bytes).
     842              :  *
     843              :  * @param[in,out] p   A reference to a pointer address, potentially
     844              :  *                    unaligned, to read the 32-bit big endian byte
     845              :  *                    ordered value from and to then increment by 32-
     846              :  *                    bits (4 bytes).
     847              :  *
     848              :  * @return The 32-bit value at the specified pointer address, if necessary,
     849              :  *         byte order swapped.
     850              :  */
     851              : inline uint32_t Read32(uint8_t *& p)
     852              : {
     853              :     return Read32(const_cast<const uint8_t *&>(p));
     854              : }
     855              : 
     856              : /**
     857              :  * Perform a, potentially unaligned, memory read of the big endian
     858              :  * byte ordered 64-bit value from the specified pointer address,
     859              :  * perform byte reordering, as necessary, for the target system to put
     860              :  * the value in target system byte ordering, and increment the pointer
     861              :  * by 64-bits (8 bytes).
     862              :  *
     863              :  * @param[in,out] p   A reference to a constant pointer address, potentially
     864              :  *                    unaligned, to read the 64-bit big endian byte
     865              :  *                    ordered value from and to then increment by 64-
     866              :  *                    bits (8 bytes).
     867              :  *
     868              :  * @return The 64-bit value at the specified pointer address, if necessary,
     869              :  *         byte order swapped.
     870              :  */
     871              : inline uint64_t Read64(const uint8_t *& p)
     872              : {
     873              :     return nl::IO::BigEndian::ReadUnaligned64(reinterpret_cast<const void *&>(p));
     874              : }
     875              : 
     876              : /**
     877              :  * Perform a, potentially unaligned, memory read of the big endian
     878              :  * byte ordered 64-bit value from the specified pointer address,
     879              :  * perform byte reordering, as necessary, for the target system to put
     880              :  * the value in target system byte ordering, and increment the pointer
     881              :  * by 64-bits (8 bytes).
     882              :  *
     883              :  * @param[in,out] p   A reference to a pointer address, potentially
     884              :  *                    unaligned, to read the 64-bit big endian byte
     885              :  *                    ordered value from and to then increment by 64-
     886              :  *                    bits (8 bytes).
     887              :  *
     888              :  * @return The 64-bit value at the specified pointer address, if necessary,
     889              :  *         byte order swapped.
     890              :  */
     891              : inline uint64_t Read64(uint8_t *& p)
     892              : {
     893              :     return Read64(const_cast<const uint8_t *&>(p));
     894              : }
     895              : 
     896              : /**
     897              :  * Perform a, potentially unaligned, memory write of the target system
     898              :  * byte ordered 16-bit value to the specified pointer address,
     899              :  * perform byte reordering, as necessary, for the target system to
     900              :  * put the value in big endian byte ordering.
     901              :  *
     902              :  * @param[in]  p      A reference to a pointer address, potentially
     903              :  *                    unaligned, to write the target system byte
     904              :  *                    ordered 16-bit value to in big endian byte
     905              :  *                    ordering and to then increment by 16-bits (2
     906              :  *                    bytes).
     907              :  *
     908              :  * @param[in]  v      The 16-bit value to write, if necessary, byte order
     909              :  *                    swapped.
     910              :  *
     911              :  */
     912              : inline void Write16(uint8_t *& p, uint16_t v)
     913              : {
     914              :     Put16(p, v);
     915              :     p += sizeof(uint16_t);
     916              : }
     917              : 
     918              : /**
     919              :  * Perform a, potentially unaligned, memory write of the target system
     920              :  * byte ordered 32-bit value to the specified pointer address,
     921              :  * perform byte reordering, as necessary, for the target system to
     922              :  * put the value in big endian byte ordering.
     923              :  *
     924              :  * @param[in]  p      A reference to a pointer address, potentially
     925              :  *                    unaligned, to write the target system byte
     926              :  *                    ordered 32-bit value to in big endian byte
     927              :  *                    ordering and to then increment by 32-bits (4
     928              :  *                    bytes).
     929              :  *
     930              :  * @param[in]  v      The 32-bit value to write, if necessary, byte order
     931              :  *                    swapped.
     932              :  *
     933              :  */
     934              : inline void Write32(uint8_t *& p, uint32_t v)
     935              : {
     936              :     Put32(p, v);
     937              :     p += sizeof(uint32_t);
     938              : }
     939              : 
     940              : /**
     941              :  * Perform a, potentially unaligned, memory write of the target system
     942              :  * byte ordered 64-bit value to the specified pointer address,
     943              :  * perform byte reordering, as necessary, for the target system to
     944              :  * put the value in big endian byte ordering.
     945              :  *
     946              :  * @param[in]  p      A reference to a pointer address, potentially
     947              :  *                    unaligned, to write the target system byte
     948              :  *                    ordered 64-bit value to in big endian byte
     949              :  *                    ordering and to then increment by 64-bits (8
     950              :  *                    bytes).
     951              :  *
     952              :  * @param[in]  v      The 64-bit value to write, if necessary, byte order
     953              :  *                    swapped.
     954              :  *
     955              :  */
     956              : inline void Write64(uint8_t *& p, uint64_t v)
     957              : {
     958              :     Put64(p, v);
     959              :     p += sizeof(uint64_t);
     960              : }
     961              : 
     962              : } // namespace BigEndian
     963              : 
     964              : } // namespace Encoding
     965              : } // namespace chip
        

Generated by: LCOV version 2.0-1