Sane C++ Libraries
C++ Platform Abstraction Libraries
Loading...
Searching...
No Matches
LibC.h
1// Copyright (c) Stefano Cristiano
2// SPDX-License-Identifier: MIT
3#pragma once
4#include "../Foundation/PrimitiveTypes.h"
5
6#if SC_PLATFORM_LINUX
7#if defined(__has_include)
8#if __has_include(<features.h>)
9#include <features.h>
10#endif
11#endif
12#endif
13
14#if SC_PLATFORM_WINDOWS
15#define SC_LIBC_CDECL __cdecl
16#else
17#define SC_LIBC_CDECL
18#endif
19
20#if SC_COMPILER_ENABLE_STD_CPP || SC_LANGUAGE_EXCEPTIONS || \
21 (SC_PLATFORM_WINDOWS && not SC_COMPILER_MSVC and not SC_COMPILER_CLANG_CL)
22#include <memory.h>
23#endif
24
25#if defined(__cplusplus)
26
27#if SC_COMPILER_MSVC
28extern "C"
29{
30 void* SC_LIBC_CDECL memcpy(void* dst, const void* src, SC::size_t len);
31 void* SC_LIBC_CDECL memmove(void* dst, const void* src, SC::size_t len);
32 int SC_LIBC_CDECL memcmp(const void* lhs, const void* rhs, SC::size_t len);
33 void* SC_LIBC_CDECL memset(void* dst, int value, SC::size_t len);
34 const void* SC_LIBC_CDECL memchr(const void* ptr, int value, SC::size_t len);
35 SC::size_t SC_LIBC_CDECL strlen(const char* str);
36 SC::size_t SC_LIBC_CDECL wcslen(const wchar_t* str);
37}
38#endif
39
40extern "C++"
41{
42 template <typename T1, typename T2>
43 inline void* memcpy(T1* dst, const T2* src, SC::size_t n)
44 {
45#if SC_COMPILER_CLANG || SC_COMPILER_GCC
46 return __builtin_memcpy(static_cast<void*>(dst), static_cast<const void*>(src), n);
47#else
48 return ::memcpy(static_cast<void*>(dst), static_cast<const void*>(src), n);
49#endif
50 }
51
52 template <typename T1, typename T2>
53 inline void* memmove(T1* dst, const T2* src, SC::size_t n)
54 {
55#if SC_COMPILER_CLANG || SC_COMPILER_GCC
56 return __builtin_memmove(static_cast<void*>(dst), static_cast<const void*>(src), n);
57#else
58 return ::memmove(static_cast<void*>(dst), static_cast<const void*>(src), n);
59#endif
60 }
61
62 template <typename T1, typename T2>
63 inline int memcmp(const T1* s1, const T2* s2, SC::size_t n)
64 {
65#if SC_COMPILER_CLANG || SC_COMPILER_GCC
66 return __builtin_memcmp(static_cast<const void*>(s1), static_cast<const void*>(s2), n);
67#else
68 return ::memcmp(static_cast<const void*>(s1), static_cast<const void*>(s2), n);
69#endif
70 }
71
72 template <typename T>
73 inline void* memset(T* dst, int c, SC::size_t n)
74 {
75#if SC_COMPILER_CLANG || SC_COMPILER_GCC
76 return __builtin_memset(static_cast<void*>(dst), c, n);
77#else
78 return ::memset(static_cast<void*>(dst), c, n);
79#endif
80 }
81
82 template <typename T>
83 inline const T* memchr(const T* s, int c, SC::size_t n)
84 {
85#if SC_COMPILER_CLANG || SC_COMPILER_GCC
86 return static_cast<const T*>(__builtin_memchr(static_cast<const void*>(s), c, n));
87#else
88 return static_cast<const T*>(::memchr(static_cast<const void*>(s), c, n));
89#endif
90 }
91
92 template <typename T>
93 inline T* memchr(T* s, int c, SC::size_t n)
94 {
95 return const_cast<T*>(::memchr(static_cast<const T*>(s), c, n));
96 }
97
98 template <typename T>
99 inline SC::size_t strlen(const T* s)
100 {
101#if SC_COMPILER_CLANG || SC_COMPILER_GCC
102 return __builtin_strlen(reinterpret_cast<const char*>(s));
103#else
104 return ::strlen(reinterpret_cast<const char*>(s));
105#endif
106 }
107
108#if SC_PLATFORM_WINDOWS
109 template <typename T>
110 inline SC::size_t wcslen(const T* s)
111 {
112#if SC_COMPILER_CLANG || SC_COMPILER_GCC
113 return __builtin_wcslen(reinterpret_cast<const wchar_t*>(s));
114#else
115 return ::wcslen(reinterpret_cast<const wchar_t*>(s));
116#endif
117 }
118#endif
119}
120
121#else
122
123extern "C"
124{
125#if SC_PLATFORM_WINDOWS
126 void* SC_LIBC_CDECL memmove(void* dst, const void* src, SC::size_t n);
127 void* SC_LIBC_CDECL memcpy(void* dst, const void* src, SC::size_t n);
128 int SC_LIBC_CDECL memcmp(const void* s1, const void* s2, SC::size_t n);
129 void* SC_LIBC_CDECL memset(void* dst, int c, SC::size_t len);
130 void* SC_LIBC_CDECL memchr(const void* s, int c, SC::size_t n);
131 SC::size_t SC_LIBC_CDECL strlen(const char* s);
132 SC::size_t SC_LIBC_CDECL wcslen(const wchar_t* s);
133#elif SC_PLATFORM_APPLE || SC_PLATFORM_LINUX || SC_PLATFORM_EMSCRIPTEN
134 void* memmove(void* dst, const void* src, SC::size_t n);
135 void* memcpy(void* dst, const void* src, SC::size_t n);
136 int memcmp(const void* s1, const void* s2, SC::size_t n);
137 void* memset(void* dst, int c, SC::size_t len);
138 void* memchr(const void* s, int c, SC::size_t n);
139 SC::size_t strlen(const char* s);
140#else
141#error "Unsupported platform"
142#endif
143}
144
145#endif
146
147#undef SC_LIBC_CDECL
decltype(sizeof(0)) size_t
Platform independent unsigned size type.
Definition PrimitiveTypes.h:45