2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://floralicense.org/license/
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FUiEffects_RendererSystemSmartPtr.h
20 * @brief The SmartPtr template
24 #ifndef _FUI_EFFECTS_INTERNAL_RENDERER_SYSTEM_SMARTPTR_H_
25 #define _FUI_EFFECTS_INTERNAL_RENDERER_SYSTEM_SMARTPTR_H_
27 #include <renderer/system/FUiEffects_RendererSystemSmartPtrRefCountedMTPolicy.h>
28 #include <renderer/system/FUiEffects_RendererSystemSmartPtrAssertCheckPolicy.h>
29 #include <renderer/system/FUiEffects_RendererSystemConstnessPolicy.h>
30 #include <renderer/system/FUiEffects_RendererSystemSmartPtrDefaultStoragePolicy.h>
32 namespace Tizen { namespace Ui { namespace Effects { namespace _Renderer { namespace System
38 template <typename> class OwnershipPolicy = SmartPtrRefCountedMtPolicy,
39 template <typename> class CheckingPolicy = SmartPtrAssertCheckPolicy,
40 template <typename> class StoragePolicy = SmartPtrDefaultStoragePolicy,
41 template <typename> class ConstnessPolicy = ConstnessPolicyDontConst
48 template <typename> class OwnershipPolicy,
49 template <typename> class CheckingPolicy,
50 template <typename> class StoragePolicy,
51 template <typename> class ConstnessPolicy
54 public CheckingPolicy<typename StoragePolicy<ValueType>::StoredType>,
55 public StoragePolicy<ValueType>,
56 public OwnershipPolicy<typename StoragePolicy<ValueType>::InitPointerType>
59 typedef OwnershipPolicy<typename StoragePolicy<ValueType>::InitPointerType> OwnershipPolicyType;
60 typedef CheckingPolicy<typename StoragePolicy<ValueType>::StoredType> CheckingPolicyType;
61 typedef StoragePolicy<ValueType> StoragePolicyType;
62 typedef ConstnessPolicy<ValueType> ConstnessPolicyType;
64 typedef typename StoragePolicyType::PointerType PointerType;
65 typedef typename StoragePolicyType::StoredType StoredType;
66 typedef typename StoragePolicyType::ReferenceType ReferenceType;
68 typedef typename ConstnessPolicyType::Type* ConstPointerType;
69 typedef typename ConstnessPolicyType::Type& ConstReferenceType;
73 /// constructor by an objects pointer
74 /// \param value an objects pointer
75 explicit SmartPtr(ValueType* pValue);
77 /// constructor by a SmartPtr
78 /// \param aSmartPtr an another SmartPtr
79 SmartPtr(const SmartPtr& smartPtr);
81 /// constructor by an another type of SmartPtr
82 /// \param aSmartPtr an another SmartPtr
86 template <typename> class OwnershipPolicy2,
87 template <typename> class CheckingPolicy2,
88 template <typename> class StoragePolicy2,
89 template <typename> class ConstnessPolicy2
91 SmartPtr(const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr);
93 SmartPtr& operator = (const SmartPtr& smartPtr);
98 template <typename> class OwnershipPolicy2,
99 template <typename> class CheckingPolicy2,
100 template <typename> class StoragePolicy2,
101 template <typename> class ConstnessPolicy2
103 SmartPtr& operator = (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr);
105 virtual ~SmartPtr(void);
107 void Swap(SmartPtr& smartPtr);
109 PointerType operator -> (void);
111 ConstPointerType operator -> (void) const;
113 ReferenceType operator * (void);
115 ConstReferenceType operator * (void) const;
117 operator bool(void) const;
119 bool operator ! (void) const;
124 template <typename> class OwnershipPolicy2,
125 template <typename> class CheckingPolicy2,
126 template <typename> class StoragePolicy2,
127 template <typename> class ConstnessPolicy2
129 bool operator == (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const;
134 template <typename> class OwnershipPolicy2,
135 template <typename> class CheckingPolicy2,
136 template <typename> class StoragePolicy2,
137 template <typename> class ConstnessPolicy2
139 bool operator != (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const;
144 template <typename> class OwnershipPolicy2,
145 template <typename> class CheckingPolicy2,
146 template <typename> class StoragePolicy2,
147 template <typename> class ConstnessPolicy2
149 bool operator < (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const;
154 template <typename> class OwnershipPolicy2,
155 template <typename> class CheckingPolicy2,
156 template <typename> class StoragePolicy2,
157 template <typename> class ConstnessPolicy2
159 bool operator > (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const;
164 template <typename> class OwnershipPolicy2,
165 template <typename> class CheckingPolicy2,
166 template <typename> class StoragePolicy2,
167 template <typename> class ConstnessPolicy2
169 bool operator <= (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const;
174 template <typename> class OwnershipPolicy2,
175 template <typename> class CheckingPolicy2,
176 template <typename> class StoragePolicy2,
177 template <typename> class ConstnessPolicy2
179 bool operator >= (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const;
181 template <typename DestinationValue>
182 SmartPtr<DestinationValue, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy> staticCast(void) const;
187 template <typename> class OwnershipPolicy2,
188 template <typename> class CheckingPolicy2,
189 template <typename> class StoragePolicy2,
190 template <typename> class ConstnessPolicy2
192 friend void Reset(SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr);
197 template <typename> class OwnershipPolicy2,
198 template <typename> class CheckingPolicy2,
199 template <typename> class StoragePolicy2,
200 template <typename> class ConstnessPolicy2
202 friend class SmartPtr;
207 template <typename> class OwnershipPolicy2,
208 template <typename> class CheckingPolicy2,
209 template <typename> class StoragePolicy2,
210 template <typename> class ConstnessPolicy2
212 friend class WeakPtr;
215 SmartPtr(const CheckingPolicyType& checkingPolicyType, const StoragePolicyType& storagePolicyType, const OwnershipPolicyType& ownershipPolicyType);
222 template <typename> class OwnershipPolicy,
223 template <typename> class CheckingPolicy,
224 template <typename> class StoragePolicy,
225 template <typename> class ConstnessPolicy
227 void Reset(SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>& smartPtr);
232 template <typename> class OwnershipPolicy,
233 template <typename> class CheckingPolicy,
234 template <typename> class StoragePolicy,
235 template <typename> class ConstnessPolicy
237 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::SmartPtr(void)
239 result r = GetLastResult();
240 SysTryReturnVoidResult(NID_UI_EFFECT, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
242 CheckingPolicyType::OnDefault(GetImpl(*this));
248 template <typename> class OwnershipPolicy,
249 template <typename> class CheckingPolicy,
250 template <typename> class StoragePolicy,
251 template <typename> class ConstnessPolicy
253 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::SmartPtr(ValueType* pValue) :
254 StoragePolicyType(pValue)
256 result r = GetLastResult();
257 SysTryReturnVoidResult(NID_UI_EFFECT, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
259 CheckingPolicyType::OnInit(GetImpl(*this));
265 template <typename> class OwnershipPolicy,
266 template <typename> class CheckingPolicy,
267 template <typename> class StoragePolicy,
268 template <typename> class ConstnessPolicy
270 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::SmartPtr(const SmartPtr& smartPtr) :
271 CheckingPolicyType(smartPtr),
272 StoragePolicyType(smartPtr),
273 OwnershipPolicyType(smartPtr)
275 GetImplRef(*this) = OwnershipPolicyType::Clone(GetImplRef(smartPtr));
281 template <typename> class OwnershipPolicy,
282 template <typename> class CheckingPolicy,
283 template <typename> class StoragePolicy,
284 template <typename> class ConstnessPolicy
289 template <typename> class OwnershipPolicy2,
290 template <typename> class CheckingPolicy2,
291 template <typename> class StoragePolicy2,
292 template <typename> class ConstnessPolicy2
294 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::SmartPtr(
295 const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) :
296 CheckingPolicyType(smartPtr),
297 StoragePolicyType(smartPtr),
298 OwnershipPolicyType(smartPtr)
300 GetImplRef(*this) = OwnershipPolicyType::Clone(GetImplRef(smartPtr));
306 template <typename> class OwnershipPolicy,
307 template <typename> class CheckingPolicy,
308 template <typename> class StoragePolicy,
309 template <typename> class ConstnessPolicy
311 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>&
312 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator = (const SmartPtr& smartPtr)
314 if (this != &smartPtr)
316 SmartPtr temp(smartPtr);
325 template <typename> class OwnershipPolicy,
326 template <typename> class CheckingPolicy,
327 template <typename> class StoragePolicy,
328 template <typename> class ConstnessPolicy
333 template <typename> class OwnershipPolicy2,
334 template <typename> class CheckingPolicy2,
335 template <typename> class StoragePolicy2,
336 template <typename> class ConstnessPolicy2
338 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>& SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator =
339 (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr)
341 SmartPtr temp(smartPtr);
349 template <typename> class OwnershipPolicy,
350 template <typename> class CheckingPolicy,
351 template <typename> class StoragePolicy,
352 template <typename> class ConstnessPolicy
354 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::~SmartPtr(void)
356 if (OwnershipPolicyType::Release(GetImpl(*static_cast<StoragePolicyType*>(this))))
358 StoragePolicyType::Destroy();
365 template <typename> class OwnershipPolicy,
366 template <typename> class CheckingPolicy,
367 template <typename> class StoragePolicy,
368 template <typename> class ConstnessPolicy
370 void SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::Swap(SmartPtr& smartPtr)
372 CheckingPolicyType::Swap(smartPtr);
373 OwnershipPolicyType::Swap(smartPtr);
374 StoragePolicyType::Swap(smartPtr);
380 template <typename> class OwnershipPolicy,
381 template <typename> class CheckingPolicy,
382 template <typename> class StoragePolicy,
383 template <typename> class ConstnessPolicy
385 typename SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::PointerType
386 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator -> (void)
388 CheckingPolicyType::OnDereference(GetImplRef(*this));
389 return StoragePolicyType::operator->();
395 template <typename> class OwnershipPolicy,
396 template <typename> class CheckingPolicy,
397 template <typename> class StoragePolicy,
398 template <typename> class ConstnessPolicy
400 typename SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::ConstPointerType
401 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator -> (void) const
403 CheckingPolicyType::OnDereference(GetImplRef(*this));
404 return StoragePolicyType::operator->();
410 template <typename> class OwnershipPolicy,
411 template <typename> class CheckingPolicy,
412 template <typename> class StoragePolicy,
413 template <typename> class ConstnessPolicy
415 typename SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::ReferenceType
416 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator * (void)
418 CheckingPolicyType::OnDereference(GetImplRef(*this));
419 return StoragePolicyType::operator*();
425 template <typename> class OwnershipPolicy,
426 template <typename> class CheckingPolicy,
427 template <typename> class StoragePolicy,
428 template <typename> class ConstnessPolicy
430 typename SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::ConstReferenceType
431 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator * (void) const
433 CheckingPolicyType::OnDereference(GetImplRef(*this));
434 return StoragePolicyType::operator*();
440 template <typename> class OwnershipPolicy,
441 template <typename> class CheckingPolicy,
442 template <typename> class StoragePolicy,
443 template <typename> class ConstnessPolicy
445 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator bool(void) const
447 if (GetImpl(*this) != null)
457 template <typename> class OwnershipPolicy,
458 template <typename> class CheckingPolicy,
459 template <typename> class StoragePolicy,
460 template <typename> class ConstnessPolicy
462 bool SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator ! (void) const
464 return GetImpl(*this) == null;
470 template <typename> class OwnershipPolicy,
471 template <typename> class CheckingPolicy,
472 template <typename> class StoragePolicy,
473 template <typename> class ConstnessPolicy
478 template <typename> class OwnershipPolicy2,
479 template <typename> class CheckingPolicy2,
480 template <typename> class StoragePolicy2,
481 template <typename> class ConstnessPolicy2
483 bool SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator ==
484 (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const
486 return GetImpl(*this) == GetImpl(smartPtr);
492 template <typename> class OwnershipPolicy,
493 template <typename> class CheckingPolicy,
494 template <typename> class StoragePolicy,
495 template <typename> class ConstnessPolicy
500 template <typename> class OwnershipPolicy2,
501 template <typename> class CheckingPolicy2,
502 template <typename> class StoragePolicy2,
503 template <typename> class ConstnessPolicy2
505 bool SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator !=
506 (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const
508 return GetImpl(*this) != GetImpl(smartPtr);
514 template <typename> class OwnershipPolicy,
515 template <typename> class CheckingPolicy,
516 template <typename> class StoragePolicy,
517 template <typename> class ConstnessPolicy
522 template <typename> class OwnershipPolicy2,
523 template <typename> class CheckingPolicy2,
524 template <typename> class StoragePolicy2,
525 template <typename> class ConstnessPolicy2
527 bool SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator <
528 (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const
530 return GetImpl(*this) < GetImpl(smartPtr);
536 template <typename> class OwnershipPolicy,
537 template <typename> class CheckingPolicy,
538 template <typename> class StoragePolicy,
539 template <typename> class ConstnessPolicy
544 template <typename> class OwnershipPolicy2,
545 template <typename> class CheckingPolicy2,
546 template <typename> class StoragePolicy2,
547 template <typename> class ConstnessPolicy2
549 bool SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator >
550 (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const
552 return GetImpl(*this) > GetImpl(smartPtr);
558 template <typename> class OwnershipPolicy,
559 template <typename> class CheckingPolicy,
560 template <typename> class StoragePolicy,
561 template <typename> class ConstnessPolicy
566 template <typename> class OwnershipPolicy2,
567 template <typename> class CheckingPolicy2,
568 template <typename> class StoragePolicy2,
569 template <typename> class ConstnessPolicy2
571 bool SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator <=
572 (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const
574 return GetImpl(*this) <= GetImpl(smartPtr);
580 template <typename> class OwnershipPolicy,
581 template <typename> class CheckingPolicy,
582 template <typename> class StoragePolicy,
583 template <typename> class ConstnessPolicy
588 template <typename> class OwnershipPolicy2,
589 template <typename> class CheckingPolicy2,
590 template <typename> class StoragePolicy2,
591 template <typename> class ConstnessPolicy2
593 bool SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator >=
594 (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const
596 return GetImpl(*this) >= GetImpl(smartPtr);
602 template <typename> class OwnershipPolicy,
603 template <typename> class CheckingPolicy,
604 template <typename> class StoragePolicy,
605 template <typename> class ConstnessPolicy
607 template <typename DestinationValue>
608 SmartPtr<DestinationValue, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>
609 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::staticCast(void) const
611 SmartPtr<DestinationValue, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy> result(*this, *this, *this);
612 GetImplRef(result) = static_cast<DestinationValue*>(GetImpl(*this));
620 template <typename> class OwnershipPolicy,
621 template <typename> class CheckingPolicy,
622 template <typename> class StoragePolicy,
623 template <typename> class ConstnessPolicy
625 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::
626 SmartPtr(const CheckingPolicyType& checkingPolicyType, const StoragePolicyType& storagePolicyType, const OwnershipPolicyType& ownershipPolicyType) :
627 CheckingPolicyType(checkingPolicyType),
628 StoragePolicyType(storagePolicyType),
629 OwnershipPolicyType(ownershipPolicyType)
631 GetImplRef(*this) = OwnershipPolicyType::Clone(GetImplRef(storagePolicyType));
637 template <typename> class OwnershipPolicy,
638 template <typename> class CheckingPolicy,
639 template <typename> class StoragePolicy,
640 template <typename> class ConstnessPolicy
642 void Reset(SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>& smartPtr)
644 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy> temp;
648 // Common types definitions
649 typedef SmartPtr<float> FloatPtr;
651 }}}}} //Tizen::Ui::Effects::_Renderer::System
654 #endif //_FUI_EFFECTS_INTERNAL_RENDERER_SYSTEM_SMARTPTR_H_