Moved actor recursion methods to actor-parent-impl
[platform/core/uifw/dali-core.git] / dali / public-api / object / any.cpp
1 /*
2  * Copyright (c) 2020 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       delete mContainer;
49       mContainer = nullptr;
50     }
51     else
52     {
53       AnyContainerBase* tmp = mContainer;
54
55       if(nullptr != mContainer)
56       {
57         // Check if two Any types have the same type. Avoids assignments of values with different types.
58         if(mContainer->GetType() != any.GetType())
59         {
60           AssertAlways("Any::operator=( const Any& Any ). Trying to assign two values with different types.");
61         }
62       }
63
64       // Clone the correct templated object
65       mContainer = any.mContainer->mCloneFunc(*any.mContainer);
66
67       // Deletes previous container.
68       delete tmp;
69     }
70   }
71
72   return *this;
73 }
74
75 const std::type_info& Any::GetType() const
76 {
77   return mContainer ? mContainer->GetType() : typeid(void);
78 }
79
80 void Any::AssertAlways(const char* assertMessage)
81 {
82   DALI_LOG_ERROR_NOFN(assertMessage);
83   throw Dali::DaliException(assertMessage, "");
84 }
85
86 } //namespace Dali