8e8dfded9cf027d31681e0a0b7b97c1db38639bd
[platform/core/uifw/dali-core.git] / dali / public-api / object / any.cpp
1 /*
2  * Copyright (c) 2015 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
27 Any::Any()
28 : mContainer( nullptr )
29 {
30 }
31
32 Any::~Any()
33 {
34   // Call the implementation deletion function, which will invalidate mContainer
35
36   if ( nullptr != mContainer )
37   {
38     mContainer->mDeleteFunc( mContainer );
39     mContainer = nullptr;
40   }
41 }
42
43 Any& Any::operator=( const Any& any )
44 {
45   if( &any != this )
46   {
47     if( nullptr == any.mContainer )
48     {
49       delete mContainer;
50       mContainer = nullptr;
51     }
52     else
53     {
54       AnyContainerBase* tmp = mContainer;
55
56       if( nullptr != mContainer )
57       {
58         // Check if two Any types have the same type. Avoids assignments of values with different types.
59         if( mContainer->GetType() != any.GetType() )
60         {
61           AssertAlways( "Any::operator=( const Any& Any ). Trying to assign two values with different types." );
62         }
63       }
64
65       // Clone the correct templated object
66       mContainer = any.mContainer->mCloneFunc( *any.mContainer );
67
68       // Deletes previous container.
69       delete tmp;
70     }
71   }
72
73   return *this;
74 }
75
76 const std::type_info& Any::GetType() const
77 {
78   return mContainer ? mContainer->GetType() : typeid( void );
79 }
80
81 void Any::AssertAlways( const char* assertMessage )
82 {
83   DALI_LOG_ERROR_NOFN( assertMessage );
84   throw Dali::DaliException( assertMessage, "" );
85 }
86
87
88 } //namespace Dali