Tizen 2.1 base
[framework/osp/uifw.git] / src / ui / effects / inc / renderer / system / FUiEffects_RendererSystemSmartPtr.h
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 //     http://floralicense.org/license/
10 //
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.
16 //
17
18 /**
19  * @file       FUiEffects_RendererSystemSmartPtr.h
20  * @brief      The SmartPtr template
21  *
22  */
23
24 #ifndef _FUI_EFFECTS_INTERNAL_RENDERER_SYSTEM_SMARTPTR_H_
25 #define _FUI_EFFECTS_INTERNAL_RENDERER_SYSTEM_SMARTPTR_H_
26
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>
31
32 namespace Tizen { namespace Ui { namespace Effects { namespace _Renderer { namespace System
33 {
34
35 template
36 <
37         typename ValueType,
38         template <typename> class OwnershipPolicy = SmartPtrRefCountedMtPolicy,
39         template <typename> class CheckingPolicy = SmartPtrAssertCheckPolicy,
40         template <typename> class StoragePolicy = SmartPtrDefaultStoragePolicy,
41         template <typename> class ConstnessPolicy = ConstnessPolicyDontConst
42 >
43 class SmartPtr;
44
45 template
46 <
47         typename ValueType,
48         template <typename> class OwnershipPolicy,
49         template <typename> class CheckingPolicy,
50         template <typename> class StoragePolicy,
51         template <typename> class ConstnessPolicy
52 >
53 class SmartPtr :
54         public CheckingPolicy<typename StoragePolicy<ValueType>::StoredType>,
55         public StoragePolicy<ValueType>,
56         public OwnershipPolicy<typename StoragePolicy<ValueType>::InitPointerType>
57 {
58 public:
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;
63
64         typedef typename StoragePolicyType::PointerType PointerType;
65         typedef typename StoragePolicyType::StoredType StoredType;
66         typedef typename StoragePolicyType::ReferenceType ReferenceType;
67
68         typedef typename ConstnessPolicyType::Type* ConstPointerType;
69         typedef typename ConstnessPolicyType::Type& ConstReferenceType;
70
71         SmartPtr(void);
72
73         /// constructor by an objects pointer
74         /// \param value an objects pointer
75         explicit SmartPtr(ValueType* pValue);
76
77         /// constructor by a SmartPtr
78         /// \param aSmartPtr an another SmartPtr
79         SmartPtr(const SmartPtr& smartPtr);
80
81         /// constructor by an another type of SmartPtr
82         /// \param aSmartPtr an another SmartPtr
83         template
84         <
85                 typename ValueType2,
86                 template <typename> class OwnershipPolicy2,
87                 template <typename> class CheckingPolicy2,
88                 template <typename> class StoragePolicy2,
89                 template <typename> class ConstnessPolicy2
90         >
91         SmartPtr(const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr);
92
93         SmartPtr& operator = (const SmartPtr& smartPtr);
94
95         template
96         <
97                 typename ValueType2,
98                 template <typename> class OwnershipPolicy2,
99                 template <typename> class CheckingPolicy2,
100                 template <typename> class StoragePolicy2,
101                 template <typename> class ConstnessPolicy2
102         >
103         SmartPtr& operator = (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr);
104
105         virtual ~SmartPtr(void);
106
107         void Swap(SmartPtr& smartPtr);
108
109         PointerType operator -> (void);
110
111         ConstPointerType operator -> (void) const;
112
113         ReferenceType operator * (void);
114
115         ConstReferenceType operator * (void) const;
116
117         operator bool(void) const;
118
119         bool operator ! (void) const;
120
121         template
122         <
123                 typename ValueType2,
124                 template <typename> class OwnershipPolicy2,
125                 template <typename> class CheckingPolicy2,
126                 template <typename> class StoragePolicy2,
127                 template <typename> class ConstnessPolicy2
128         >
129         bool operator == (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const;
130
131         template
132         <
133                 typename ValueType2,
134                 template <typename> class OwnershipPolicy2,
135                 template <typename> class CheckingPolicy2,
136                 template <typename> class StoragePolicy2,
137                 template <typename> class ConstnessPolicy2
138         >
139         bool operator != (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const;
140
141         template
142         <
143                 typename ValueType2,
144                 template <typename> class OwnershipPolicy2,
145                 template <typename> class CheckingPolicy2,
146                 template <typename> class StoragePolicy2,
147                 template <typename> class ConstnessPolicy2
148         >
149         bool operator < (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const;
150
151         template
152         <
153                 typename ValueType2,
154                 template <typename> class OwnershipPolicy2,
155                 template <typename> class CheckingPolicy2,
156                 template <typename> class StoragePolicy2,
157                 template <typename> class ConstnessPolicy2
158         >
159         bool operator > (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const;
160
161         template
162         <
163                 typename ValueType2,
164                 template <typename> class OwnershipPolicy2,
165                 template <typename> class CheckingPolicy2,
166                 template <typename> class StoragePolicy2,
167                 template <typename> class ConstnessPolicy2
168         >
169         bool operator <= (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const;
170
171         template
172         <
173                 typename ValueType2,
174                 template <typename> class OwnershipPolicy2,
175                 template <typename> class CheckingPolicy2,
176                 template <typename> class StoragePolicy2,
177                 template <typename> class ConstnessPolicy2
178         >
179         bool operator >= (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const;
180
181         template <typename DestinationValue>
182         SmartPtr<DestinationValue, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy> staticCast(void) const;
183
184         template
185         <
186                 typename ValueType2,
187                 template <typename> class OwnershipPolicy2,
188                 template <typename> class CheckingPolicy2,
189                 template <typename> class StoragePolicy2,
190                 template <typename> class ConstnessPolicy2
191         >
192         friend void Reset(SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr);
193
194         template
195         <
196                 typename ValueType2,
197                 template <typename> class OwnershipPolicy2,
198                 template <typename> class CheckingPolicy2,
199                 template <typename> class StoragePolicy2,
200                 template <typename> class ConstnessPolicy2
201         >
202         friend class SmartPtr;
203
204         template
205         <
206                 typename ValueType2,
207                 template <typename> class OwnershipPolicy2,
208                 template <typename> class CheckingPolicy2,
209                 template <typename> class StoragePolicy2,
210                 template <typename> class ConstnessPolicy2
211         >
212         friend class WeakPtr;
213
214 private:
215         SmartPtr(const CheckingPolicyType& checkingPolicyType, const StoragePolicyType& storagePolicyType, const OwnershipPolicyType& ownershipPolicyType);
216
217 };
218
219 template
220 <
221         typename ValueType,
222         template <typename> class OwnershipPolicy,
223         template <typename> class CheckingPolicy,
224         template <typename> class StoragePolicy,
225         template <typename> class ConstnessPolicy
226 >
227 void Reset(SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>& smartPtr);
228
229 template
230 <
231         typename ValueType,
232         template <typename> class OwnershipPolicy,
233         template <typename> class CheckingPolicy,
234         template <typename> class StoragePolicy,
235         template <typename> class ConstnessPolicy
236 >
237 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::SmartPtr(void)
238 {
239         result r = GetLastResult();
240         SysTryReturnVoidResult(NID_UI_EFFECT, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
241
242         CheckingPolicyType::OnDefault(GetImpl(*this));
243 }
244
245 template
246 <
247         typename ValueType,
248         template <typename> class OwnershipPolicy,
249         template <typename> class CheckingPolicy,
250         template <typename> class StoragePolicy,
251         template <typename> class ConstnessPolicy
252 >
253 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::SmartPtr(ValueType* pValue) :
254         StoragePolicyType(pValue)
255 {
256         result r = GetLastResult();
257         SysTryReturnVoidResult(NID_UI_EFFECT, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
258
259         CheckingPolicyType::OnInit(GetImpl(*this));
260 }
261
262 template
263 <
264         typename ValueType,
265         template <typename> class OwnershipPolicy,
266         template <typename> class CheckingPolicy,
267         template <typename> class StoragePolicy,
268         template <typename> class ConstnessPolicy
269 >
270 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::SmartPtr(const SmartPtr& smartPtr) :
271         CheckingPolicyType(smartPtr),
272         StoragePolicyType(smartPtr),
273         OwnershipPolicyType(smartPtr)
274 {
275         GetImplRef(*this) = OwnershipPolicyType::Clone(GetImplRef(smartPtr));
276 }
277
278 template
279 <
280         typename ValueType,
281         template <typename> class OwnershipPolicy,
282         template <typename> class CheckingPolicy,
283         template <typename> class StoragePolicy,
284         template <typename> class ConstnessPolicy
285 >
286 template
287 <
288         typename ValueType2,
289         template <typename> class OwnershipPolicy2,
290         template <typename> class CheckingPolicy2,
291         template <typename> class StoragePolicy2,
292         template <typename> class ConstnessPolicy2
293 >
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)
299 {
300         GetImplRef(*this) = OwnershipPolicyType::Clone(GetImplRef(smartPtr));
301 }
302
303 template
304 <
305         typename ValueType,
306         template <typename> class OwnershipPolicy,
307         template <typename> class CheckingPolicy,
308         template <typename> class StoragePolicy,
309         template <typename> class ConstnessPolicy
310 >
311 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>&
312         SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator = (const SmartPtr& smartPtr)
313 {
314         if (this != &smartPtr)
315         {
316                 SmartPtr temp(smartPtr);
317                 temp.Swap(*this);
318         }
319         return *this;
320 }
321
322 template
323 <
324         typename ValueType,
325         template <typename> class OwnershipPolicy,
326         template <typename> class CheckingPolicy,
327         template <typename> class StoragePolicy,
328         template <typename> class ConstnessPolicy
329 >
330 template
331 <
332         typename ValueType2,
333         template <typename> class OwnershipPolicy2,
334         template <typename> class CheckingPolicy2,
335         template <typename> class StoragePolicy2,
336         template <typename> class ConstnessPolicy2
337 >
338 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>& SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator =
339         (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr)
340 {
341         SmartPtr temp(smartPtr);
342         temp.Swap(*this);
343         return *this;
344 }
345
346 template
347 <
348         typename ValueType,
349         template <typename> class OwnershipPolicy,
350         template <typename> class CheckingPolicy,
351         template <typename> class StoragePolicy,
352         template <typename> class ConstnessPolicy
353 >
354 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::~SmartPtr(void)
355 {
356         if (OwnershipPolicyType::Release(GetImpl(*static_cast<StoragePolicyType*>(this))))
357         {
358                 StoragePolicyType::Destroy();
359         }
360 }
361
362 template
363 <
364         typename ValueType,
365         template <typename> class OwnershipPolicy,
366         template <typename> class CheckingPolicy,
367         template <typename> class StoragePolicy,
368         template <typename> class ConstnessPolicy
369 >
370 void SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::Swap(SmartPtr& smartPtr)
371 {
372         CheckingPolicyType::Swap(smartPtr);
373         OwnershipPolicyType::Swap(smartPtr);
374         StoragePolicyType::Swap(smartPtr);
375 }
376
377 template
378 <
379         typename ValueType,
380         template <typename> class OwnershipPolicy,
381         template <typename> class CheckingPolicy,
382         template <typename> class StoragePolicy,
383         template <typename> class ConstnessPolicy
384 >
385 typename SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::PointerType
386         SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator -> (void)
387 {
388         CheckingPolicyType::OnDereference(GetImplRef(*this));
389         return StoragePolicyType::operator->();
390 }
391
392 template
393 <
394         typename ValueType,
395         template <typename> class OwnershipPolicy,
396         template <typename> class CheckingPolicy,
397         template <typename> class StoragePolicy,
398         template <typename> class ConstnessPolicy
399 >
400 typename SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::ConstPointerType
401         SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator -> (void) const
402 {
403         CheckingPolicyType::OnDereference(GetImplRef(*this));
404         return StoragePolicyType::operator->();
405 }
406
407 template
408 <
409         typename ValueType,
410         template <typename> class OwnershipPolicy,
411         template <typename> class CheckingPolicy,
412         template <typename> class StoragePolicy,
413         template <typename> class ConstnessPolicy
414 >
415 typename SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::ReferenceType
416         SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator * (void)
417 {
418         CheckingPolicyType::OnDereference(GetImplRef(*this));
419         return StoragePolicyType::operator*();
420 }
421
422 template
423 <
424         typename ValueType,
425         template <typename> class OwnershipPolicy,
426         template <typename> class CheckingPolicy,
427         template <typename> class StoragePolicy,
428         template <typename> class ConstnessPolicy
429 >
430 typename SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::ConstReferenceType
431         SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator * (void) const
432 {
433         CheckingPolicyType::OnDereference(GetImplRef(*this));
434         return StoragePolicyType::operator*();
435 }
436
437 template
438 <
439         typename ValueType,
440         template <typename> class OwnershipPolicy,
441         template <typename> class CheckingPolicy,
442         template <typename> class StoragePolicy,
443         template <typename> class ConstnessPolicy
444 >
445 SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator bool(void) const
446 {
447         if (GetImpl(*this) != null)
448         {
449                 return true;
450         }
451         return false;
452 }
453
454 template
455 <
456         typename ValueType,
457         template <typename> class OwnershipPolicy,
458         template <typename> class CheckingPolicy,
459         template <typename> class StoragePolicy,
460         template <typename> class ConstnessPolicy
461 >
462 bool SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator ! (void) const
463 {
464         return GetImpl(*this) == null;
465 }
466
467 template
468 <
469         typename ValueType,
470         template <typename> class OwnershipPolicy,
471         template <typename> class CheckingPolicy,
472         template <typename> class StoragePolicy,
473         template <typename> class ConstnessPolicy
474 >
475 template
476 <
477         typename ValueType2,
478         template <typename> class OwnershipPolicy2,
479         template <typename> class CheckingPolicy2,
480         template <typename> class StoragePolicy2,
481         template <typename> class ConstnessPolicy2
482 >
483 bool SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator ==
484         (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const
485 {
486         return GetImpl(*this) == GetImpl(smartPtr);
487 }
488
489 template
490 <
491         typename ValueType,
492         template <typename> class OwnershipPolicy,
493         template <typename> class CheckingPolicy,
494         template <typename> class StoragePolicy,
495         template <typename> class ConstnessPolicy
496 >
497 template
498 <
499         typename ValueType2,
500         template <typename> class OwnershipPolicy2,
501         template <typename> class CheckingPolicy2,
502         template <typename> class StoragePolicy2,
503         template <typename> class ConstnessPolicy2
504 >
505 bool SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator !=
506         (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const
507 {
508         return GetImpl(*this) != GetImpl(smartPtr);
509 }
510
511 template
512 <
513         typename ValueType,
514         template <typename> class OwnershipPolicy,
515         template <typename> class CheckingPolicy,
516         template <typename> class StoragePolicy,
517         template <typename> class ConstnessPolicy
518 >
519 template
520 <
521         typename ValueType2,
522         template <typename> class OwnershipPolicy2,
523         template <typename> class CheckingPolicy2,
524         template <typename> class StoragePolicy2,
525         template <typename> class ConstnessPolicy2
526 >
527 bool SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator <
528         (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const
529 {
530         return GetImpl(*this) < GetImpl(smartPtr);
531 }
532
533 template
534 <
535         typename ValueType,
536         template <typename> class OwnershipPolicy,
537         template <typename> class CheckingPolicy,
538         template <typename> class StoragePolicy,
539         template <typename> class ConstnessPolicy
540 >
541 template
542 <
543         typename ValueType2,
544         template <typename> class OwnershipPolicy2,
545         template <typename> class CheckingPolicy2,
546         template <typename> class StoragePolicy2,
547         template <typename> class ConstnessPolicy2
548 >
549 bool SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator >
550         (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const
551 {
552         return GetImpl(*this) > GetImpl(smartPtr);
553 }
554
555 template
556 <
557         typename ValueType,
558         template <typename> class OwnershipPolicy,
559         template <typename> class CheckingPolicy,
560         template <typename> class StoragePolicy,
561         template <typename> class ConstnessPolicy
562 >
563 template
564 <
565         typename ValueType2,
566         template <typename> class OwnershipPolicy2,
567         template <typename> class CheckingPolicy2,
568         template <typename> class StoragePolicy2,
569         template <typename> class ConstnessPolicy2
570 >
571 bool SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator <=
572         (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const
573 {
574         return GetImpl(*this) <= GetImpl(smartPtr);
575 }
576
577 template
578 <
579         typename ValueType,
580         template <typename> class OwnershipPolicy,
581         template <typename> class CheckingPolicy,
582         template <typename> class StoragePolicy,
583         template <typename> class ConstnessPolicy
584 >
585 template
586 <
587         typename ValueType2,
588         template <typename> class OwnershipPolicy2,
589         template <typename> class CheckingPolicy2,
590         template <typename> class StoragePolicy2,
591         template <typename> class ConstnessPolicy2
592 >
593 bool SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::operator >=
594         (const SmartPtr<ValueType2, OwnershipPolicy2, CheckingPolicy2, StoragePolicy2, ConstnessPolicy2>& smartPtr) const
595 {
596         return GetImpl(*this) >= GetImpl(smartPtr);
597 }
598
599 template
600 <
601         typename ValueType,
602         template <typename> class OwnershipPolicy,
603         template <typename> class CheckingPolicy,
604         template <typename> class StoragePolicy,
605         template <typename> class ConstnessPolicy
606 >
607 template <typename DestinationValue>
608 SmartPtr<DestinationValue, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>
609         SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>::staticCast(void) const
610 {
611         SmartPtr<DestinationValue, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy> result(*this, *this, *this);
612         GetImplRef(result) = static_cast<DestinationValue*>(GetImpl(*this));
613         return result;
614 }
615
616
617 template
618 <
619         typename ValueType,
620         template <typename> class OwnershipPolicy,
621         template <typename> class CheckingPolicy,
622         template <typename> class StoragePolicy,
623         template <typename> class ConstnessPolicy
624 >
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)
630 {
631         GetImplRef(*this) = OwnershipPolicyType::Clone(GetImplRef(storagePolicyType));
632 }
633
634 template
635 <
636         typename ValueType,
637         template <typename> class OwnershipPolicy,
638         template <typename> class CheckingPolicy,
639         template <typename> class StoragePolicy,
640         template <typename> class ConstnessPolicy
641 >
642 void Reset(SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy>& smartPtr)
643 {
644         SmartPtr<ValueType, OwnershipPolicy, CheckingPolicy, StoragePolicy, ConstnessPolicy> temp;
645         temp.Swap(smartPtr);
646 }
647
648 // Common types definitions
649 typedef SmartPtr<float> FloatPtr;
650
651 }}}}} //Tizen::Ui::Effects::_Renderer::System
652
653
654 #endif //_FUI_EFFECTS_INTERNAL_RENDERER_SYSTEM_SMARTPTR_H_