-#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.
*/
// 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>
* 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;
/**
* @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>();
}
/**
* @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
{
}
/**
- * @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;
-
};
/**
*/
/**
- * @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>();
}
*/
} // namespace Dali
-#endif // __DALI_ANY_TYPE_H__
+#endif // DALI_ANY_TYPE_H