Merge branch 'devel/master' into tizen
[platform/core/uifw/dali-core.git] / dali / public-api / object / any.h
index 5b85d9b..997c318 100644 (file)
@@ -1,8 +1,8 @@
-#ifndef __DALI_ANY_TYPE_H__
-#define __DALI_ANY_TYPE_H__
+#ifndef DALI_ANY_TYPE_H
+#define DALI_ANY_TYPE_H
 
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2020 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,8 +19,8 @@
  */
 
 // EXTERNAL INCLUDES
-#include <typeinfo>   // operator typeid
-#include <cstddef>    // NULL
+#include <cstddef>  // NULL
+#include <typeinfo> // operator typeid
 
 // INTERNAL INCLUDES
 #include <dali/public-api/common/dali-common.h>
@@ -41,87 +41,95 @@ namespace Dali
  * Any floatVariable( 4.5f );
  * Any strVariable( std::string( "Hello world" ) );
  * uintVariable = 1u;
- * unsigned int variable = AnyCast< unsigned int >( uintVariable );
+ * uint32_t variable = AnyCast< uint32_t >( uintVariable );
  * if ( typeid( int ) == uintVariable.GetType() )
  * \endcode
+ * @SINCE_1_0.0
  */
 class Any
 {
 public:
   /**
-   * Default constructor.
+   * @brief Default constructor.
+   * @SINCE_1_0.0
    */
-  DALI_IMPORT_API Any();
+  DALI_CORE_API Any();
 
   /**
-   * Destructor. Free resources.
+   * @brief Destructor. Free resources.
+   * @SINCE_1_0.0
    */
-  DALI_IMPORT_API ~Any();
+  DALI_CORE_API ~Any();
 
   /**
-   * @brief Pass Assert message
+   * @brief Passes Assert message.
    *
-   * @param assertMessage Assert message to report
+   * @SINCE_1_0.0
+   * @param[in] assertMessage Assert message to report
    */
-  DALI_IMPORT_API static void AssertAlways( const char* assertMessage );
+  DALI_CORE_API static void AssertAlways(const char* assertMessage);
 
   /**
    * @brief Constructs a Any type with the given value.
    *
-   * @param[in] value The given value.
+   * @SINCE_1_0.0
+   * @param[in] value The given value
    */
   template<typename Type>
-  Any( const Type& value )
-  : mContainer( new AnyContainerImpl<Type>( value ) )
+  Any(const Type& value)
+  : mContainer(new AnyContainerImpl<Type>(value))
   {
   }
 
   /**
-   * Copy Constructor.
-   * @param [in] any Any to be copied.
+   * @brief Copy Constructor.
+   * @SINCE_1_0.0
+   * @param[in] any Any to be copied
    */
-  Any( const Any& any )
+  Any(const Any& any)
   {
     // If container isn't empty then copy the container?
-    if ( NULL != any.mContainer )
+    if(nullptr != any.mContainer)
     {
-      mContainer = any.mContainer->mCloneFunc( *any.mContainer );
+      mContainer = any.mContainer->mCloneFunc(*any.mContainer);
     }
     else
     {
       // Otherwise mark new container as empty
-      mContainer = NULL;
+      mContainer = nullptr;
     }
   }
 
   /**
    * @brief Assigns a given value to the Any type.
    *
+   * @SINCE_1_0.0
+   * @param[in] value The given value
+   * @return A reference to this
    * @note If the types are different, then the current container will be re-created.
    *
-   * @param[in] value The given value.
    */
   template<typename Type>
-  Any& operator=( const Type& value )
+  Any& operator=(const Type& value)
   {
     // If the container is empty then assign the new value
-    if ( NULL == mContainer )
+    if(nullptr == mContainer)
     {
-      mContainer = new AnyContainerImpl< Type >( value );
+      mContainer = new AnyContainerImpl<Type>(value);
     }
     else
     {
       // Check to see if this type is compatible with current container?
-      if ( mContainer->GetType() == typeid( Type ) )
+      if(mContainer->GetType() == typeid(Type))
       {
         // Same type so just set the new value
-        static_cast< AnyContainerImpl< Type >* >( mContainer )->SetValue( value );
+        static_cast<AnyContainerImpl<Type>*>(mContainer)->SetValue(value);
       }
       else
       {
         // Incompatible types, so delete old container and assign a new one with this type and value
-        mContainer->mDeleteFunc( mContainer );
-        mContainer = new AnyContainerImpl< Type >( value );
+        mContainer->mDeleteFunc(mContainer);
+        mContainer = new AnyContainerImpl<Type>(value);
       }
     }
     return *this;
@@ -130,19 +138,22 @@ public:
   /**
    * @brief Assignment operator.
    *
+   * @SINCE_1_0.0
+   * @param[in] any Any to be assigned which contains a value of identical type to current contents.
+   * @return A reference to this
    * @exception DaliException If parameter any is of a different type.
    *
-   * @param [in] any Any to be assigned which contains a value of identical type to current contents.
    */
-  DALI_IMPORT_API Any& operator=( const Any& any );
+  DALI_CORE_API Any& operator=(const Any& any);
 
   /**
-   * @brief Get a value of type Type from container
+   * @brief Gets a value of type Type from container.
    *
-   * @param type destination of type Type to write to
+   * @SINCE_1_0.0
+   * @param[in] type destination of type Type to write to
    */
   template<typename Type>
-  void Get( Type& type ) const
+  void Get(Type& type) const
   {
     type = Get<Type>();
   }
@@ -150,188 +161,200 @@ public:
   /**
    * @brief Returns the type info of the stored value.
    *
+   * @SINCE_1_0.0
    * @return The std::type_info of the stored value or the type info of the void
-   * type if there is no value stored.
+   * type if there is no value stored
    */
-  DALI_IMPORT_API const std::type_info& GetType() const;
+  DALI_CORE_API const std::type_info& GetType() const;
 
   /**
    * @brief Retrieves the stored value in the Any type.
    *
-   * @return The stored value.
+   * @SINCE_1_0.0
+   * @return The stored value
    */
   template<typename Type>
   const Type& Get() const
   {
-
-    if ( NULL == mContainer )
+    if(nullptr == mContainer)
     {
-      AssertAlways( "Any::Get(). mContainer is NULL" );
+      AssertAlways("Any::Get(). mContainer is NULL");
     }
-
-    // Check if the value has the same value than the Any type.
-    if( mContainer->GetType() != typeid( Type ) )
+    else if(mContainer->GetType() != typeid(Type)) // Check if the value has the same value than the Any type.
     {
-      AssertAlways( "Any::Get(). Trying to retrieve a value of a different type than the template one." );
+      AssertAlways("Any::Get(). Trying to retrieve a value of a different type than the template one.");
     }
-    return static_cast< AnyContainerImpl< Type >* >( mContainer )->GetValue();
+    return static_cast<AnyContainerImpl<Type>*>(mContainer)->GetValue();
   }
 
   /**
-   * @brief Return pointer of Type to the value stored
+   * @brief Returns pointer of Type to the value stored.
    *
-   * @return pointer to the value or NULL if no value is contained
+   * @SINCE_1_0.0
+   * @return pointer to the value, or NULL if no value is contained
    */
   template<typename Type>
   Type* GetPointer()
   {
-    if( NULL == mContainer )
+    if(nullptr == mContainer)
     {
       return NULL;
     }
-     // Check if the value has the same value than the Any type.
-    if( mContainer->GetType() != typeid( Type ) )
+    // Check if the value has the same value than the Any type.
+    if(mContainer->GetType() != typeid(Type))
     {
-      AssertAlways( "Any::GetPointer(). Trying to retrieve a pointer to a value of a different type than the template one." );
+      AssertAlways("Any::GetPointer(). Trying to retrieve a pointer to a value of a different type than the template one.");
     }
-    return static_cast< AnyContainerImpl< Type >* >( mContainer )->GetPointerToValue();
+    return static_cast<AnyContainerImpl<Type>*>(mContainer)->GetPointerToValue();
   }
 
   /**
-   * @brief Return pointer of Type to the value stored
+   * @brief Returns pointer of Type to the value stored.
    *
-   * @return pointer to the value or NULL if no value is contained
+   * @SINCE_1_0.0
+   * @return pointer to the value, or NULL if no value is contained
    */
   template<typename Type>
   const Type* GetPointer() const
   {
-    if( NULL == mContainer )
+    if(nullptr == mContainer)
     {
       return NULL;
     }
-     // Check if the value has the same value than the Any type.
-    if( mContainer->GetType() != typeid( Type ) )
+    // Check if the value has the same value than the Any type.
+    if(mContainer->GetType() != typeid(Type))
     {
-      AssertAlways( "Any::GetPointer(). Trying to retrieve a pointer to a value of a different type than the template one." );
+      AssertAlways("Any::GetPointer(). Trying to retrieve a pointer to a value of a different type than the template one.");
     }
-    return static_cast< AnyContainerImpl< Type >* >( mContainer )->GetPointerToValue();
+    return static_cast<AnyContainerImpl<Type>*>(mContainer)->GetPointerToValue();
   }
 
   /**
-   * @brief Returns whether container holds a value
+   * @brief Returns whether container holds a value.
    *
-   * @return true if the container is empty, else false.
+   * @SINCE_1_0.0
+   * @return @c true if the container is empty, else @c false
    */
   bool Empty() const
   {
-    return ( NULL == mContainer ) ? true : false;
+    return (nullptr == mContainer) ? true : false;
   }
 
-  struct AnyContainerBase;    // Forward declaration for typedef
-  typedef AnyContainerBase* (*CloneFunc)( const AnyContainerBase& base );
-  typedef void (*DeleteFunc)( const AnyContainerBase* base );
+  struct AnyContainerBase; // Forward declaration for typedef
+  using CloneFunc = AnyContainerBase* (*)(const AnyContainerBase&);
+
+  using DeleteFunc = void (*)(const AnyContainerBase*);
 
   /**
-   * Base container to hold type for match verification and instance cloning function
+   * @brief Base container to hold type for match verification and instance cloning function.
    *
+   * @SINCE_1_0.0
    */
   struct AnyContainerBase
   {
     /**
-     * @brief Constructor of base container
+     * @brief Constructor of base container.
      *
-     * @param type typeid of container
-     * @param cloneFunc Cloning function to replicate this container type
-     * @param deleteFunc Deleting function to destroy this container type
+     * @SINCE_1_0.0
+     * @param[in] type typeid of container
+     * @param[in] cloneFunc Cloning function to replicate this container type
+     * @param[in] deleteFunc Deleting function to destroy this container type
      */
-    AnyContainerBase( const std::type_info& type, CloneFunc cloneFunc, DeleteFunc deleteFunc )
-    : mType( type ),
-      mCloneFunc( cloneFunc ),
-      mDeleteFunc( deleteFunc )
-    {}
+    AnyContainerBase(const std::type_info& type, CloneFunc cloneFunc, DeleteFunc deleteFunc)
+    : mType(type),
+      mCloneFunc(cloneFunc),
+      mDeleteFunc(deleteFunc)
+    {
+    }
 
     /**
-     * @brief Get the typeid of this container
+     * @brief Gets the typeid of this container.
      *
-     * @return type
+     * @SINCE_1_0.0
+     * @return Type
      */
     const std::type_info& GetType() const
     {
       return mType;
     }
 
-    const::std::type_info& mType;       // typeID
-    CloneFunc mCloneFunc;               // cloning function for this container
-    DeleteFunc mDeleteFunc;             // deleting function for this container
+    const ::std::type_info& mType;       // typeID
+    CloneFunc               mCloneFunc;  // cloning function for this container
+    DeleteFunc              mDeleteFunc; // deleting function for this container
   };
 
-
   /**
-   * @brief Templated Clone function from container base
+   * @brief Templated Clone function from container base.
    *
-   * @param base reference to container
+   * @SINCE_1_0.0
+   * @param[in] base The reference to container
    */
   template<typename Type>
   struct AnyContainerImplCloner
   {
-    static AnyContainerBase* Clone( const AnyContainerBase& base )
+    static AnyContainerBase* Clone(const AnyContainerBase& base)
     {
-      return new AnyContainerImpl< Type >( static_cast< AnyContainerImpl< Type > >( base ) );
+      return new AnyContainerImpl<Type>(static_cast<AnyContainerImpl<Type> >(base));
     }
   };
 
   /**
-   * @brief Templated Delete function from container base
+   * @brief Templated Delete function from container base.
    *
-   * @param base pointer to container
+   * @SINCE_1_0.0
+   * @param[in] base The pointer to container
    */
   template<typename Type>
   struct AnyContainerImplDelete
   {
-    static void Delete( const AnyContainerBase* base )
+    static void Delete(const AnyContainerBase* base)
     {
-      delete ( static_cast< const AnyContainerImpl< Type >* > ( base ) );
+      delete(static_cast<const AnyContainerImpl<Type>*>(base));
     }
   };
 
   /**
-   * @brief Templated class to hold value for type
+   * @brief Templated class to hold value for type.
    *
+   * @SINCE_1_0.0
    */
   template<typename Type>
   class AnyContainerImpl : public AnyContainerBase
   {
   public:
-
     /**
-     * @brief Constructor to create container holding value of type Type
+     * @brief Constructor to create container holding value of type Type.
      *
-     * @param value Value of Type
+     * @SINCE_1_0.0
+     * @param[in] value Value of Type
      */
-    AnyContainerImpl( const Type& value )
-    : AnyContainerBase( typeid( Type ),
-                        static_cast< CloneFunc >( &AnyContainerImplCloner< Type >::Clone ),
-                        static_cast< DeleteFunc >( &AnyContainerImplDelete< Type >::Delete ) ),
-                        mValue( value )
-    {}
+    AnyContainerImpl(const Type& value)
+    : AnyContainerBase(typeid(Type),
+                       static_cast<CloneFunc>(&AnyContainerImplCloner<Type>::Clone),
+                       static_cast<DeleteFunc>(&AnyContainerImplDelete<Type>::Delete)),
+      mValue(value)
+    {
+    }
 
     /**
-     * @brief Constructor to create new container of type from and existing container (cloning)
+     * @brief Constructor to create new container of type from and existing container (cloning).
      *
-     * @param base reference to base container to copy from
+     * @SINCE_1_0.0
+     * @param[in] base The reference to base container to copy from
      */
-    AnyContainerImpl( const AnyContainerBase& base )
-    : AnyContainerBase( typeid( Type ),
-                        static_cast< CloneFunc >( &AnyContainerImplCloner< Type >::Clone ),
-                        static_cast< DeleteFunc >( &AnyContainerImplDelete< Type >::Delete ) )
+    AnyContainerImpl(const AnyContainerBase& base)
+    : AnyContainerBase(typeid(Type),
+                       static_cast<CloneFunc>(&AnyContainerImplCloner<Type>::Clone),
+                       static_cast<DeleteFunc>(&AnyContainerImplDelete<Type>::Delete))
     {
-      mValue = static_cast< const AnyContainerImpl& >( base ).GetValue();
+      mValue = static_cast<const AnyContainerImpl&>(base).GetValue();
     }
 
     /**
-     * @brief Get the container's stored value
+     * @brief Gets the container's stored value.
      *
-     * @return value of type Type
+     * @SINCE_1_0.0
+     * @return Value of type Type
      */
     const Type& GetValue() const
     {
@@ -339,41 +362,43 @@ public:
     }
 
     /**
-     * @brief Set the container's stored value
+     * @brief Sets the container's stored value.
      *
-     * @param value of type Type
+     * @SINCE_1_0.0
+     * @param[in] value Value of type Type
      */
-    void SetValue( const Type& value )
+    void SetValue(const Type& value)
     {
       mValue = value;
     }
 
     /**
-     * @brief Get a pointer to the value held
+     * @brief Gets a pointer to the value held.
      *
-     * @return pointer to the value of type Type
+     * @SINCE_1_0.0
+     * @return Pointer to the value of type Type
      */
     Type* GetPointerToValue()
     {
-      return static_cast< Type* >( &mValue );
+      return static_cast<Type*>(&mValue);
     }
 
     /**
-     * @brief Get a pointer to the value held
+     * @brief Gets a pointer to the value held.
      *
-     * @return pointer to the value of type Type
+     * @SINCE_1_0.0
+     * @return Pointer to the value of type Type
      */
     const Type* GetPointerToValue() const
     {
-      return static_cast< const Type* >( &mValue );
+      return static_cast<const Type*>(&mValue);
     }
 
-    private:
-      Type mValue;
+  private:
+    Type mValue;
   };
 
   AnyContainerBase* mContainer;
-
 };
 
 /**
@@ -381,79 +406,85 @@ public:
  */
 
 /**
- * @brief Extract a pointer to the held type of an Any object from a pointer to that Any object (NULL if empty )
+ * @brief Extracts a pointer to the held type of an Any object from a pointer to that Any object (NULL if empty).
  *
- * @param any Pointer to an Any object
+ * @SINCE_1_0.0
+ * @param[in] any Pointer to an Any object
  *
  * @return Pointer to the Type held
  */
 template<typename Type>
-inline Type* AnyCast( Any* any )
+inline Type* AnyCast(Any* any)
 {
   return any->GetPointer<Type>();
 }
 
 /**
- * @brief Extract a const pointer to the held type of an Any object from a pointer to that Any object (NULL if empty )
+ * @brief Extracts a const pointer to the held type of an Any object from a pointer to that Any object (NULL if empty).
  *
- * @param any const Pointer to an Any object
+ * @SINCE_1_0.0
+ * @param[in] any const Pointer to an Any object
  *
  * @return const Pointer to the Type held
  */
 template<typename Type>
-inline const Type* AnyCast( const Any* any )
+inline const Type* AnyCast(const Any* any)
 {
   return any->GetPointer<Type>();
 }
 
 /**
- * @brief Extract a held value of type Type from an Any object from a reference to that Any object
+ * @brief Extracts a held value of type Type from an Any object from a reference to that Any object.
  *
- * @param any reference to an Any object
+ * @SINCE_1_0.0
+ * @param[in] any The reference to an Any object
  *
  * @return Type value of type Type
  */
 template<typename Type>
-inline Type AnyCast( Any& any )
+inline Type AnyCast(Any& any)
 {
   return any.Get<Type>();
 }
 
 /**
- * @brief Extract a held value of type Type from an Any object from a const reference to that Any object
+ * @brief Extracts a held value of type Type from an Any object from a const reference to that Any object.
  *
- * @param any reference to an Any object
+ * @SINCE_1_0.0
+ * @param[in] any The reference to an Any object
  *
  * @return Type value of type Type
  */
 template<typename Type>
-inline Type AnyCast( const Any& any )
+inline Type AnyCast(const Any& any)
 {
   return any.Get<Type>();
 }
 
 /**
- * @brief Extract a reference to the held value of type Type from an Any object from a reference to that Any object
+ * @brief Extracts a reference to the held value of type Type from an Any object from a reference to that Any object
  *
- * @param any reference to an Any object
+ * @SINCE_1_0.0
+ * @param[in] any The reference to an Any object
  *
  * @return A reference to the Type value of type Type
  */
 template<typename Type>
-inline Type& AnyCastReference( Any& any )
+inline Type& AnyCastReference(Any& any)
 {
   return any.Get<Type>();
 }
 
 /**
- * @brief Extract a const reference to the held value of type Type from an Any object from a const reference to that Any object
+ * @brief Extracts a const reference to the held value of type Type from an Any object from a const reference to that Any object.
  *
- * @param any reference to an Any object
+ * @SINCE_1_0.0
+ * @param[in] any The reference to an Any object
  *
  * @return A const reference to the Type value of type Type
  */
 template<typename Type>
-inline const Type& AnyCastReference( const Any& any )
+inline const Type& AnyCastReference(const Any& any)
 {
   return any.Get<Type>();
 }
@@ -463,4 +494,4 @@ inline const Type& AnyCastReference( const Any& any )
  */
 } // namespace Dali
 
-#endif // __DALI_ANY_TYPE_H__
+#endif // DALI_ANY_TYPE_H