diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-09-04 11:25:04 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-04 11:25:04 +0200 |
| commit | 6789dd7d88a192e3f55b95798cb393e7d12f368a (patch) | |
| tree | 7f04815ad5214f97d0fb2becceceed7ce8089b3d /dev/lib/memory | |
| parent | 443588a42fe9cf48b5f63184b94afe483cb0e761 (diff) | |
| parent | fda7082c54ad46a56ac885d4686b82bad8dbc7c9 (diff) | |
Merge pull request #4 from amlel-el-mahrouss/devv1.0.43
OCL — v1.0.43
Diffstat (limited to 'dev/lib/memory')
| -rw-r--r-- | dev/lib/memory/tracked_ptr.hpp | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/dev/lib/memory/tracked_ptr.hpp b/dev/lib/memory/tracked_ptr.hpp index c767b67..d2f8450 100644 --- a/dev/lib/memory/tracked_ptr.hpp +++ b/dev/lib/memory/tracked_ptr.hpp @@ -1,22 +1,22 @@ /* * File: memory/tracked_ptr.hpp * Purpose: Custom smart pointer implementation in C++ - * Author: Amlal El Mahrouss (founder@snu.systems) - * Copyright 2025, Amlal El Mahrouss and SNU Systems Corp. + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss */ #pragma once #include <cstddef> #include <utility> -#include <memory> +#include <new> #include <atomic> #include <sys/types.h> #include <unistd.h> #include <signal.h> -namespace snu::memory +namespace ocl::memory { template <typename T> class tracked_allocator; @@ -45,19 +45,24 @@ namespace snu::memory template <typename... U> void retain(T*& ptr, U&&... args) { - ptr = new T(args...); + ptr = new T(std::forward<U>(args)...); if (ptr) { ++allocated_count_; + return; } - else - { - throw std::bad_alloc(); - } + + throw std::bad_alloc(); + } + + template <typename... U> + void must_retain(T*& ptr, U&&... args) noexcept + { + this->retain(ptr, args...); } - void dispose(T*& ptr) + void dispose(T*& ptr) noexcept { if (ptr) { @@ -96,10 +101,17 @@ namespace snu::memory { T* ptr = nullptr; allocator_.retain(ptr, std::forward<U>(args)...); + return ptr; } - void dispose(T*& ptr) + template <typename... U> + T* must_retain(U&&... args) noexcept + { + return this->retain(std::forward<U>(args)...); + } + + void dispose(T*& ptr) noexcept { allocator_.dispose(ptr); } @@ -128,7 +140,7 @@ namespace snu::memory this->reset(); } - tracked_ptr(const tracked_ptr&) = delete; + tracked_ptr(const tracked_ptr&) = delete; tracked_ptr& operator=(const tracked_ptr&) = delete; public: @@ -190,13 +202,13 @@ namespace snu::memory } private: - T* ptr_ = nullptr; + T* ptr_{nullptr}; }; template <typename T> - inline auto make_tracked(T arg) -> tracked_ptr<T> + inline auto make_tracked() -> tracked_ptr<T> { - return tracked_ptr<T>(std::forward<T>(arg)); + return tracked_ptr<T>(); } template <typename U, typename... T> @@ -220,4 +232,4 @@ namespace snu::memory ::kill(::getpid(), SIGTRAP); } } -} // namespace snu::memory
\ No newline at end of file +} // namespace ocl::memory |
