[dali_2.3.31] Merge branch 'devel/master'
[platform/core/uifw/dali-core.git] / dali / public-api / object / any.cpp
1 /*
2  * Copyright (c) 2022 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/public-api/object/any.h>
20
21 // EXTERNAL HEADERS
22 #include <dali/integration-api/debug.h>
23
24 namespace Dali
25 {
26 Any::Any()
27 : mContainer(nullptr)
28 {
29 }
30
31 Any::~Any()
32 {
33   // Call the implementation deletion function, which will invalidate mContainer
34
35   if(nullptr != mContainer)
36   {
37     mContainer->mDeleteFunc(mContainer);
38     mContainer = nullptr;
39   }
40 }
41
42 Any& Any::operator=(const Any& any)
43 {
44   if(&any != this)
45   {
46     if(nullptr == any.mContainer)
47     {
48       if(mContainer)
49       {
50         mContainer->mDeleteFunc(mContainer);
51         mContainer = nullptr;
52       }
53     }
54     else
55     {
56       AnyContainerBase* tmp = mContainer;
57
58       if(nullptr != mContainer)
59       {
60         // Check if two Any types have the same type. Avoids assignments of values with different types.
61         if(mContainer->GetType() != any.GetType())
62         {
63           AssertAlways("Any::operator=( const Any& Any ). Trying to assign two values with different types.");
64         }
65       }
66
67       // Clone the correct templated object
68       mContainer = any.mContainer->mCloneFunc(*any.mContainer);
69
70       // Deletes previous container.
71       if(tmp)
72       {
73         tmp->mDeleteFunc(tmp);
74       }
75     }
76   }
77
78   return *this;
79 }
80
81 Any& Any::operator=(Any&& any) noexcept
82 {
83   if(&any != this)
84   {
85     // Deletes previous container.
86     if(mContainer)
87     {
88       mContainer->mDeleteFunc(mContainer);
89     }
90
91     // Move the correct templated object
92     mContainer = any.mContainer;
93
94     // Remove input value's container.
95     any.mContainer = nullptr;
96   }
97
98   return *this;
99 }
100
101 const std::type_info& Any::GetType() const
102 {
103   return mContainer ? mContainer->GetType() : typeid(void);
104 }
105
106 void Any::AssertAlways(const char* assertMessage)
107 {
108   DALI_LOG_ERROR_NOFN(assertMessage);
109   throw Dali::DaliException(assertMessage, "");
110 }
111
112 } //namespace Dali