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
28
extern
"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
40
extern
"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
123
extern
"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
SC::size_t
decltype(sizeof(0)) size_t
Platform independent unsigned size type.
Definition
PrimitiveTypes.h:45
Libraries
Foundation
LibC.h
Generated by
1.12.0