X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Fdali-toolkit-test-utils%2Ftoolkit-singleton-service.cpp;h=d8efd70b0552d2cc51577b7fd202be13afd73b8b;hp=d92eb155761a2d87b0425519de11bc78c6f3e872;hb=d07dc4c4a6067ba3080184d862bca40a90d1789c;hpb=d9b7907a944d4ca0568b34361f334026999312bc diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-singleton-service.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-singleton-service.cpp index d92eb15..d8efd70 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-singleton-service.cpp +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-singleton-service.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2016 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. @@ -15,12 +15,12 @@ * */ -#include "toolkit-singleton-service.h" +#include #include #include -#include -#include +#include +#include namespace Dali { @@ -31,102 +31,125 @@ namespace Internal namespace Adaptor { -/** - * Stub for the SingletonService - */ -class SingletonService : public Dali::BaseObject +namespace { -public: - static Dali::SingletonService New(); - static Dali::SingletonService Get(); - void Register( const std::type_info& info, BaseHandle singleton ); - BaseHandle GetSingleton( const std::type_info& info ) const; - -private: - SingletonService(); - virtual ~SingletonService(); - - // Undefined - SingletonService( const SingletonService& ); - SingletonService& operator=( SingletonService& ); - -private: +Dali::IntrusivePtr gSingletonService; +} // unnamed namespace - typedef std::pair SingletonPair; - typedef std::map SingletonContainer; - typedef SingletonContainer::const_iterator SingletonConstIter; - SingletonContainer mSingletonContainer; ///< The container to look up singleton by its type name +class SingletonService : public Dali::BaseObject +{ +public: - static Dali::SingletonService mToolkitSingletonService; -}; + /** + * Create a SingletonService. + * This should only be called once by the Application class. + * @return A newly created SingletonService. + */ + static Dali::SingletonService New() + { + DALI_ASSERT_ALWAYS( 0 && "SingletonService New method used"); + gSingletonService = Dali::IntrusivePtr( new SingletonService() ); + return Dali::SingletonService( gSingletonService.Get() ); + } -Dali::SingletonService SingletonService::mToolkitSingletonService; + /** + * @copydoc Dali::SingletonService::Get() + */ + static Dali::SingletonService Get() + { + Dali::SingletonService singletonService; + if ( !gSingletonService ) + { + gSingletonService = Dali::IntrusivePtr( new SingletonService() ); + } + return Dali::SingletonService( gSingletonService.Get() ); + } -Dali::SingletonService SingletonService::New() -{ - return Get(); -} + /** + * @copydoc Dali::SingletonService::Register() + */ + void Register( const std::type_info& info, BaseHandle singleton ) + { + if( singleton ) + { + mSingletonContainer.insert( SingletonPair( info.name(), singleton ) ); + } + } -Dali::SingletonService SingletonService::Get() -{ - if( ! mToolkitSingletonService ) + /** + * @copydoc Dali::SingletonService::UnregisterAll() + */ + void UnregisterAll() { - mToolkitSingletonService = Dali::SingletonService( new Dali::Internal::Adaptor::SingletonService ); + mSingletonContainer.clear(); } - return mToolkitSingletonService; -} -void SingletonService::Register( const std::type_info& info, BaseHandle singleton ) -{ - if( singleton ) + /** + * @copydoc Dali::SingletonService::GetSingleton() + */ + BaseHandle GetSingleton( const std::type_info& info ) const { - mSingletonContainer.insert( SingletonPair( info.name(), singleton ) ); + BaseHandle object; + + SingletonConstIter iter = mSingletonContainer.find(info.name()); + if( iter != mSingletonContainer.end() ) + { + object = ( *iter ).second; + } + return object; } -} -BaseHandle SingletonService::GetSingleton( const std::type_info& info ) const -{ - BaseHandle object; +private: - SingletonConstIter iter = mSingletonContainer.find(info.name()); - if( iter != mSingletonContainer.end() ) + /** + * Private Constructor + * @see SingletonService::New() + */ + SingletonService() + : mSingletonContainer() { - object = ( *iter ).second; + // Can only have one instance of SingletonService + DALI_ASSERT_ALWAYS( !gSingletonService && "Only one instance of SingletonService is allowed"); + gSingletonService = this; } - return object; -} + /** + * Virtual Destructor + */ + virtual ~SingletonService() + { + gSingletonService = 0; + } -SingletonService::SingletonService() -: mSingletonContainer() -{ -} + // Undefined + SingletonService( const SingletonService& ); + SingletonService& operator=( SingletonService& ); -SingletonService::~SingletonService() -{ -} +private: + typedef std::pair SingletonPair; + typedef std::map SingletonContainer; + typedef SingletonContainer::const_iterator SingletonConstIter; + + SingletonContainer mSingletonContainer; ///< The container to look up singleton by its type name +}; } // namespace Adaptor } // namespace Internal //////////////////////////////////////////////////////////////////////////////////////////////////// -Internal::Adaptor::SingletonService& GetImplementation(Dali::SingletonService& player) +inline Internal::Adaptor::SingletonService& GetImplementation(Dali::SingletonService& player) { DALI_ASSERT_ALWAYS( player && "SingletonService handle is empty" ); - BaseObject& handle = player.GetBaseObject(); - return static_cast(handle); } -const Internal::Adaptor::SingletonService& GetImplementation(const Dali::SingletonService& player) +inline const Internal::Adaptor::SingletonService& GetImplementation(const Dali::SingletonService& player) { DALI_ASSERT_ALWAYS( player && "SingletonService handle is empty" ); - const BaseObject& handle = player.GetBaseObject(); - return static_cast(handle); } @@ -134,6 +157,11 @@ SingletonService::SingletonService() { } +SingletonService SingletonService::New() +{ + return Internal::Adaptor::SingletonService::New(); +} + SingletonService SingletonService::Get() { return Internal::Adaptor::SingletonService::Get(); @@ -148,6 +176,11 @@ void SingletonService::Register( const std::type_info& info, BaseHandle singleto GetImplementation( *this ).Register( info, singleton ); } +void SingletonService::UnregisterAll() +{ + GetImplementation( *this ).UnregisterAll(); +} + BaseHandle SingletonService::GetSingleton( const std::type_info& info ) const { return GetImplementation( *this ).GetSingleton( info );