Skip to content

Commit be91266

Browse files
committed
Add workaround impls of memcpy, memmove, memset
1 parent a247e2d commit be91266

File tree

1 file changed

+47
-1
lines changed

1 file changed

+47
-1
lines changed

include/boost/decimal/detail/memcpy.hpp

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,56 @@ namespace boost {
3131
namespace decimal {
3232
namespace detail {
3333

34-
#if !defined(BOOST_DECIMAL_NO_CONSTEVAL_DETECTION)
34+
namespace impl {
3535

3636
#define BOOST_DECIMAL_CONSTEXPR constexpr
3737

38+
constexpr char* memcpy_impl(char* dest, const char* src, std::size_t count)
39+
{
40+
for (std::size_t i = 0; i < count; ++i)
41+
{
42+
dest[i] = src[i];
43+
}
44+
45+
return dest;
46+
}
47+
48+
constexpr char* memset_impl(char* dest, int ch, std::size_t count)
49+
{
50+
for (std::size_t i = 0; i < count; ++i)
51+
{
52+
dest[i] = static_cast<char>(ch);
53+
}
54+
55+
return dest;
56+
}
57+
58+
constexpr char* memmove_impl(char* dest, const char* src, std::size_t count)
59+
{
60+
if (dest < src || dest >= src + count)
61+
{
62+
// Non-overlapping or safe to copy forward
63+
for (std::size_t i = 0; i < count; ++i)
64+
{
65+
dest[i] = src[i];
66+
}
67+
}
68+
else
69+
{
70+
// Overlapping, copy backward to avoid overwriting source
71+
for (std::size_t i = count; i > 0; --i)
72+
{
73+
dest[i - 1] = src[i - 1];
74+
}
75+
}
76+
77+
return dest;
78+
}
79+
80+
}
81+
82+
#if !defined(BOOST_DECIMAL_NO_CONSTEVAL_DETECTION)
83+
3884
BOOST_DECIMAL_CONSTEXPR char* memcpy(char* dest, const char* src, std::size_t count)
3985
{
4086
if (BOOST_DECIMAL_IS_CONSTANT_EVALUATED(count))

0 commit comments

Comments
 (0)