CFx SDK Documentation 2024 SP0
Loading...
Searching...
No Matches
tracked_connect.h
Go to the documentation of this file.
1//
2// tracked_connect.h
3// slimsig
4//
5// Created by Christopher Tarquini on 4/22/14.
6//
7//
8
9#ifndef slimsig_tracked_connect_h
10#define slimsig_tracked_connect_h
11#include <memory>
12#include <vector>
13#include <initializer_list>
14#include <algorithm>
15#include <type_traits>
16#include <functional>
17namespace slimsig {
18 template <class T, class Observer, class BaseAllocator = std::allocator<T>>
19 class trackable_allocator : private BaseAllocator {
20 using allocator_traits = std::allocator_traits<BaseAllocator>;
21 using base = BaseAllocator;
22 template<class U>
23 using parent_rebind_traits_t = typename allocator_traits::template rebind_traits<U>;
24 template <class U>
25 using parent_rebind_t = typename parent_rebind_traits_t<U>::allocator_type;
26 public:
27 using typename allocator_traits::value_type;
28 using typename allocator_traits::pointer;
29 using typename allocator_traits::const_pointer;
30 using typename allocator_traits::void_pointer;
31 using typename allocator_traits::const_void_pointer;
32 using typename allocator_traits::difference_type;
33 using typename allocator_traits::size_type;
34 using typename allocator_traits::propagate_on_container_copy_assignment;
35 using typename allocator_traits::propagate_on_container_move_assignment;
36 using typename allocator_traits::propagate_on_container_swap;
37 trackable_allocator() : base() {};
38 template <class U, class O = Observer>
39 trackable_allocator(const trackable_allocator<U, Observer>& other) : base(other), m_observer(other.m_observer) {};
40 using base::allocate;
41 using base::deallocate;
42 using base::construct;
43
44 template <class U>
45 void destroy(U* p) {
46 m_observer(p);
47 allocator_traits::destroy(*this, p);
48 }
49 private:
50 Observer m_observer;
51 };
52 template <class T, class Observer, class Deleter = std::default_delete<T>>
54 constexpr trackable_delete() noexcept = default;
55 template <class U, class OtherObserver = Observer, class OtherDeleter = Deleter, std::enable_if<std::is_convertible<U*, T*>::value, bool> = true>
56 trackable_delete(const trackable_delete<U, OtherObserver, OtherDeleter>& other) : m_observer(other.m_observer), m_deleter(m_deleter) {};
57 trackable_delete(Observer observer = Observer{}, Deleter deleter = Deleter{}) : m_observer(std::move(observer)), m_deleter(std::move(deleter)){};
62 void operator()(T* ptr) const {
63 m_observer(ptr);
64 m_deleter(ptr);
65 }
66 const Deleter& get_deleter() const {
67 return m_deleter;
68 }
69 Deleter& get_deleter() {
70 return m_deleter;
71 }
72 const Observer& get_observer() const {
73 return m_observer;
74 }
75 Observer& get_observer() {
76 return m_observer;
77 }
78 private:
79 Observer m_observer;
80 Deleter m_deleter;
81 };
82
83 template <class T, class Observer, class Deleter = std::default_delete<T>>
84 using trackable_ptr = std::unique_ptr<T, trackable_delete<T, Observer, Deleter>>;
85
86 template <class T, class Observer, class Deleter = std::default_delete<T>, class TrackableDeleter = trackable_delete<T, Observer, Deleter>, class... Args>
87 std::shared_ptr<T> make_trackable(TrackableDeleter deleter, Args&&... args) {
88 return std::shared_ptr<T> ( deleter, T{std::forward<Args>(args)...} );
89 }
90 template <class T, class Observer, class Deleter = std::default_delete<T>, class TrackableDeleter = trackable_delete<T, Observer, Deleter>, class... Args>
91 std::shared_ptr<T> make_trackable(Observer observer, Args&&... args) {
92 return std::shared_ptr<T> ( TrackableDeleter { observer }, T{std::forward<Args>(args)...} );
93 }
94 template <class T, class Observer, class Deleter = std::default_delete<T>, class TrackableDeleter = trackable_delete<T, Observer, Deleter>, class... Args>
95 std::shared_ptr<T> make_trackable(Observer observer, Deleter deleter, Args&&... args) {
96 return std::shared_ptr<T> ( TrackableDeleter { observer, deleter }, T{std::forward<Args>(args)...} );
97 }
98 template <class T, class Observer, class Allocator = std::allocator<T>, class TrackableAllocator = trackable_allocator<T, Observer, Allocator>, class... Args>
99 std::shared_ptr<T> allocate_trackable(TrackableAllocator allocator, Args&&... args) {
100 return std::allocate_shared<T>(allocator, std::forward<Args>(args)...);
101 }
102 template <class T, class Observer, class Allocator = std::allocator<T>, class TrackableAllocator = trackable_allocator<T, Observer, Allocator>, class... Args>
103 std::shared_ptr<T> allocate_trackable(Observer observer, Args&&... args) {
104 return std::allocate_shared<T>(TrackableAllocator {observer}, std::forward<Args>(args)...);
105 }
106 template <class T, class Observer, class Allocator = std::allocator<T>, class TrackableAllocator = trackable_allocator<T, Observer, Allocator>, class... Args>
107 std::shared_ptr<T> allocate_trackable(Observer observer, Allocator allocator, Args&&... args) {
108 return std::allocate_shared<T>(TrackableAllocator {observer, allocator}, std::forward<Args>(args)...);
109 }
110
111
112 template <class T>
114 public:
115 using weak_ptr_type = std::weak_ptr<T>;
116 trackable_lock(std::vector<std::weak_ptr<T>> trackable_objects) : m_tracking(std::move(trackable_objects)) {};
117 trackable_lock(std::initializer_list<std::weak_ptr<T>> trackable_list) : m_tracking{std::move(trackable_list)} {}
118 /*template <class Iterator>
119 weak_ptr(Iterator begin, Iterator end) : m_tracking(begin, end) {}*/
120
121 bool try_lock() {
122 m_locked.reserve(m_tracking.size());
123
124 }
125 private:
126 std::vector<std::weak_ptr<T>> m_tracking;
127 std::vector<std::shared_ptr<T>> m_locked;
128 };
129}
130
131#endif
true
Definition: DimVarDefs.h:2046
trackable_allocator(const trackable_allocator< U, Observer > &other)
trackable_lock(std::vector< std::weak_ptr< T > > trackable_objects)
std::weak_ptr< T > weak_ptr_type
trackable_lock(std::initializer_list< std::weak_ptr< T > > trackable_list)
GLsizei const GLfloat * value
Definition: gles2_ext.h:302
std::shared_ptr< T > make_trackable(TrackableDeleter deleter, Args &&... args)
std::shared_ptr< T > allocate_trackable(TrackableAllocator allocator, Args &&... args)
std::unique_ptr< T, trackable_delete< T, Observer, Deleter > > trackable_ptr
trackable_delete & operator=(const trackable_delete &)=default
void operator()(T *ptr) const
trackable_delete(const trackable_delete &)=default
trackable_delete(Observer observer=Observer{}, Deleter deleter=Deleter{})
trackable_delete(trackable_delete &&)=default
const Observer & get_observer() const
trackable_delete & operator=(trackable_delete &&)=default
constexpr trackable_delete() noexcept=default
const Deleter & get_deleter() const