LCOV - code coverage report
Current view: top level - libs/bsw/cpp2someip/include/someip - EtlString.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 21 21
Test Date: 2026-09-11 12:05:06 Functions: 100.0 % 4 4

            Line data    Source code
       1              : /********************************************************************************
       2              :  * Copyright (c) 2026 Accenture
       3              :  *
       4              :  * This program and the accompanying materials are made available under the
       5              :  * terms of the Apache License Version 2.0 which is available at
       6              :  * https://www.apache.org/licenses/LICENSE-2.0
       7              :  *
       8              :  * SPDX-License-Identifier: Apache-2.0
       9              :  ********************************************************************************/
      10              : 
      11              : #pragma once
      12              : 
      13              : #include "someip/LengthHelper.h"
      14              : #include "someip/PrimitiveTypes.h"
      15              : #include "someip/SomeIpParser.h"
      16              : #include "someip/SomeIpSerializer.h"
      17              : #include "someip/StringEncoding.h"
      18              : 
      19              : #include <etl/string.h>
      20              : 
      21              : namespace someip
      22              : {
      23              : namespace internal
      24              : {
      25              : /// \cond INTERNAL
      26              : template<size_t S>
      27              : struct GetSizeHelper<::etl::string<S>>
      28              : {
      29              :     static uint32_t
      30            2 :     getSize(::etl::string<S> const& t, size_t const lengthSize, Encoding const encoding)
      31              :     {
      32            2 :         uint32_t const bomLength  = EncodingHelper::encodingLength(encoding);
      33            2 :         uint32_t const termLength = EncodingHelper::terminationLength(encoding);
      34              : 
      35              :         // static string
      36            2 :         if (lengthSize == 0U)
      37              :         {
      38              :             return static_cast<uint32_t>(
      39            1 :                 (t.max_size() * sizeof(char)) - 1U + bomLength + termLength);
      40              :         }
      41              : 
      42              :         // dynamic string
      43              :         return static_cast<uint32_t>(
      44            1 :             (lengthSize + (t.size() * sizeof(char))) + bomLength + termLength);
      45              :     }
      46              : };
      47              : 
      48              : /// \endcond
      49              : 
      50              : } // namespace internal
      51              : } // namespace someip
      52              : 
      53              : namespace someip
      54              : {
      55              : /*
      56              :  * Base class string parser for both static and dynamic strings
      57              :  */
      58              : class StringParser
      59              : {
      60              : protected:
      61              :     static bool parseBom(SomeIpParser& parser, char const* bom, uint32_t bomLength);
      62              : 
      63              :     static void readAndSkipNulls(SomeIpParser& parser, ::etl::istring& str, uint32_t nulls);
      64              : };
      65              : 
      66              : /*
      67              :  * Base class string serializer for both static and dynamic strings
      68              :  */
      69              : class StringSerializer
      70              : {
      71              : protected:
      72              :     static void writeStringBytes(
      73              :         SomeIpSerializer& serializer, ::etl::istring const& str, Encoding encoding, uint32_t nulls);
      74              : };
      75              : 
      76              : /**
      77              :  * StaticStringParser is a helper class used for reading a SOME/IP fixed-length string from
      78              :  * an array of bytes. This class is used by the SOME/IP code generator.
      79              :  */
      80              : class StaticStringParser : public StringParser
      81              : {
      82              : public:
      83              :     /**
      84              :      * A helper friend function for reading in a fixed-length string.
      85              :      *
      86              :      * \param parser The SOME/IP parser.
      87              :      * \param str The container object that holds the string to be parsed.
      88              :      */
      89              :     static void readString(SomeIpParser& parser, ::etl::istring& str, Encoding encoding);
      90              : 
      91              : private:
      92              :     static void
      93              :     readUtf8Bytes(SomeIpParser& parser, ::etl::istring& str, uint32_t terminationLength);
      94              : 
      95              :     static void
      96              :     readUtf16Bytes(SomeIpParser& parser, ::etl::istring& str, uint32_t terminationLength);
      97              : };
      98              : 
      99              : class StaticStringSerializer : public StringSerializer
     100              : {
     101              : public:
     102              :     static void
     103              :     writeString(SomeIpSerializer& serializer, ::etl::istring const& str, Encoding encoding);
     104              : };
     105              : 
     106              : template<class LENGTH_TYPE>
     107              : class DynamicStringSerializer : public StringSerializer
     108              : {
     109              : public:
     110              :     static void
     111              :     writeString(SomeIpSerializer& serializer, ::etl::istring const& str, Encoding encoding);
     112              : };
     113              : 
     114              : class DynamicStringParserBase : public StringParser
     115              : {
     116              : protected:
     117              :     static void parseStringBytes(
     118              :         SomeIpParser& parser, ::etl::istring& str, Encoding encoding, uint32_t numBytes);
     119              : };
     120              : 
     121              : template<class LENGTH_TYPE>
     122              : class DynamicStringParser : public DynamicStringParserBase
     123              : {
     124              : public:
     125              :     static void readString(SomeIpParser& parser, ::etl::istring& str, Encoding encoding);
     126              : };
     127              : 
     128              : /*
     129              :  * inline implementation
     130              :  */
     131              : 
     132              : /*
     133              :  * DynamicStringSerializer
     134              :  */
     135              : // static
     136              : template<class LENGTH_TYPE>
     137            3 : void DynamicStringSerializer<LENGTH_TYPE>::writeString(
     138              :     SomeIpSerializer& serializer, ::etl::istring const& str, Encoding const encoding)
     139              : {
     140            3 :     if (!serializer.isGood())
     141              :     {
     142            1 :         return;
     143              :     }
     144              : 
     145            2 :     LengthSerializerHelper<LENGTH_TYPE> const helper(serializer);
     146              : 
     147            2 :     uint32_t const nulls = internal::EncodingHelper::terminationLength(encoding);
     148              : 
     149            2 :     writeStringBytes(serializer, str, encoding, nulls);
     150            2 : }
     151              : 
     152              : /*
     153              :  * DynamicStringParser
     154              :  */
     155              : template<class LENGTH_TYPE>
     156           10 : void DynamicStringParser<LENGTH_TYPE>::readString(
     157              :     SomeIpParser& parser, ::etl::istring& str, Encoding const encoding)
     158              : {
     159           10 :     if (!parser.isGood())
     160              :     {
     161            1 :         return;
     162              :     }
     163              : 
     164            9 :     str.clear();
     165              : 
     166            9 :     uint32_t const numBytes = LengthParserHelper<LENGTH_TYPE>::parseLength(parser);
     167            9 :     if (numBytes == 0U)
     168              :     {
     169            2 :         return;
     170              :     }
     171              : 
     172            7 :     parseStringBytes(parser, str, encoding, numBytes);
     173              : }
     174              : 
     175              : } // namespace someip
        

Generated by: LCOV version 2.0-1