FreeRDP
Loading...
Searching...
No Matches
cast.h
1
20#pragma once
21
22#include <stdint.h>
23
24#include <winpr/assert-api.h>
25
30#ifdef __cplusplus
31#define WINPR_CXX_COMPAT_CAST(t, val) static_cast<t>(val)
32#else
33#define WINPR_CXX_COMPAT_CAST(t, val) (t)(val)
34#endif
35
36#if defined(__GNUC__) || defined(__clang__)
44#define WINPR_REINTERPRET_CAST(ptr, srcType, dstType) \
45 __extension__({ \
46 union \
47 { \
48 srcType src; \
49 dstType dst; \
50 } cnv; \
51 WINPR_STATIC_ASSERT(sizeof(srcType) == sizeof(dstType)); \
52 cnv.src = ptr; \
53 cnv.dst; \
54 })
55
63#define WINPR_CAST_CONST_PTR_AWAY(ptr, dstType) \
64 __extension__({ \
65 union \
66 { \
67 __typeof(ptr) src; \
68 dstType dst; \
69 } cnv; \
70 cnv.src = ptr; \
71 cnv.dst; \
72 })
73
81#define WINPR_FUNC_PTR_CAST(ptr, dstType) \
82 __extension__({ \
83 union \
84 { \
85 __typeof(ptr) src; \
86 dstType dst; \
87 } cnv; \
88 WINPR_STATIC_ASSERT(sizeof(dstType) == sizeof(__typeof(ptr))); \
89 cnv.src = ptr; \
90 cnv.dst; \
91 })
92
93#else
94#define WINPR_REINTERPRET_CAST(ptr, srcType, dstType) (dstType) ptr
95#define WINPR_CAST_CONST_PTR_AWAY(ptr, dstType) (dstType) ptr
96#define WINPR_FUNC_PTR_CAST(ptr, dstType) (dstType)(uintptr_t) ptr
97#endif
98
99#if defined(__GNUC__) || defined(__clang__)
100
111#define WINPR_ASSERTING_INT_CAST(type, var) \
112 __extension__({ \
113 WINPR_ASSERT((var) == \
114 WINPR_CXX_COMPAT_CAST(__typeof(var), WINPR_CXX_COMPAT_CAST(type, (var)))); \
115 WINPR_ASSERT((((var) > 0) && (WINPR_CXX_COMPAT_CAST(type, (var)) > 0)) || \
116 (((var) <= 0) && WINPR_CXX_COMPAT_CAST(type, (var)) <= 0)); \
117 WINPR_CXX_COMPAT_CAST(type, (var)); \
118 })
119
120#else
121#define WINPR_ASSERTING_INT_CAST(type, var) WINPR_CXX_COMPAT_CAST(type, var)
122#endif