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 std::memcpy(dst, src, count *
sizeof(T));
49 const auto len = count *
sizeof(T) + 1;
51 auto ptr = std::malloc(len);
52 if (ptr ==
nullptr) [[unlikely]] {
55 std::memset(ptr, 0, len);
56 return static_cast<T *
>(ptr);
63 auto allocCount = count;
64 if constexpr (std::is_pointer_v<T>) {
65 allocCount = count + 1;
68 auto ptr = std::calloc(allocCount,
sizeof(T));
69 if (ptr ==
nullptr) [[unlikely]] {
72 return static_cast<T *
>(ptr);
79 if (ptr ==
nullptr) [[unlikely]] {
83 std::free(
static_cast<RawPtr
>(ptr));
91 if (ptr ==
nullptr) [[unlikely]] {
103 if (ptr ==
nullptr) [[unlikely]] {
107 std::free(
const_cast<void *
>(
static_cast<const void *
>(ptr)));
115 if (ptr ==
nullptr) [[unlikely]] {
119 std::free(
const_cast<void *
>(ptr));
123template<InRangeT Src, OutRangeT Dst>
124requires std::indirectly_writable<
125 std::ranges::iterator_t<Dst>,
126 std::ranges::range_reference_t<Src>
129 if (len == 0) [[unlikely]] {
132 len = std::min({len, src.size()});
134#if defined(__cpp_lib_ranges)
135 std::ranges::copy(src | std::views::take(len), dst.begin());
137 std::copy_n(src.begin(), len, dst.begin());
159 void*
operator new(std::size_t) =
delete;
160 void*
operator new[](std::size_t) =
delete;
161 void operator delete(
void*)
noexcept =
delete;
162 void operator delete[](
void*)
noexcept =
delete;
174 void*
operator new(size_t) =
delete;
175 void*
operator new[](size_t) =
delete;
176 void operator delete(
void*) =
delete;
177 void operator delete[](
void*) =
delete;
192template <
typename Derived>
200 template<
typename... Args>
202 return std::make_unique<Derived>(
Token{}, std::forward<Args>(args)...);
205 template<
typename... Args>
207 return std::make_shared<Derived>(
Token{}, std::forward<Args>(args)...);
#define NO_UNIQUE_ADDRESS
Definition Macro.hxx:22
void freeX(T *&ptr)
Definition Memory.hxx:78
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:48
std::unique_ptr< void, FreeDeleter > AutoFreePtr
Definition Memory.hxx:148
void copyRange(const Src &src, Dst &dst, size_t len)
Definition Memory.hxx:128
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:180
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:193
static std::shared_ptr< Derived > makeShared(Args &&... args)
Definition Memory.hxx:206
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:201
DynXXSmartHeapOnly(Token token)
Definition Memory.hxx:214
Definition Memory.hxx:166
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:152
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:211
Definition Memory.hxx:143
void operator()(RawPtr p) const noexcept
Definition Memory.hxx:144