LCOV - code coverage report
Current view: top level - zephyr/sys - cbprintf_cxx.h Hit Total Coverage
Test: new.info Lines: 0 1 0.0 %
Date: 2024-12-22 00:14:23

          Line data    Source code
       1           0 : /*
       2             :  * Copyright (c) 2021 Nordic Semiconductor ASA
       3             :  *
       4             :  * SPDX-License-Identifier: Apache-2.0
       5             :  */
       6             : 
       7             : #ifndef ZEPHYR_INCLUDE_SYS_CBPRINTF_CXX_H_
       8             : #define ZEPHYR_INCLUDE_SYS_CBPRINTF_CXX_H_
       9             : #ifdef __cplusplus
      10             : 
      11             : /* C++ version for detecting a pointer to a string. */
      12             : static inline int z_cbprintf_cxx_is_pchar(char *, bool const_as_fixed)
      13             : {
      14             :         ARG_UNUSED(const_as_fixed);
      15             :         return 1;
      16             : }
      17             : 
      18             : static inline int z_cbprintf_cxx_is_pchar(const char *, bool const_as_fixed)
      19             : {
      20             :         return const_as_fixed ? 0 : 1;
      21             : }
      22             : 
      23             : static inline int z_cbprintf_cxx_is_pchar(volatile char *, bool const_as_fixed)
      24             : {
      25             :         ARG_UNUSED(const_as_fixed);
      26             :         return 1;
      27             : }
      28             : 
      29             : static inline int z_cbprintf_cxx_is_pchar(const volatile char *, bool const_as_fixed)
      30             : {
      31             :         ARG_UNUSED(const_as_fixed);
      32             :         return 1;
      33             : }
      34             : 
      35             : static inline int z_cbprintf_cxx_is_pchar(unsigned char *, bool const_as_fixed)
      36             : {
      37             :         ARG_UNUSED(const_as_fixed);
      38             :         return 1;
      39             : }
      40             : 
      41             : static inline int z_cbprintf_cxx_is_pchar(const unsigned char *, bool const_as_fixed)
      42             : {
      43             :         return const_as_fixed ? 0 : 1;
      44             : }
      45             : 
      46             : static inline int z_cbprintf_cxx_is_pchar(volatile unsigned char *, bool const_as_fixed)
      47             : {
      48             :         ARG_UNUSED(const_as_fixed);
      49             :         return 1;
      50             : }
      51             : 
      52             : static inline int z_cbprintf_cxx_is_pchar(const volatile unsigned char *, bool const_as_fixed)
      53             : {
      54             :         ARG_UNUSED(const_as_fixed);
      55             :         return 1;
      56             : }
      57             : static inline int z_cbprintf_cxx_is_pchar(wchar_t *, bool const_as_fixed)
      58             : {
      59             :         ARG_UNUSED(const_as_fixed);
      60             :         return 1;
      61             : }
      62             : 
      63             : static inline int z_cbprintf_cxx_is_pchar(const wchar_t *, bool const_as_fixed)
      64             : {
      65             :         return const_as_fixed ? 0 : 1;
      66             : }
      67             : 
      68             : static inline int z_cbprintf_cxx_is_pchar(volatile wchar_t *, bool const_as_fixed)
      69             : {
      70             :         ARG_UNUSED(const_as_fixed);
      71             :         return 1;
      72             : }
      73             : 
      74             : static inline int z_cbprintf_cxx_is_pchar(const volatile wchar_t *, bool const_as_fixed)
      75             : {
      76             :         ARG_UNUSED(const_as_fixed);
      77             :         return 1;
      78             : }
      79             : 
      80             : template < typename T >
      81             : static inline int z_cbprintf_cxx_is_pchar(T arg, bool const_as_fixed)
      82             : {
      83             :         ARG_UNUSED(arg);
      84             :         _Pragma("GCC diagnostic push")
      85             :         _Pragma("GCC diagnostic ignored \"-Wpointer-arith\"")
      86             :         ARG_UNUSED(const_as_fixed);
      87             :         return 0;
      88             :         _Pragma("GCC diagnostic pop")
      89             : }
      90             : 
      91             : /* C++ version for determining if variable type is numeric and fits in 32 bit word. */
      92             : static inline int z_cbprintf_cxx_is_word_num(char)
      93             : {
      94             :         return 1;
      95             : }
      96             : 
      97             : static inline int z_cbprintf_cxx_is_word_num(unsigned char)
      98             : {
      99             :         return 1;
     100             : }
     101             : 
     102             : static inline int z_cbprintf_cxx_is_word_num(short)
     103             : {
     104             :         return 1;
     105             : }
     106             : 
     107             : static inline int z_cbprintf_cxx_is_word_num(unsigned short)
     108             : {
     109             :         return 1;
     110             : }
     111             : 
     112             : static inline int z_cbprintf_cxx_is_word_num(int)
     113             : {
     114             :         return 1;
     115             : }
     116             : 
     117             : static inline int z_cbprintf_cxx_is_word_num(unsigned int)
     118             : {
     119             :         return 1;
     120             : }
     121             : 
     122             : static inline int z_cbprintf_cxx_is_word_num(long)
     123             : {
     124             :         return (sizeof(long) <= sizeof(uint32_t)) ? 1 : 0;
     125             : }
     126             : 
     127             : static inline int z_cbprintf_cxx_is_word_num(unsigned long)
     128             : {
     129             :         return (sizeof(long) <= sizeof(uint32_t)) ? 1 : 0;
     130             : }
     131             : 
     132             : template < typename T >
     133             : static inline int z_cbprintf_cxx_is_word_num(T arg)
     134             : {
     135             :         ARG_UNUSED(arg);
     136             :         _Pragma("GCC diagnostic push")
     137             :         _Pragma("GCC diagnostic ignored \"-Wpointer-arith\"")
     138             :         return 0;
     139             :         _Pragma("GCC diagnostic pop")
     140             : }
     141             : 
     142             : /* C++ version for determining if argument is a none character pointer. */
     143             : static inline int z_cbprintf_cxx_is_none_char_ptr(char)
     144             : {
     145             :         return 0;
     146             : }
     147             : 
     148             : static inline int z_cbprintf_cxx_is_none_char_ptr(unsigned char)
     149             : {
     150             :         return 0;
     151             : }
     152             : 
     153             : static inline int z_cbprintf_cxx_is_none_char_ptr(short)
     154             : {
     155             :         return 0;
     156             : }
     157             : 
     158             : static inline int z_cbprintf_cxx_is_none_char_ptr(unsigned short)
     159             : {
     160             :         return 0;
     161             : }
     162             : 
     163             : static inline int z_cbprintf_cxx_is_none_char_ptr(int)
     164             : {
     165             :         return 0;
     166             : }
     167             : 
     168             : static inline int z_cbprintf_cxx_is_none_char_ptr(unsigned int)
     169             : {
     170             :         return 0;
     171             : }
     172             : 
     173             : static inline int z_cbprintf_cxx_is_none_char_ptr(long)
     174             : {
     175             :         return 0;
     176             : }
     177             : 
     178             : static inline int z_cbprintf_cxx_is_none_char_ptr(unsigned long)
     179             : {
     180             :         return 0;
     181             : }
     182             : 
     183             : static inline int z_cbprintf_cxx_is_none_char_ptr(long long)
     184             : {
     185             :         return 0;
     186             : }
     187             : 
     188             : static inline int z_cbprintf_cxx_is_none_char_ptr(unsigned long long)
     189             : {
     190             :         return 0;
     191             : }
     192             : 
     193             : static inline int z_cbprintf_cxx_is_none_char_ptr(float)
     194             : {
     195             :         return 0;
     196             : }
     197             : 
     198             : static inline int z_cbprintf_cxx_is_none_char_ptr(double)
     199             : {
     200             :         return 0;
     201             : }
     202             : 
     203             : static inline int z_cbprintf_cxx_is_none_char_ptr(char *)
     204             : {
     205             :         return 0;
     206             : }
     207             : 
     208             : static inline int z_cbprintf_cxx_is_none_char_ptr(volatile char *)
     209             : {
     210             :         return 0;
     211             : }
     212             : 
     213             : static inline int z_cbprintf_cxx_is_none_char_ptr(const char *)
     214             : {
     215             :         return 0;
     216             : }
     217             : 
     218             : static inline int z_cbprintf_cxx_is_none_char_ptr(const volatile char *)
     219             : {
     220             :         return 0;
     221             : }
     222             : 
     223             : static inline int z_cbprintf_cxx_is_none_char_ptr(unsigned char *)
     224             : {
     225             :         return 0;
     226             : }
     227             : 
     228             : static inline int z_cbprintf_cxx_is_none_char_ptr(volatile unsigned char *)
     229             : {
     230             :         return 0;
     231             : }
     232             : 
     233             : static inline int z_cbprintf_cxx_is_none_char_ptr(const unsigned char *)
     234             : {
     235             :         return 0;
     236             : }
     237             : 
     238             : static inline int z_cbprintf_cxx_is_none_char_ptr(const volatile unsigned char *)
     239             : {
     240             :         return 0;
     241             : }
     242             : 
     243             : template < typename T >
     244             : static inline int z_cbprintf_cxx_is_none_char_ptr(T arg)
     245             : {
     246             :         ARG_UNUSED(arg);
     247             : 
     248             :         return 1;
     249             : }
     250             : 
     251             : /* C++ version for calculating argument size. */
     252             : static inline size_t z_cbprintf_cxx_arg_size(float f)
     253             : {
     254             :         ARG_UNUSED(f);
     255             : 
     256             :         return sizeof(double);
     257             : }
     258             : 
     259             : template < typename T >
     260             : static inline size_t z_cbprintf_cxx_arg_size(T arg)
     261             : {
     262             :         ARG_UNUSED(arg);
     263             : 
     264             :         return MAX(sizeof(T), sizeof(int));
     265             : }
     266             : 
     267             : /* C++ version for storing arguments. */
     268             : static inline void z_cbprintf_cxx_store_arg(uint8_t *dst, float arg)
     269             : {
     270             :         double d = (double)arg;
     271             :         void *p = &d;
     272             : 
     273             :         z_cbprintf_wcpy((int *)dst, (int *)p, sizeof(d) / sizeof(int));
     274             : }
     275             : 
     276             : static inline void z_cbprintf_cxx_store_arg(uint8_t *dst, void *p)
     277             : {
     278             :         z_cbprintf_wcpy((int *)dst, (int *)&p, sizeof(p) / sizeof(int));
     279             : }
     280             : 
     281             : static inline void z_cbprintf_cxx_store_arg(uint8_t *dst, char arg)
     282             : {
     283             :         int tmp = arg + 0;
     284             : 
     285             :         z_cbprintf_wcpy((int *)dst, &tmp, 1);
     286             : }
     287             : 
     288             : static inline void z_cbprintf_cxx_store_arg(uint8_t *dst, unsigned char arg)
     289             : {
     290             :         int tmp = arg + 0;
     291             : 
     292             :         z_cbprintf_wcpy((int *)dst, &tmp, 1);
     293             : }
     294             : 
     295             : static inline void z_cbprintf_cxx_store_arg(uint8_t *dst, signed char arg)
     296             : {
     297             :         int tmp = arg + 0;
     298             : 
     299             :         z_cbprintf_wcpy((int *)dst, &tmp, 1);
     300             : }
     301             : 
     302             : static inline void z_cbprintf_cxx_store_arg(uint8_t *dst, short arg)
     303             : {
     304             :         int tmp = arg + 0;
     305             : 
     306             :         z_cbprintf_wcpy((int *)dst, &tmp, 1);
     307             : }
     308             : 
     309             : static inline void z_cbprintf_cxx_store_arg(uint8_t *dst, unsigned short arg)
     310             : {
     311             :         int tmp = arg + 0;
     312             : 
     313             :         z_cbprintf_wcpy((int *)dst, &tmp, 1);
     314             : }
     315             : 
     316             : template < typename T >
     317             : static inline void z_cbprintf_cxx_store_arg(uint8_t *dst, T arg)
     318             : {
     319             :         size_t wlen = z_cbprintf_cxx_arg_size(arg) / sizeof(int);
     320             :         void *p = &arg;
     321             : 
     322             :         z_cbprintf_wcpy((int *)dst, (int *)p, wlen);
     323             : }
     324             : 
     325             : /* C++ version for long double detection. */
     326             : static inline int z_cbprintf_cxx_is_longdouble(long double arg)
     327             : {
     328             :         ARG_UNUSED(arg);
     329             :         return 1;
     330             : }
     331             : 
     332             : template < typename T >
     333             : static inline int z_cbprintf_cxx_is_longdouble(T arg)
     334             : {
     335             :         ARG_UNUSED(arg);
     336             : 
     337             :         return 0;
     338             : }
     339             : 
     340             : /* C++ version for calculating argument alignment. */
     341             : static inline size_t z_cbprintf_cxx_alignment(float arg)
     342             : {
     343             :         ARG_UNUSED(arg);
     344             : 
     345             :         return VA_STACK_ALIGN(double);
     346             : }
     347             : 
     348             : static inline size_t z_cbprintf_cxx_alignment(double arg)
     349             : {
     350             :         ARG_UNUSED(arg);
     351             : 
     352             :         return VA_STACK_ALIGN(double);
     353             : }
     354             : 
     355             : static inline size_t z_cbprintf_cxx_alignment(long double arg)
     356             : {
     357             :         ARG_UNUSED(arg);
     358             : 
     359             :         return VA_STACK_ALIGN(long double);
     360             : }
     361             : 
     362             : static inline size_t z_cbprintf_cxx_alignment(long long arg)
     363             : {
     364             :         ARG_UNUSED(arg);
     365             : 
     366             :         return VA_STACK_ALIGN(long long);
     367             : }
     368             : 
     369             : static inline size_t z_cbprintf_cxx_alignment(unsigned long long arg)
     370             : {
     371             :         ARG_UNUSED(arg);
     372             : 
     373             :         return VA_STACK_ALIGN(long long);
     374             : }
     375             : 
     376             : template < typename T >
     377             : static inline size_t z_cbprintf_cxx_alignment(T arg)
     378             : {
     379             :         return MAX(__alignof__(arg), VA_STACK_MIN_ALIGN);
     380             : }
     381             : 
     382             : /* C++ version for checking if two arguments are same type */
     383             : template < typename T1, typename T2 >
     384             : struct z_cbprintf_cxx_is_same_type {
     385             :         enum {
     386             :                 value = false
     387             :         };
     388             : };
     389             : 
     390             : template < typename T >
     391             : struct z_cbprintf_cxx_is_same_type < T, T > {
     392             :         enum {
     393             :                 value = true
     394             :         };
     395             : };
     396             : 
     397             : template < typename T >
     398             : struct z_cbprintf_cxx_remove_reference {
     399             :         typedef T type;
     400             : };
     401             : 
     402             : template < typename T >
     403             : struct z_cbprintf_cxx_remove_reference < T & > {
     404             :         typedef T type;
     405             : };
     406             : 
     407             : #if __cplusplus >= 201103L
     408             : template < typename T >
     409             : struct z_cbprintf_cxx_remove_reference < T && > {
     410             :         typedef T type;
     411             : };
     412             : #endif
     413             : 
     414             : template < typename T >
     415             : struct z_cbprintf_cxx_remove_cv {
     416             :         typedef T type;
     417             : };
     418             : 
     419             : template < typename T >
     420             : struct z_cbprintf_cxx_remove_cv < const T > {
     421             :         typedef T type;
     422             : };
     423             : 
     424             : template < typename T >
     425             : struct z_cbprintf_cxx_remove_cv < volatile T > {
     426             :         typedef T type;
     427             : };
     428             : 
     429             : template < typename T >
     430             : struct z_cbprintf_cxx_remove_cv < const volatile T > {
     431             :         typedef T type;
     432             : };
     433             : 
     434             : /* Determine if a type is an array */
     435             : template < typename T >
     436             : struct z_cbprintf_cxx_is_array {
     437             :         enum {
     438             :                 value = false
     439             :         };
     440             : };
     441             : 
     442             : template < typename T >
     443             : struct z_cbprintf_cxx_is_array < T[] > {
     444             :         enum {
     445             :                 value = true
     446             :         };
     447             : };
     448             : 
     449             : template < typename T, size_t N >
     450             : struct z_cbprintf_cxx_is_array < T[N] > {
     451             :         enum {
     452             :                 value = true
     453             :         };
     454             : };
     455             : 
     456             : /* Determine the type of elements in an array */
     457             : template < typename T >
     458             : struct z_cbprintf_cxx_remove_extent {
     459             :         typedef T type;
     460             : };
     461             : 
     462             : template < typename T >
     463             : struct z_cbprintf_cxx_remove_extent < T[] > {
     464             :         typedef T type;
     465             : };
     466             : 
     467             : template < typename T, size_t N >
     468             : struct z_cbprintf_cxx_remove_extent < T[N] > {
     469             :         typedef T type;
     470             : };
     471             : 
     472             : #endif /* __cplusplus */
     473             : #endif /* ZEPHYR_INCLUDE_SYS_CBPRINTF_CXX_H_ */

Generated by: LCOV version 1.14