summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-07-19 11:42:49 +0100
committerAmlal El Mahrouss <amlal@nekernel.org>2025-07-19 11:42:49 +0100
commit701789c70a006d349741ce97494b867b2e22c530 (patch)
tree96ff19ff3e98117b0934ce3ad1b912ec2cd5e04c
parent0b293838b939e0288670893db281cbe4917141c9 (diff)
feat: better 'tracked_ptr' module, and added 'eval_true' and 'eval_false' to 'opt.hpp'
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
-rw-r--r--examples/tracked_ptr/tracked_ptr.cc34
-rw-r--r--lib/logic/opt.hpp9
-rw-r--r--lib/memory/tracked_ptr.hpp17
3 files changed, 53 insertions, 7 deletions
diff --git a/examples/tracked_ptr/tracked_ptr.cc b/examples/tracked_ptr/tracked_ptr.cc
index e77155d..c182494 100644
--- a/examples/tracked_ptr/tracked_ptr.cc
+++ b/examples/tracked_ptr/tracked_ptr.cc
@@ -1,4 +1,4 @@
-/*
+/*
tracked_ptr example
written by Amlal El Mahrouss.
licensed under the MIT license
@@ -7,24 +7,46 @@
#include <lib/memory/tracked_ptr.hpp>
#include <iostream>
-void foo()
+void summon_tracked_ptr()
{
snu::memory::tracked_ptr<int> ptr = snu::memory::make_tracked(42);
std::cout << ptr.data() << "=" << ptr.manager().allocator().allocated_count_ << std::endl;
}
+void summon_leak_tracked_ptr()
+{
+ snu::memory::tracked_ptr<int>* ptr = new snu::memory::tracked_ptr<int>(42);
+ std::cout << ptr->data() << "=" << ptr->manager().allocator().allocated_count_ << std::endl;
+}
+
/* finally test it */
int main(int argc, char** argv)
{
- foo();
- foo();
- foo();
- foo();
+ summon_tracked_ptr();
+ summon_tracked_ptr();
+ summon_tracked_ptr();
+ summon_tracked_ptr();
snu::memory::tracked_ptr<int> ptr;
std::cout << ptr.data() << "=" << ptr.manager().allocator().allocated_count_ << std::endl;
+
std::cout << "total=" << ptr.manager().allocator().deallocated_count_ << std::endl;
+ std::cout << "leak-detected=" << std::boolalpha << (ptr.manager().allocator().allocated_count_ > ptr.manager().allocator().deallocated_count_) << std::endl;
+
+ summon_leak_tracked_ptr();
+ summon_leak_tracked_ptr();
+ summon_leak_tracked_ptr();
+ summon_leak_tracked_ptr();
+ summon_leak_tracked_ptr();
+ summon_leak_tracked_ptr();
+ summon_leak_tracked_ptr();
+ summon_leak_tracked_ptr();
+
+ std::cout << "total=" << ptr.manager().allocator().deallocated_count_ << std::endl;
+
+ std::cout << "leak-detected=" << std::boolalpha << (ptr.manager().allocator().allocated_count_ > ptr.manager().allocator().deallocated_count_) << std::endl;
+
return 0;
}
diff --git a/lib/logic/opt.hpp b/lib/logic/opt.hpp
index d2a9150..facbf2c 100644
--- a/lib/logic/opt.hpp
+++ b/lib/logic/opt.hpp
@@ -107,6 +107,15 @@ namespace snu::opt
return greater_than(std::forward<Lst>(arg)...) ? return_type::okay : return_type::err;
}
+ inline return_type eval_true()
+ {
+ return return_type::okay;
+ }
+
+ inline return_type eval_false()
+ {
+ return return_type::err;
+ }
} // namespace snu::opt
#endif /* ifndef _SNU_OPT_HPP */
diff --git a/lib/memory/tracked_ptr.hpp b/lib/memory/tracked_ptr.hpp
index 36b75b2..ec19151 100644
--- a/lib/memory/tracked_ptr.hpp
+++ b/lib/memory/tracked_ptr.hpp
@@ -107,13 +107,22 @@ namespace snu::memory
~tracked_ptr() noexcept
{
- tracked_ptr::manager().dispose(ptr_);
+ this->reset();
}
tracked_ptr(const tracked_ptr&) = delete;
tracked_ptr& operator=(const tracked_ptr&) = delete;
public:
+ void reset()
+ {
+ if (ptr_)
+ {
+ tracked_ptr::manager().dispose(ptr_);
+ ptr_ = nullptr;
+ }
+ }
+
T* get() const
{
return ptr_;
@@ -177,4 +186,10 @@ namespace snu::memory
inline auto make_tracked(T&&... arg) -> tracked_ptr<U> {
return tracked_ptr<U>(std::forward<T>(arg)...);
}
+
+ template <typename T>
+ inline void swap(tracked_ptr<T>& a, tracked_ptr<T>& b)
+ {
+ a.swap(b);
+ }
} // namespace snu::memory \ No newline at end of file