8#if defined(__cpp_lib_ranges)
17inline const char *
dupCStr(
const char *cstr, [[maybe_unused]]
size_t len) {
18 if (cstr ==
nullptr) [[unlikely]] {
24 return strndup(cstr, len);
28inline const char *
dupStr(std::string_view sv) {
29 if (sv.empty()) [[unlikely]] {
33 std::string tmpStr{sv};
34 return dupCStr(tmpStr.c_str(), tmpStr.size());
36 return dupCStr(sv.data(), sv.size());
41template<MemcpyableT T>
42void memcpyX(
const T *src, T *dst,
size_t count) {
43 if (src ==
nullptr || dst ==
nullptr || count == 0) [[unlikely]] {
46 std::memcpy(dst, src, count *
sizeof(T));
52 const auto len = count *
sizeof(T) + 1;
54 auto ptr = std::malloc(len);
55 if (ptr ==
nullptr) [[unlikely]] {
58 std::memset(ptr, 0, len);
59 return static_cast<T *
>(ptr);
66 auto allocCount = count;
67 if constexpr (std::is_pointer_v<T>) {
68 allocCount = count + 1;
71 auto ptr = std::calloc(allocCount,
sizeof(T));
72 if (ptr ==
nullptr) [[unlikely]] {
75 return static_cast<T *
>(ptr);
82 if (ptr ==
nullptr) [[unlikely]] {
86 std::free(
static_cast<RawPtr
>(ptr));
94 if (ptr ==
nullptr) [[unlikely]] {
106 if (ptr ==
nullptr) [[unlikely]] {
110 std::free(
const_cast<void *
>(
static_cast<const void *
>(ptr)));
118 if (ptr ==
nullptr) [[unlikely]] {
122 std::free(
const_cast<void *
>(ptr));
126template<InRangeT Src, OutRangeT Dst>
127requires std::indirectly_writable<
128 std::ranges::iterator_t<Dst>,
129 std::ranges::range_reference_t<Src>
132 if (len == 0) [[unlikely]] {
135 len = std::min({len, src.size()});
137#if defined(__cpp_lib_ranges)
138 std::ranges::copy(src | std::views::take(len), dst.begin());
140 std::copy_n(src.begin(), len, dst.begin());
162 void*
operator new(std::size_t) =
delete;
163 void*
operator new[](std::size_t) =
delete;
164 void operator delete(
void*)
noexcept =
delete;
165 void operator delete[](
void*)
noexcept =
delete;
177 void*
operator new(size_t) =
delete;
178 void*
operator new[](size_t) =
delete;
179 void operator delete(
void*) =
delete;
180 void operator delete[](
void*) =
delete;
195template <
typename Derived>
203 template<
typename... Args>
205 return std::make_unique<Derived>(
Token{}, std::forward<Args>(args)...);
208 template<
typename... Args>
210 return std::make_shared<Derived>(
Token{}, std::forward<Args>(args)...);
#define DYNXX_NO_UNIQUE_ADDRESS
Definition Macro.hxx:22
void freeX(T *&ptr)
Definition Memory.hxx:81
const char * dupStr(std::string_view sv)
Definition Memory.hxx:28
void memcpyX(const T *src, T *dst, size_t count)
Definition Memory.hxx:42
T * mallocX(size_t count=1)
Definition Memory.hxx:51
std::unique_ptr< void, FreeDeleter > AutoFreePtr
Definition Memory.hxx:151
void copyRange(const Src &src, Dst &dst, size_t len)
Definition Memory.hxx:131
const char * dupCStr(const char *cstr, size_t len)
Definition Memory.hxx:17
std::optional< const char * > nullTerminatedCStr(std::string_view str)
Definition Types.hxx:320
Definition Memory.hxx:183
virtual ~DynXXHeapOnly()=default
DynXXHeapOnly(DynXXHeapOnly &&other)=delete
DynXXHeapOnly & operator=(DynXXHeapOnly &&other)=delete
DynXXHeapOnly(const DynXXHeapOnly &other)=delete
DynXXHeapOnly & operator=(const DynXXHeapOnly &other)=delete
Definition Memory.hxx:196
static std::shared_ptr< Derived > makeShared(Args &&... args)
Definition Memory.hxx:209
DynXXSmartHeapOnly(const DynXXSmartHeapOnly &)=delete
DynXXSmartHeapOnly & operator=(const DynXXSmartHeapOnly &)=delete
DynXXSmartHeapOnly(DynXXSmartHeapOnly &&)=delete
DynXXSmartHeapOnly & operator=(DynXXSmartHeapOnly &&)=delete
static std::shared_ptr< Derived > makeUnique(Args &&... args)
Definition Memory.hxx:204
DynXXSmartHeapOnly(Token token)
Definition Memory.hxx:217
Definition Memory.hxx:169
virtual ~DynXXStackOnly()=delete
DynXXStackOnly & operator=(DynXXStackOnly &&other) noexcept=default
DynXXStackOnly(const DynXXStackOnly &other)=default
DynXXStackOnly(DynXXStackOnly &&other) noexcept=default
DynXXStackOnly & operator=(const DynXXStackOnly &other)=default
Definition Memory.hxx:155
DynXXStaticOnly & operator=(DynXXStaticOnly &&other)=delete
DynXXStaticOnly(DynXXStaticOnly &&other)=delete
DynXXStaticOnly(const DynXXStaticOnly &other)=delete
~DynXXStaticOnly()=delete
DynXXStaticOnly & operator=(const DynXXStaticOnly &other)=delete
Definition Memory.hxx:214
Definition Memory.hxx:146
void operator()(RawPtr p) const noexcept
Definition Memory.hxx:147