CodePorting.Translator Cs2Cpp
CodePorting.Translator.Cs2Cpp.Framework
memory_management.h
1
2#pragma once
3
4#include <system/object.h>
5#include <system/smart_ptr.h>
6#include <system/exceptions.h>
7#include <system/iobjects_holder.h>
8#include <system/details/objects_bag.h>
9#include <type_traits>
10
11#include <map>
12#include <list>
13
14namespace CodePorting { namespace Translator { namespace Cs2Cpp {
15
16namespace Details {
17
22
23template <size_t ObjectCount>
24class ObjectsHolder final : public IObjectsHolder
25{
26public:
27 template <typename ...Args, typename = std::enable_if_t<sizeof...(Args) == ObjectCount>>
29 : m_objects{ args... }
30 {
31 }
32
33 ObjectsHolder(const ObjectsHolder&) = delete;
35
37 {
38 for (int n = 1; n < ObjectCount; ++n)
39 {
40 m_objects[n].set_Mode(mode);
41 }
42 }
43
44#if defined(__DBG_TOOLS)
45 std::vector<int> getHoldObjectIds() const final
46 {
47 std::vector<int> res;
48 for (int n = 1; n < ObjectCount; ++n)
49 {
50 res.push_back(System::Details::DbgTools::DBG_InstanceNo(m_objects[n].GetObjectOrNull()));
51 }
52
53 return res;
54 }
55#endif
56
57private:
58 System::SmartPtr<System::Object> m_objects[ObjectCount];
59
60#ifdef ASPOSE_GET_SHARED_MEMBERS
61 void GetSharedMembers(System::Object::shared_members_type& result) const override
62 {
63 System::Object::GetSharedMembers(result);
64 for (auto& object : m_objects)
65 result.Add("m_objects[]", object);
66 }
67#endif
68
69#ifdef __DBG_FOR_EACH_MEMBER
70public:
71 void DBG_for_each_member(System::DBG::for_each_member_visitor &visitor) const override
72 {
73 visitor.add_self(this);
74 System::DBG::for_each_of_Object(this, m_objects, visitor);
75 }
77 const char* DBG_class_name() const override { return "ObjectsHolder<T>"; }
78#endif
79
80 RTTI_INFO_TEMPLATE_CLASS(CodePorting::Translator::Cs2Cpp::Details::ObjectsHolder<ObjectCount>, System::BaseTypesInfo<System::Object>);
81};
82
83} // namespace Details
84
87{
88public:
90 using ObjectsBag = System::Details::ObjectsBag;
91
164 template<typename T1, typename T2>
165 static System::SmartPtr<typename T1::Pointee_> BindLifetime(const T1& target, const T2& owner)
166 {
167 static_assert(System::IsSmartPtr<T1>::value && System::IsSmartPtr<T2>::value, "Trying to bind lifetime for non-pointers");
168 return System::SmartPtr<typename T1::Pointee_>(owner, target.get());
169 }
170
189 template<typename T1, typename T2>
190 static typename std::enable_if<!std::is_reference<T1>::value, System::SmartPtr<typename T1::Pointee_>>::type BindLifetime(T1&& target, const T2& owner)
191 {
192 static_assert(System::IsSmartPtr<T1>::value && System::IsSmartPtr<T2>::value, "Trying to bind lifetime for non-pointers");
193
194 if (target != nullptr && target->SharedCount() == 1)
195 throw System::InvalidOperationException(u"Can not bind lifetime for a temporary target object");
196
197 return System::SmartPtr<typename T1::Pointee_>(owner, target.get());
198 }
199
293 template <typename T, typename... Objects>
294 static System::SmartPtr<typename T::Pointee_> ExtendLifetime(const T& target, const Objects&... objects)
295 {
296 static_assert(System::IsSmartPtr<T>::value, "Trying to bind lifetime for non-pointers");
297
298 System::SmartPtr<System::Object> holder(new Details::ObjectsHolder<1 + sizeof...(objects)>(target, objects...));
299 return System::SmartPtr<typename T::Pointee_>(holder, target.get());
300 }
301
302public:
303 class PostponedHolders;
304private:
305 class PostponedHoldersRegistrar;
306
307public:
324 template <typename T, typename TObject>
326 ExtendLifetimeAsWeakPostponed(const System::SharedPtr<System::Object>& key, const T& target, const TObject& object)
327 {
328 static_assert(System::IsSmartPtr<T>::value, "Trying to bind lifetime for non-pointers");
329
331 new Details::ObjectsHolder<2>(target, object));
332
333 auto* postpone_holder = PostponedHoldersRegistrar::inst().get(key);
334 if (postpone_holder)
335 {
336 postpone_holder->addHolder(holder);
337 }
338
339 return System::SmartPtr<typename T::Pointee_>(holder, target.get());
340 }
341
342private:
344 class PostponedHoldersRegistrar
345 {
346 friend class PostponedHolders;
347
348 template <typename T, typename TObject>
350
351 private:
352 static PostponedHoldersRegistrar & inst()
353 {
354 static PostponedHoldersRegistrar instance;
355 return instance;
356 }
357
359 void reg(void *key, PostponedHolders *holder)
360 {
361 if (m_map_holders.end() != m_map_holders.find(key))
362 {
363 return;
364 }
365
366 m_map_holders.insert({key, holder});
367 }
368
370 void unreg(void *key)
371 {
372 m_map_holders.erase(key);
373 }
374
378 PostponedHolders * get(const System::SharedPtr<System::Object> &key)
379 {
380 auto it = m_map_holders.find(key.get());
381 if (m_map_holders.end() == it)
382 {
383 return nullptr;
384 }
385
386 return it->second;
387 }
388
389 private:
390 using map_holders = std::map<void*, PostponedHolders*>;
391 map_holders m_map_holders;
392 };
393
394public:
397 {
398 template <typename T, typename TObject>
400
401 public:
403 : m_key(key.get())
404 {
405 PostponedHoldersRegistrar::inst().reg(m_key, this);
406 }
407
409 {
410 PostponedHoldersRegistrar::inst().unreg(m_key);
411 }
412
413 public:
416 {
417 for (auto& holder : posponed_weak_holders)
418 {
419 holder->setObjectsMode(System::SmartPtrMode::Shared);
420 }
421 posponed_weak_holders.clear();
422 }
423
424 private:
426 void addHolder(System::SharedPtr<Details::IObjectsHolder> &holder)
427 {
428 holder->setObjectsMode(System::SmartPtrMode::Weak);
429 posponed_weak_holders.push_back(holder);
430 }
431
432 private:
433 std::list<System::SharedPtr<Details::IObjectsHolder>> posponed_weak_holders;
434 void* m_key;
435 };
436};
437
438}}} // namespace CodePorting::Translator::Cs2Cpp
Base class for ObjectsHolder. Need for control ObjectHolder pointer's mode. See PostponedHolders clas...
Definition: iobjects_holder.h:17
Used to hold multiple objects. Objects of this class should only be allocated using System::MakeObjec...
Definition: memory_management.h:25
ObjectsHolder & operator=(const ObjectsHolder &)=delete
ObjectsHolder(const System::SmartPtr< Args > &...args)
Definition: memory_management.h:28
void setObjectsMode(System::SmartPtrMode mode) final
Change object holders smart pointers modes. mode - Smart pointer mode.
Definition: memory_management.h:36
Keeps ObjectHolder's in Weak state and after the switch, it to Shared remove it from a local collecti...
Definition: memory_management.h:397
void switchToShared()
Switch ObjectsHolder pointer's collection to Shared mode and clean postponed holders list.
Definition: memory_management.h:415
PostponedHolders(const System::SharedPtr< System::Object > &key)
Definition: memory_management.h:402
Defines a methods that changes the lifetime of objects.
Definition: memory_management.h:87
System::Details::ObjectsBag ObjectsBag
Highly optimized container designed to extend objects lifetime.
Definition: memory_management.h:90
static std::enable_if<!std::is_reference< T1 >::value, System::SmartPtr< typenameT1::Pointee_ > >::type BindLifetime(T1 &&target, const T2 &owner)
Creates a smart pointer using the aliasing constructor. Creates a pointer to the target object which ...
Definition: memory_management.h:190
static System::SmartPtr< typename T::Pointee_ > ExtendLifetime(const T &target, const Objects &... objects)
Creates a smart pointer using the aliasing constructor and copies target and objects pointers to the ...
Definition: memory_management.h:294
static System::SmartPtr< typename T::Pointee_ > ExtendLifetimeAsWeakPostponed(const System::SharedPtr< System::Object > &key, const T &target, const TObject &object)
Creates a smart pointer using the aliasing constructor and copies target and objects pointers to the ...
Definition: memory_management.h:326
static System::SmartPtr< typename T1::Pointee_ > BindLifetime(const T1 &target, const T2 &owner)
Creates a smart pointer using the aliasing constructor. Creates a pointer to the target object which ...
Definition: memory_management.h:165
Pointer class to wrap types being allocated on heap. Use it to manage memory for classes inheriting O...
Definition: smart_ptr.h:180
void set_Mode(SmartPtrMode mode)
Sets pointer mode. May alter referenced object's reference counts.
Definition: smart_ptr.h:664
Pointee_ * get() const
Gets pointed object.
Definition: smart_ptr.h:518
Definition: iobjects_holder.h:10
SmartPtrMode
SmartPtr pointer type: weak or shared. Defines whether pointer is being counted when it is being deci...
Definition: smart_ptr.h:68
@ Weak
Weak mode: pointer does not participate in reference counting.
@ Shared
Shared mode: pointer participates in reference counting.
Trait class to check if a type is a specialization of SmartPtr class.
Definition: smart_ptr.h:1499