Implementation of boost::any container substitute
[platform/core/uifw/dali-core.git] / dali / public-api / object / any.cpp
1 //
2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
3 //
4 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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 // CLASS HEADER
18 #include <dali/public-api/object/any.h>
19
20 // EXTERNAL HEADERS
21 #include <dali/integration-api/debug.h>
22
23 namespace Dali
24 {
25
26 Any::Any()
27 : mContainer( NULL )
28 {
29 }
30
31 Any::~Any()
32 {
33   // Call the implementation deletion function, which will invalidate mContainer
34
35   if ( NULL != mContainer )
36   {
37     mContainer->mDeleteFunc( mContainer );
38     mContainer = NULL;
39   }
40 }
41
42 Any& Any::operator=( const Any& any )
43 {
44   if( &any != this )
45   {
46     if( NULL == any.mContainer )
47     {
48       delete mContainer;
49       mContainer = NULL;
50     }
51     else
52     {
53       AnyContainerBase* tmp = mContainer;
54
55       if( NULL != 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
87 } //namespace Dali