summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Nazarov <i.nazarov@samsung.com>2017-06-14 14:17:00 +0300
committerIgor Nazarov <i.nazarov@samsung.com>2017-06-14 21:40:15 +0300
commit37fd7cc264588d6cb838494ad8a1c9501fa8f9d4 (patch)
tree54a67acbbbff445d1aa29bd0f3a11a65e92718de
parente7c62ecf56984f6f5fc651f5c22aaa72fa293409 (diff)
downloadgallery-37fd7cc264588d6cb838494ad8a1c9501fa8f9d4.tar.gz
gallery-37fd7cc264588d6cb838494ad8a1c9501fa8f9d4.tar.bz2
gallery-37fd7cc264588d6cb838494ad8a1c9501fa8f9d4.zip
TizenRefApp-8670 [Gallery] Reimplement UCL memory module
Change-Id: I152c4353e54b99719b472e6e07a5f91c2936cb14
-rw-r--r--inc/gallery/model/Gallery.h2
-rw-r--r--inc/gallery/model/MediaItem.h2
-rw-r--r--inc/gallery/model/SoundManager.h2
-rw-r--r--inc/gallery/presenters/AlertDialog.h4
-rw-r--r--inc/gallery/presenters/AtspiHighlightHelper.h4
-rw-r--r--inc/gallery/presenters/Instance.h2
-rw-r--r--inc/gallery/presenters/MoreOptionsPresenter.h4
-rw-r--r--inc/gallery/presenters/NoContentPage.h4
-rw-r--r--inc/gallery/presenters/Page.h2
-rw-r--r--inc/gallery/presenters/Presenter.h2
-rw-r--r--inc/gallery/presenters/PreviewPage.h4
-rw-r--r--inc/gallery/presenters/ProcessingPresenter.h4
-rw-r--r--inc/gallery/presenters/SelectModePresenter.h4
-rw-r--r--inc/gallery/presenters/ThumbnailPage.h4
-rw-r--r--inc/gallery/presenters/VideoPlayerPage.h4
-rw-r--r--inc/gallery/presenters/ViewerPage.h4
-rw-r--r--inc/gallery/view/ImageGrid.h6
-rw-r--r--inc/gallery/view/ImageViewer.h6
-rw-r--r--inc/gallery/view/PageContent.h6
-rw-r--r--inc/gallery/view/TouchParser.h4
-rw-r--r--src/common.h4
-rw-r--r--src/model/GalleryAlbum.h2
-rw-r--r--src/model/MediaItem.cpp7
-rw-r--r--src/presenters/AlertDialog.cpp19
-rw-r--r--src/presenters/AtspiHighlightHelper.cpp2
-rw-r--r--src/presenters/Instance.cpp28
-rw-r--r--src/presenters/MoreOptionsPresenter.cpp23
-rw-r--r--src/presenters/NoContentPage.cpp2
-rw-r--r--src/presenters/Page.cpp2
-rw-r--r--src/presenters/Presenter.cpp2
-rw-r--r--src/presenters/PreviewPage.cpp21
-rw-r--r--src/presenters/ProcessingPresenter.cpp15
-rw-r--r--src/presenters/SelectModePresenter.cpp6
-rw-r--r--src/presenters/ThumbnailPage.cpp17
-rw-r--r--src/presenters/VideoPlayerPage.cpp9
-rw-r--r--src/presenters/ViewerPage.cpp2
-rw-r--r--src/view/ImageGrid.cpp28
-rw-r--r--src/view/ImageViewer.cpp4
-rw-r--r--src/view/PageContent.cpp27
-rw-r--r--src/view/TouchParser.cpp2
-rw-r--r--ucl/inc/ucl/gui/EdjeWidget.h2
-rw-r--r--ucl/inc/ucl/gui/EdjeWidget.hpp2
-rw-r--r--ucl/inc/ucl/gui/ElmWidget.h4
-rw-r--r--ucl/inc/ucl/gui/Layout.h2
-rw-r--r--ucl/inc/ucl/gui/Naviframe.h4
-rw-r--r--ucl/inc/ucl/gui/StyledWidget.h2
-rw-r--r--ucl/inc/ucl/gui/Widget.h6
-rw-r--r--ucl/inc/ucl/gui/Window.h4
-rw-r--r--ucl/inc/ucl/gui/Window.hpp2
-rw-r--r--ucl/inc/ucl/misc/Event.hpp7
-rw-r--r--ucl/inc/ucl/misc/RefCountAware.h7
-rw-r--r--ucl/inc/ucl/misc/RefCountAware.hpp2
-rw-r--r--ucl/inc/ucl/misc/Timeout.h2
-rw-r--r--ucl/inc/ucl/util/delegation/BaseDelegate.h4
-rw-r--r--ucl/inc/ucl/util/delegation/BaseDelegate.hpp7
-rw-r--r--ucl/inc/ucl/util/delegation/Delegate.h2
-rw-r--r--ucl/inc/ucl/util/delegation/Delegate.hpp6
-rw-r--r--ucl/inc/ucl/util/delegation/Delegate2.h2
-rw-r--r--ucl/inc/ucl/util/delegation/Delegate2.hpp6
-rw-r--r--ucl/inc/ucl/util/delegation/helpers.h24
-rw-r--r--ucl/inc/ucl/util/memory.h1
-rw-r--r--ucl/inc/ucl/util/memory/BaseRef.h14
-rw-r--r--ucl/inc/ucl/util/memory/BaseRef.hpp24
-rw-r--r--ucl/inc/ucl/util/memory/IRefCountObj.h (renamed from ucl/inc/ucl/util/memory/RefCountObjBase.h)36
-rw-r--r--ucl/inc/ucl/util/memory/RefCountObj.h87
-rw-r--r--ucl/inc/ucl/util/memory/RefCountObj.hpp68
-rw-r--r--ucl/inc/ucl/util/memory/RefCountObjBase.hpp74
-rw-r--r--ucl/inc/ucl/util/memory/RefCounterMT.h41
-rw-r--r--ucl/inc/ucl/util/memory/RefCounterMT.hpp53
-rw-r--r--ucl/inc/ucl/util/memory/RefCounterST.h41
-rw-r--r--ucl/inc/ucl/util/memory/RefCounterST.hpp46
-rw-r--r--ucl/inc/ucl/util/memory/ReffedObj.h58
-rw-r--r--ucl/inc/ucl/util/memory/ReffedObj.hpp44
-rw-r--r--ucl/inc/ucl/util/memory/SharedRef.h12
-rw-r--r--ucl/inc/ucl/util/memory/SharedRef.hpp39
-rw-r--r--ucl/inc/ucl/util/memory/WeakRef.h8
-rw-r--r--ucl/inc/ucl/util/memory/WeakRef.hpp19
-rw-r--r--ucl/inc/ucl/util/memory/helpers.h46
-rw-r--r--ucl/inc/ucl/util/smartDelegation/WeakDelegate.h2
-rw-r--r--ucl/inc/ucl/util/smartDelegation/WeakDelegate.hpp10
-rw-r--r--ucl/inc/ucl/util/types/baseTypes.h1
-rw-r--r--ucl/src/gui/ElmWidget.cpp2
-rw-r--r--ucl/src/gui/Naviframe.cpp2
-rw-r--r--ucl/src/gui/Widget.cpp6
84 files changed, 728 insertions, 399 deletions
diff --git a/inc/gallery/model/Gallery.h b/inc/gallery/model/Gallery.h
index 1a711f9..e17b1f5 100644
--- a/inc/gallery/model/Gallery.h
+++ b/inc/gallery/model/Gallery.h
@@ -31,7 +31,7 @@ namespace gallery {
IMediaAlbumSRef getAlbum();
private:
- friend class ucl::RefCountObj<Gallery>;
+ friend class ucl::ReffedObj<Gallery>;
Gallery();
ucl::Result prepare();
diff --git a/inc/gallery/model/MediaItem.h b/inc/gallery/model/MediaItem.h
index df35b8d..7b6eea0 100644
--- a/inc/gallery/model/MediaItem.h
+++ b/inc/gallery/model/MediaItem.h
@@ -87,7 +87,7 @@ namespace gallery {
ucl::Result saveToDevice();
protected:
- friend class ucl::RefCountObj<MediaItem>;
+ friend class ucl::ReffedObj<MediaItem>;
MediaItem(int flags, MediaType type);
ucl::Result prepare(media_info_h media);
diff --git a/inc/gallery/model/SoundManager.h b/inc/gallery/model/SoundManager.h
index df5e36a..e5adddb 100644
--- a/inc/gallery/model/SoundManager.h
+++ b/inc/gallery/model/SoundManager.h
@@ -43,7 +43,7 @@ namespace gallery {
void delMediaVolumeChangeHandler(const NotiHandler &handler);
private:
- friend class ucl::RefCountObj<SoundManager>;
+ friend class ucl::ReffedObj<SoundManager>;
SoundManager();
~SoundManager();
diff --git a/inc/gallery/presenters/AlertDialog.h b/inc/gallery/presenters/AlertDialog.h
index 59274a2..ce508ff 100644
--- a/inc/gallery/presenters/AlertDialog.h
+++ b/inc/gallery/presenters/AlertDialog.h
@@ -66,8 +66,8 @@ namespace gallery {
virtual bool isDisposed() const final override;
private:
- friend class ucl::RefCountObj<AlertDialog>;
- AlertDialog(ucl::RefCountObjBase &rc,
+ friend class ucl::ReffedObj<AlertDialog>;
+ AlertDialog(ucl::IRefCountObj &rc,
const EventHandler &handler);
virtual ~AlertDialog();
diff --git a/inc/gallery/presenters/AtspiHighlightHelper.h b/inc/gallery/presenters/AtspiHighlightHelper.h
index b84471e..ca908e0 100644
--- a/inc/gallery/presenters/AtspiHighlightHelper.h
+++ b/inc/gallery/presenters/AtspiHighlightHelper.h
@@ -35,8 +35,8 @@ namespace gallery {
void registerWidget(ucl::ElmWidget &widget);
private:
- friend class ucl::RefCountObj<AtspiHighlightHelper>;
- AtspiHighlightHelper(ucl::RefCountObjBase &rc);
+ friend class ucl::ReffedObj<AtspiHighlightHelper>;
+ AtspiHighlightHelper(ucl::IRefCountObj &rc);
virtual ~AtspiHighlightHelper();
ucl::Result prepare(ucl::ElmWidget &rootWidget);
diff --git a/inc/gallery/presenters/Instance.h b/inc/gallery/presenters/Instance.h
index 2fee458..bdc4fa6 100644
--- a/inc/gallery/presenters/Instance.h
+++ b/inc/gallery/presenters/Instance.h
@@ -33,7 +33,7 @@ namespace gallery {
public ucl::IInstance,
public ucl::IInstanceAppControlExt {
public:
- Instance(ucl::RefCountObjBase &rc,
+ Instance(ucl::IRefCountObj &rc,
ucl::SysEventProvider &sysEventProvider);
virtual ~Instance();
diff --git a/inc/gallery/presenters/MoreOptionsPresenter.h b/inc/gallery/presenters/MoreOptionsPresenter.h
index c959b3c..de89f1a 100644
--- a/inc/gallery/presenters/MoreOptionsPresenter.h
+++ b/inc/gallery/presenters/MoreOptionsPresenter.h
@@ -76,8 +76,8 @@ namespace gallery {
using MoreOptionsCSRef = ucl::SharedRef<const MoreOptions>;
private:
- friend class ucl::RefCountObj<MoreOptionsPresenter>;
- MoreOptionsPresenter(ucl::RefCountObjBase &rc,
+ friend class ucl::ReffedObj<MoreOptionsPresenter>;
+ MoreOptionsPresenter(ucl::IRefCountObj &rc,
const MoreOptionsCSRef &options);
virtual ~MoreOptionsPresenter();
diff --git a/inc/gallery/presenters/NoContentPage.h b/inc/gallery/presenters/NoContentPage.h
index b02900d..c61fbf2 100644
--- a/inc/gallery/presenters/NoContentPage.h
+++ b/inc/gallery/presenters/NoContentPage.h
@@ -37,8 +37,8 @@ namespace gallery {
};
private:
- friend class ucl::RefCountObj<NoContentPage>;
- NoContentPage(ucl::RefCountObjBase &rc, const ucl::NaviframeSRef &navi,
+ friend class ucl::ReffedObj<NoContentPage>;
+ NoContentPage(ucl::IRefCountObj &rc, const ucl::NaviframeSRef &navi,
const ExitRequestHandler &onExitRequest);
virtual ~NoContentPage();
diff --git a/inc/gallery/presenters/Page.h b/inc/gallery/presenters/Page.h
index 4be629e..c1a1b29 100644
--- a/inc/gallery/presenters/Page.h
+++ b/inc/gallery/presenters/Page.h
@@ -49,7 +49,7 @@ namespace gallery {
ucl::NaviItem insertBefore(ARGS &&...args);
protected:
- Page(ucl::RefCountObjBase &rc, const ucl::NaviframeSRef &navi,
+ Page(ucl::IRefCountObj &rc, const ucl::NaviframeSRef &navi,
const ExitRequestHandler &onExitRequest);
virtual ~Page();
diff --git a/inc/gallery/presenters/Presenter.h b/inc/gallery/presenters/Presenter.h
index 4ed3530..1142452 100644
--- a/inc/gallery/presenters/Presenter.h
+++ b/inc/gallery/presenters/Presenter.h
@@ -42,7 +42,7 @@ namespace gallery {
void deactivateBy(void *deactivator);
protected:
- Presenter(ucl::RefCountObjBase &rc);
+ Presenter(ucl::IRefCountObj &rc);
virtual ~Presenter();
ucl::Result prepare(ucl::ElmWidget &widget);
diff --git a/inc/gallery/presenters/PreviewPage.h b/inc/gallery/presenters/PreviewPage.h
index a93691b..c499db6 100644
--- a/inc/gallery/presenters/PreviewPage.h
+++ b/inc/gallery/presenters/PreviewPage.h
@@ -62,8 +62,8 @@ namespace gallery {
int getCurrentItemIndex() const;
private:
- friend class ucl::RefCountObj<PreviewPage>;
- PreviewPage(ucl::RefCountObjBase &rc, const ucl::NaviframeSRef &navi,
+ friend class ucl::ReffedObj<PreviewPage>;
+ PreviewPage(ucl::IRefCountObj &rc, const ucl::NaviframeSRef &navi,
const ExitRequestHandler &onExitRequest,
const IMediaAlbumSRef &album, bool selectModeStartup);
virtual ~PreviewPage();
diff --git a/inc/gallery/presenters/ProcessingPresenter.h b/inc/gallery/presenters/ProcessingPresenter.h
index 59ff50f..94e1e80 100644
--- a/inc/gallery/presenters/ProcessingPresenter.h
+++ b/inc/gallery/presenters/ProcessingPresenter.h
@@ -53,8 +53,8 @@ namespace gallery {
void setDismissHandler(const DismissHandler &handler);
private:
- friend class ucl::RefCountObj<ProcessingPresenter>;
- ProcessingPresenter(ucl::RefCountObjBase &rc);
+ friend class ucl::ReffedObj<ProcessingPresenter>;
+ ProcessingPresenter(ucl::IRefCountObj &rc);
virtual ~ProcessingPresenter();
ucl::Result prepare(ucl::ElmWidget &parent,
diff --git a/inc/gallery/presenters/SelectModePresenter.h b/inc/gallery/presenters/SelectModePresenter.h
index 72c014f..2ba0a56 100644
--- a/inc/gallery/presenters/SelectModePresenter.h
+++ b/inc/gallery/presenters/SelectModePresenter.h
@@ -72,8 +72,8 @@ namespace gallery {
void update(int selectCount, int totalCount = -1);
private:
- friend class ucl::RefCountObj<SelectModePresenter>;
- SelectModePresenter(ucl::RefCountObjBase &rc,
+ friend class ucl::ReffedObj<SelectModePresenter>;
+ SelectModePresenter(ucl::IRefCountObj &rc,
PageContent &content, int flags);
virtual ~SelectModePresenter();
diff --git a/inc/gallery/presenters/ThumbnailPage.h b/inc/gallery/presenters/ThumbnailPage.h
index ccfe14e..914d759 100644
--- a/inc/gallery/presenters/ThumbnailPage.h
+++ b/inc/gallery/presenters/ThumbnailPage.h
@@ -49,8 +49,8 @@ namespace gallery {
};
private:
- friend class ucl::RefCountObj<ThumbnailPage>;
- ThumbnailPage(ucl::RefCountObjBase &rc, const ucl::NaviframeSRef &navi,
+ friend class ucl::ReffedObj<ThumbnailPage>;
+ ThumbnailPage(ucl::IRefCountObj &rc, const ucl::NaviframeSRef &navi,
const ExitRequestHandler &onExitRequest,
const IMediaAlbumSRef &album);
virtual ~ThumbnailPage();
diff --git a/inc/gallery/presenters/VideoPlayerPage.h b/inc/gallery/presenters/VideoPlayerPage.h
index 64732fa..9a61a4e 100644
--- a/inc/gallery/presenters/VideoPlayerPage.h
+++ b/inc/gallery/presenters/VideoPlayerPage.h
@@ -48,8 +48,8 @@ namespace gallery {
};
private:
- friend class ucl::RefCountObj<VideoPlayerPage>;
- VideoPlayerPage(ucl::RefCountObjBase &rc,
+ friend class ucl::ReffedObj<VideoPlayerPage>;
+ VideoPlayerPage(ucl::IRefCountObj &rc,
const ucl::NaviframeSRef &navi,
const ExitRequestHandler &onExitRequest,
const MediaItemSRef &media);
diff --git a/inc/gallery/presenters/ViewerPage.h b/inc/gallery/presenters/ViewerPage.h
index 6cb80ad..82ecc92 100644
--- a/inc/gallery/presenters/ViewerPage.h
+++ b/inc/gallery/presenters/ViewerPage.h
@@ -60,8 +60,8 @@ namespace gallery {
const std::string &getMediaId() const;
private:
- friend class ucl::RefCountObj<ViewerPage>;
- ViewerPage(ucl::RefCountObjBase &rc, const ucl::NaviframeSRef &navi,
+ friend class ucl::ReffedObj<ViewerPage>;
+ ViewerPage(ucl::IRefCountObj &rc, const ucl::NaviframeSRef &navi,
const ExitRequestHandler &onExitRequest,
const MediaItemSRef &media, bool exitOnZoomOut);
virtual ~ViewerPage();
diff --git a/inc/gallery/view/ImageGrid.h b/inc/gallery/view/ImageGrid.h
index 31aa0a5..e21a367 100644
--- a/inc/gallery/view/ImageGrid.h
+++ b/inc/gallery/view/ImageGrid.h
@@ -129,8 +129,8 @@ namespace gallery {
struct LinearInfo;
private:
- friend class ucl::RefCountObj<ImageGrid>;
- ImageGrid(ucl::RefCountObjBase *rc, Evas_Object *scroller,
+ friend class ucl::ReffedObj<ImageGrid>;
+ ImageGrid(ucl::IRefCountObj *rc, Evas_Object *scroller,
Type type, bool selectModeStartup);
virtual ~ImageGrid();
@@ -243,7 +243,7 @@ namespace gallery {
private:
const Info &m_info;
- ucl::StyledWidgetWRef m_scroller;
+ ucl::StyledWidget *m_scroller;
ucl::ElmWidget m_box;
ucl::Widget m_rect1;
ucl::Widget m_rect2;
diff --git a/inc/gallery/view/ImageViewer.h b/inc/gallery/view/ImageViewer.h
index 5b6f215..9b6e5d8 100644
--- a/inc/gallery/view/ImageViewer.h
+++ b/inc/gallery/view/ImageViewer.h
@@ -53,8 +53,8 @@ namespace gallery {
bool isZoomedOut() const;
private:
- friend class ucl::RefCountObj<ImageViewer>;
- ImageViewer(ucl::RefCountObjBase &rc, Evas_Object *scroller,
+ friend class ucl::ReffedObj<ImageViewer>;
+ ImageViewer(ucl::IRefCountObj &rc, Evas_Object *scroller,
const std::string &highResPath, int loadSize, bool forceLoad);
virtual ~ImageViewer();
@@ -85,7 +85,7 @@ namespace gallery {
};
private:
- ucl::StyledWidgetWRef m_scroller;
+ ucl::StyledWidget *m_scroller;
ucl::Layout m_layout;
ucl::Widget m_grid;
ucl::Widget m_lowResImage;
diff --git a/inc/gallery/view/PageContent.h b/inc/gallery/view/PageContent.h
index 9e581b4..194c97b 100644
--- a/inc/gallery/view/PageContent.h
+++ b/inc/gallery/view/PageContent.h
@@ -63,8 +63,8 @@ namespace gallery {
ucl::Result setMoreOptionsVisible(bool visible);
private:
- friend class ucl::RefCountObj<PageContent>;
- PageContent(ucl::RefCountObjBase &rc,
+ friend class ucl::ReffedObj<PageContent>;
+ PageContent(ucl::IRefCountObj &rc,
const ucl::LayoutSRef &layout, int flags);
virtual ~PageContent();
@@ -76,7 +76,7 @@ namespace gallery {
ucl::Layout *getTopLayout() const;
private:
- ucl::LayoutWRef m_moreOptions;
+ ucl::Layout *m_mainLayout;
ucl::LayoutSRef m_selectMode;
ucl::LayoutSRef m_bottomButton;
};
diff --git a/inc/gallery/view/TouchParser.h b/inc/gallery/view/TouchParser.h
index 484fb84..be391a3 100644
--- a/inc/gallery/view/TouchParser.h
+++ b/inc/gallery/view/TouchParser.h
@@ -30,8 +30,8 @@ namespace gallery {
using TapHandler = ucl::WeakDelegate<void(int x, int y)>;
private:
- friend class ucl::RefCountObj<TouchParser>;
- TouchParser(ucl::RefCountObjBase &rc, ucl::Widget &eventSource);
+ friend class ucl::ReffedObj<TouchParser>;
+ TouchParser(ucl::IRefCountObj &rc, ucl::Widget &eventSource);
virtual ~TouchParser();
public:
diff --git a/src/common.h b/src/common.h
index d6d7bae..43890c0 100644
--- a/src/common.h
+++ b/src/common.h
@@ -46,8 +46,8 @@ namespace gallery {
using ucl::isNotEmpty;
using ucl::toEina;
- using ucl::RefCountObj;
- using ucl::RefCountObjBase;
+ using ucl::ReffedObj;
+ using ucl::IRefCountObj;
using ucl::SharedRef;
using ucl::WeakRef;
diff --git a/src/model/GalleryAlbum.h b/src/model/GalleryAlbum.h
index 57f7e48..715b708 100644
--- a/src/model/GalleryAlbum.h
+++ b/src/model/GalleryAlbum.h
@@ -47,7 +47,7 @@ namespace gallery {
virtual void defragment() final override;
private:
- friend class ucl::RefCountObj<GalleryAlbum>;
+ friend class ucl::ReffedObj<GalleryAlbum>;
GalleryAlbum();
ucl::Result prepare();
diff --git a/src/model/MediaItem.cpp b/src/model/MediaItem.cpp
index ac8c3ef..a0db727 100644
--- a/src/model/MediaItem.cpp
+++ b/src/model/MediaItem.cpp
@@ -334,7 +334,10 @@ namespace gallery {
if (!(m_flags & FLAG_REMOVE)) {
LOG_RETURN(RES_NOT_SUPPORTED, "Operation not supported!");
}
- if (!ecore_file_can_write(m_filePath.c_str())) {
+
+ const bool exists = ecore_file_exists(m_filePath.c_str());
+
+ if (exists && !ecore_file_can_write(m_filePath.c_str())) {
LOG_RETURN(RES_FAIL, "File can't be removed!");
}
@@ -350,7 +353,7 @@ namespace gallery {
m_isValid = false;
}
- if (!ecore_file_remove(m_filePath.c_str())) {
+ if (exists && !ecore_file_remove(m_filePath.c_str())) {
FLOG("ecore_file_remove() failed! Attempting to rescan....");
MutexLock lock(getMediaMutex());
const int ret = media_content_scan_file(m_filePath.c_str());
diff --git a/src/presenters/AlertDialog.cpp b/src/presenters/AlertDialog.cpp
index 57b06d6..da1ebe1 100644
--- a/src/presenters/AlertDialog.cpp
+++ b/src/presenters/AlertDialog.cpp
@@ -108,7 +108,7 @@ namespace gallery {
// AlertDialog //
- AlertDialog::AlertDialog(RefCountObjBase &rc,
+ AlertDialog::AlertDialog(IRefCountObj &rc,
const EventHandler &handler) :
Presenter(rc),
m_handler(handler),
@@ -170,14 +170,16 @@ namespace gallery {
Result AlertDialog::createLayout(const LayoutTheme theme)
{
- m_layout = Layout::Builder().
+ const auto layout = Layout::Builder().
setTheme(theme).
build(*m_popup);
- if (!m_layout) {
+ if (!layout) {
LOG_RETURN(RES_FAIL, "Layout::build() failed!");
}
- m_popup->setContent(*m_layout);
+ m_popup->setContent(*layout);
+
+ m_layout = layout;
return RES_OK;
}
@@ -215,15 +217,15 @@ namespace gallery {
void AlertDialog::setTitle(const TString &title)
{
- if (m_layout) {
- m_layout->setText(title, PART_TITLE);
+ if (const auto layout = m_layout.lock()) {
+ layout->setText(title, PART_TITLE);
}
}
void AlertDialog::setText(const TString &text)
{
- if (m_layout) {
- m_layout->setText(text);
+ if (const auto layout = m_layout.lock()) {
+ layout->setText(text);
}
}
@@ -256,7 +258,6 @@ namespace gallery {
void AlertDialog::handleEvent(const Event event)
{
- const auto keepAliver = asShared(*this);
if (dispatchEvent(event)) {
dismiss();
}
diff --git a/src/presenters/AtspiHighlightHelper.cpp b/src/presenters/AtspiHighlightHelper.cpp
index 08cd14e..ad589c6 100644
--- a/src/presenters/AtspiHighlightHelper.cpp
+++ b/src/presenters/AtspiHighlightHelper.cpp
@@ -40,7 +40,7 @@ namespace gallery {
return result;
}
- AtspiHighlightHelper::AtspiHighlightHelper(RefCountObjBase &rc) :
+ AtspiHighlightHelper::AtspiHighlightHelper(IRefCountObj &rc) :
Presenter(rc)
{
}
diff --git a/src/presenters/Instance.cpp b/src/presenters/Instance.cpp
index fbefd8e..2824d4e 100644
--- a/src/presenters/Instance.cpp
+++ b/src/presenters/Instance.cpp
@@ -45,7 +45,7 @@ namespace gallery {
using ucl::Theme;
using ucl::Naviframe;
- Instance::Instance(RefCountObjBase &rc,
+ Instance::Instance(IRefCountObj &rc,
SysEventProvider &sysEventProvider) :
RefCountAware(&rc),
m_sysEventProvider(sysEventProvider),
@@ -58,8 +58,8 @@ namespace gallery {
Instance::~Instance()
{
stopMediaContentScan();
- if (m_page) {
- m_page->exitNoTransition();
+ if (const auto page = m_page.lock()) {
+ page->exitNoTransition();
}
}
@@ -208,14 +208,14 @@ namespace gallery {
{
FAIL_RETURN(ensureGalleryModel(), "ensureGalleryModel() failed!");
- if (!m_page) {
- if (isEmpty(m_gallery->getAlbum())) {
- createNoContentPage();
- } else {
- createThumbnailPage();
+ if (const auto page = m_page.lock()) {
+ if (operation == APP_CONTROL_OPERATION_MAIN) {
+ page->deleteTo();
}
- } else if (operation == APP_CONTROL_OPERATION_MAIN) {
- m_page->deleteTo();
+ } else if (isEmpty(m_gallery->getAlbum())) {
+ createNoContentPage();
+ } else {
+ createThumbnailPage();
}
return RES_OK;
@@ -319,13 +319,13 @@ namespace gallery {
void Instance::onAlbumChanged()
{
if (isEmpty(m_gallery->getAlbum())) {
- if (dynamic_cast<ThumbnailPage *>(m_page.get())) {
- m_page->exitNoTransition();
+ if (auto page = dynamicRefCast<ThumbnailPage>(m_page).lock()) {
+ page->exitNoTransition();
createNoContentPage();
}
} else {
- if (dynamic_cast<NoContentPage *>(m_page.get())) {
- m_page->exitNoTransition();
+ if (auto page = dynamicRefCast<NoContentPage>(m_page).lock()) {
+ page->exitNoTransition();
createThumbnailPage();
}
}
diff --git a/src/presenters/MoreOptionsPresenter.cpp b/src/presenters/MoreOptionsPresenter.cpp
index f0d902f..15492dc 100644
--- a/src/presenters/MoreOptionsPresenter.cpp
+++ b/src/presenters/MoreOptionsPresenter.cpp
@@ -99,7 +99,7 @@ namespace gallery {
// MoreOptionsPresenter //
- MoreOptionsPresenter::MoreOptionsPresenter(RefCountObjBase &rc,
+ MoreOptionsPresenter::MoreOptionsPresenter(IRefCountObj &rc,
const MoreOptionsCSRef &options) :
Presenter(rc),
m_options(options),
@@ -207,11 +207,10 @@ namespace gallery {
void MoreOptionsPresenter::onOpened(Widget &widget, void *eventInfo)
{
stopTimer();
- const auto keepAliver = asShared(*this);
sendDeactivateBy(*m_widget, this);
activateBy(m_widget.get());
- if (m_listener) {
- m_listener->onMoreOptionsOpened(*this);
+ if (const auto listener = m_listener.lock()) {
+ listener->onMoreOptionsOpened(*this);
}
if (!isActive()) {
setOpened(false);
@@ -221,20 +220,22 @@ namespace gallery {
void MoreOptionsPresenter::onClosed(Widget &widget, void *eventInfo)
{
stopTimer();
- const auto keepAliver = asShared(*this);
deactivateBy(m_widget.get());
sendActivateBy(*m_widget, this);
- if (m_listener) {
- m_listener->onMoreOptionsClosed(*this);
+ if (const auto listener = m_listener.lock()) {
+ listener->onMoreOptionsClosed(*this);
}
}
void MoreOptionsPresenter::onItemClicked(Widget &widget, void *eventInfo)
{
- if (m_listener && isActive() && isOpened()) {
+ if (!isActive() || !isOpened()) {
+ return;
+ }
+ if (const auto listener = m_listener.lock()) {
const auto item = m_map.get(eventInfo);
if (item) {
- m_listener->onMoreOptionClicked(*this, *item);
+ listener->onMoreOptionClicked(*this, *item);
} else {
ELOG("Invalid eventInfo!");
}
@@ -243,10 +244,10 @@ namespace gallery {
void MoreOptionsPresenter::onItemSelected(Widget &widget, void *eventInfo)
{
- if (m_listener) {
+ if (const auto listener = m_listener.lock()) {
const auto item = m_map.get(eventInfo);
if (item) {
- m_listener->onMoreOptionSelected(*this, *item);
+ listener->onMoreOptionSelected(*this, *item);
} else {
ELOG("Invalid eventInfo!");
}
diff --git a/src/presenters/NoContentPage.cpp b/src/presenters/NoContentPage.cpp
index db5c2d6..5dc69b3 100644
--- a/src/presenters/NoContentPage.cpp
+++ b/src/presenters/NoContentPage.cpp
@@ -67,7 +67,7 @@ namespace gallery {
// NoContentPage //
- NoContentPage::NoContentPage(RefCountObjBase &rc,
+ NoContentPage::NoContentPage(IRefCountObj &rc,
const NaviframeSRef &navi,
const ExitRequestHandler &onExitRequest) :
Page(rc, navi, onExitRequest)
diff --git a/src/presenters/Page.cpp b/src/presenters/Page.cpp
index 39a6930..43ed768 100644
--- a/src/presenters/Page.cpp
+++ b/src/presenters/Page.cpp
@@ -31,7 +31,7 @@ namespace gallery {
using ucl::NAVI_TRANSITION_STARTED;
using ucl::NAVI_TRANSITION_FINISHED;
- Page::Page(RefCountObjBase &rc, const NaviframeSRef &navi,
+ Page::Page(IRefCountObj &rc, const NaviframeSRef &navi,
const ExitRequestHandler &onExitRequest) :
Presenter(rc),
m_navi(navi),
diff --git a/src/presenters/Presenter.cpp b/src/presenters/Presenter.cpp
index 13f2856..dcbd7d9 100644
--- a/src/presenters/Presenter.cpp
+++ b/src/presenters/Presenter.cpp
@@ -28,7 +28,7 @@ namespace gallery {
using ucl::Window;
- Presenter::Presenter(RefCountObjBase &rc) :
+ Presenter::Presenter(IRefCountObj &rc) :
RefCountAware(&rc),
m_isPrepared(false)
{
diff --git a/src/presenters/PreviewPage.cpp b/src/presenters/PreviewPage.cpp
index 05f3f12..b91c7fe 100644
--- a/src/presenters/PreviewPage.cpp
+++ b/src/presenters/PreviewPage.cpp
@@ -118,7 +118,7 @@ namespace gallery {
class PreviewPage::Item : public RefCountAware {
public:
- Item(RefCountObjBase &rc, MediaItemSRef &&media,
+ Item(IRefCountObj &rc, MediaItemSRef &&media,
ImageGrid &imageGrid, const int itemIndex) :
RefCountAware(&rc),
m_media(std::move(media)),
@@ -199,7 +199,7 @@ namespace gallery {
// PreviewPage //
- PreviewPage::PreviewPage(RefCountObjBase &rc,
+ PreviewPage::PreviewPage(IRefCountObj &rc,
const NaviframeSRef &navi,
const ExitRequestHandler &onExitRequest,
const IMediaAlbumSRef &album,
@@ -215,9 +215,13 @@ namespace gallery {
PreviewPage::~PreviewPage()
{
+ if (m_album) {
+ m_album->delChangeHandler(WEAK_DELEGATE(
+ PreviewPage::onAlbumChanged, asWeak(*this)));
+ }
closeTempViews();
- if (m_page) {
- m_page->exitNoTransition();
+ if (const auto page = m_page.lock()) {
+ page->exitNoTransition();
}
if (m_imageGrid) {
m_imageGrid->setListener(nullptr);
@@ -253,9 +257,8 @@ namespace gallery {
void PreviewPage::checkViewerPage()
{
- if (const ViewerPageSRef viewerPage =
- dynamicRefCast<ViewerPage>(m_page)) {
- const auto mediaId = viewerPage->getMediaId();
+ if (const auto page = dynamicRefCast<ViewerPage>(m_page).lock()) {
+ const auto mediaId = page->getMediaId();
const auto it = std::find_if(m_items.begin(), m_items.end(),
[&mediaId](const ItemSRef &item)
{
@@ -645,8 +648,8 @@ namespace gallery {
void PreviewPage::closeTempViews()
{
- if (m_alert) {
- m_alert->dispose();
+ if (const auto alert = m_alert.lock()) {
+ alert->dispose();
}
if (m_more) {
m_more->setOpened(false);
diff --git a/src/presenters/ProcessingPresenter.cpp b/src/presenters/ProcessingPresenter.cpp
index 90e679e..63bf0cd 100644
--- a/src/presenters/ProcessingPresenter.cpp
+++ b/src/presenters/ProcessingPresenter.cpp
@@ -86,7 +86,7 @@ namespace gallery {
// ProcessingPresenter //
- ProcessingPresenter::ProcessingPresenter(RefCountObjBase &rc) :
+ ProcessingPresenter::ProcessingPresenter(IRefCountObj &rc) :
Presenter(rc),
m_iconType(IconType::NONE),
m_timer(nullptr),
@@ -202,14 +202,16 @@ namespace gallery {
Result ProcessingPresenter::createIcon()
{
- m_icon = Layout::Builder().
+ const auto icon = Layout::Builder().
setTheme(impl::LAYOUT_POPUP_ICON).
build(*m_popup);
- if (!m_icon) {
+ if (!icon) {
LOG_RETURN(RES_FAIL, "Layout::build() failed!");
}
- m_popup->setContent(*m_icon, impl::PART_TOAST_ICON);
+ m_popup->setContent(*icon, impl::PART_TOAST_ICON);
+
+ m_icon = icon;
return RES_OK;
}
@@ -283,9 +285,9 @@ namespace gallery {
void ProcessingPresenter::animateIcon()
{
- if (m_icon) {
+ if (const auto icon = m_icon.lock()) {
if (m_iconType == IconType::CHECK) {
- m_icon->emit(impl::SIGNAL_ANIMATE_CHECK);
+ icon->emit(impl::SIGNAL_ANIMATE_CHECK);
}
}
}
@@ -321,7 +323,6 @@ namespace gallery {
void ProcessingPresenter::onPopupDismissed(Widget &widget, void *eventInfo)
{
- const auto keepAliver = asShared(*this);
if (m_dismissHandler) {
m_dismissHandler();
}
diff --git a/src/presenters/SelectModePresenter.cpp b/src/presenters/SelectModePresenter.cpp
index d0fec2c..c3e0c9c 100644
--- a/src/presenters/SelectModePresenter.cpp
+++ b/src/presenters/SelectModePresenter.cpp
@@ -65,7 +65,7 @@ namespace gallery {
// SelectModePresenter //
- SelectModePresenter::SelectModePresenter(RefCountObjBase &rc,
+ SelectModePresenter::SelectModePresenter(IRefCountObj &rc,
PageContent &content, const int flags) :
Presenter(rc),
m_content(asShared(content)),
@@ -316,8 +316,8 @@ namespace gallery {
void SelectModePresenter::dispatchEvent(const Event event)
{
- if (m_listener) {
- m_listener->onSelectModeEvent(event);
+ if (const auto listener = m_listener.lock()) {
+ listener->onSelectModeEvent(event);
}
}
diff --git a/src/presenters/ThumbnailPage.cpp b/src/presenters/ThumbnailPage.cpp
index 65e51f3..c6defbb 100644
--- a/src/presenters/ThumbnailPage.cpp
+++ b/src/presenters/ThumbnailPage.cpp
@@ -89,7 +89,7 @@ namespace gallery {
class ThumbnailPage::RealizedItem : public RefCountAware {
public:
- RealizedItem(RefCountObjBase &rc,
+ RealizedItem(IRefCountObj &rc,
ThumbnailPage &parent, const int index) :
RefCountAware(&rc),
m_parent(parent),
@@ -130,7 +130,7 @@ namespace gallery {
// ThumbnailPage //
- ThumbnailPage::ThumbnailPage(RefCountObjBase &rc,
+ ThumbnailPage::ThumbnailPage(IRefCountObj &rc,
const NaviframeSRef &navi,
const ExitRequestHandler &onExitRequest,
const IMediaAlbumSRef &album) :
@@ -141,11 +141,15 @@ namespace gallery {
ThumbnailPage::~ThumbnailPage()
{
+ if (m_album) {
+ m_album->delChangeHandler(WEAK_DELEGATE(
+ ThumbnailPage::onAlbumChanged, asWeak(*this)));
+ }
if (m_more) {
m_more->setOpened(false);
}
- if (m_page) {
- m_page->exitNoTransition();
+ if (const auto page = m_page.lock()) {
+ page->exitNoTransition();
}
if (m_imageGrid) {
m_imageGrid->setListener(nullptr);
@@ -348,10 +352,9 @@ namespace gallery {
void ThumbnailPage::onPageExitRequest(Page &page)
{
- if (const PreviewPageSRef previewPage =
- dynamicRefCast<PreviewPage>(m_page)) {
+ if (const auto page = dynamicRefCast<PreviewPage>(m_page).lock()) {
m_imageGrid->scrollToItem(getSafeItemIndex(
- previewPage->getCurrentItemIndex()));
+ page->getCurrentItemIndex()));
}
m_page.reset();
popTo();
diff --git a/src/presenters/VideoPlayerPage.cpp b/src/presenters/VideoPlayerPage.cpp
index 96c384d..de3dddb 100644
--- a/src/presenters/VideoPlayerPage.cpp
+++ b/src/presenters/VideoPlayerPage.cpp
@@ -133,7 +133,7 @@ namespace gallery {
// VideoPlayerPage //
- VideoPlayerPage::VideoPlayerPage(RefCountObjBase &rc,
+ VideoPlayerPage::VideoPlayerPage(IRefCountObj &rc,
const NaviframeSRef &navi,
const ExitRequestHandler &onExitRequest,
const MediaItemSRef &media) :
@@ -153,6 +153,13 @@ namespace gallery {
VideoPlayerPage::~VideoPlayerPage()
{
+ if (m_soundMgr) {
+ m_soundMgr->delMediaDeviceStateChangeHandler(WEAK_DELEGATE(
+ VideoPlayerPage::onMediaDeviceStateChanged, asWeak(*this)));
+ m_soundMgr->delMediaVolumeChangeHandler(WEAK_DELEGATE(
+ VideoPlayerPage::onMediaVolumeChanged, asWeak(*this)));
+ }
+
if (isWindowReady()) {
setScreenAlwaysOn(false);
}
diff --git a/src/presenters/ViewerPage.cpp b/src/presenters/ViewerPage.cpp
index e8a7d85..3dbd236 100644
--- a/src/presenters/ViewerPage.cpp
+++ b/src/presenters/ViewerPage.cpp
@@ -114,7 +114,7 @@ namespace gallery {
// ViewerPage //
- ViewerPage::ViewerPage(RefCountObjBase &rc,
+ ViewerPage::ViewerPage(IRefCountObj &rc,
const NaviframeSRef &navi,
const ExitRequestHandler &onExitRequest,
const MediaItemSRef &media,
diff --git a/src/view/ImageGrid.cpp b/src/view/ImageGrid.cpp
index ece8828..a2725b9 100644
--- a/src/view/ImageGrid.cpp
+++ b/src/view/ImageGrid.cpp
@@ -249,8 +249,8 @@ namespace gallery {
private:
class Item : public RefCountAware {
public:
- friend class RefCountObj<Item>;
- Item(RefCountObjBase &rc,
+ friend class ReffedObj<Item>;
+ Item(IRefCountObj &rc,
ImageGrid &imageGrid, ElmWidget &parent) :
RefCountAware(&rc),
m_imageGrid(imageGrid),
@@ -330,8 +330,8 @@ namespace gallery {
if (itemIndex < m_imageGrid.m_itemCount) {
m_realizeIndex = itemIndex;
- if (m_imageGrid.m_listener) {
- m_imageGrid.m_listener->onItemRealized(itemIndex);
+ if (const auto listener = m_imageGrid.m_listener.lock()) {
+ listener->onItemRealized(itemIndex);
}
}
@@ -355,8 +355,8 @@ namespace gallery {
const int itemIndex = m_realizeIndex;
m_realizeIndex = -1;
- if (m_imageGrid.m_listener) {
- m_imageGrid.m_listener->onItemUnrealized(itemIndex);
+ if (const auto listener = m_imageGrid.m_listener.lock()) {
+ listener->onItemUnrealized(itemIndex);
}
}
@@ -743,12 +743,12 @@ namespace gallery {
// ImageGrid //
- ImageGrid::ImageGrid(RefCountObjBase *const rc, Evas_Object *const scroller,
+ ImageGrid::ImageGrid(IRefCountObj *const rc, Evas_Object *const scroller,
const Type type, const bool selectModeStartup) :
ElmWidget(rc, scroller, true),
m_info(getInfo(type)),
- m_scroller(makeShared<StyledWidget>(scroller)),
+ m_scroller(makeShared<StyledWidget>(scroller).get()),
m_box(elm_box_add(*m_scroller)),
m_rect1(evas_object_rectangle_add(m_box.getEvas())),
m_rect2(evas_object_rectangle_add(m_box.getEvas())),
@@ -1009,8 +1009,8 @@ namespace gallery {
eext_rotary_object_event_activated_set(m_circleScroller, EINA_TRUE);
}
- if (m_listener) {
- m_listener->onTransitionFinished();
+ if (const auto listener = m_listener.lock()) {
+ listener->onTransitionFinished();
}
}
@@ -1283,8 +1283,8 @@ namespace gallery {
void ImageGrid::handleItemEvent(const int itemIndex,
const ItemEvent event, const int x, const int y) const
{
- if (m_listener) {
- m_listener->onItemEvent(itemIndex, event, x, y);
+ if (const auto listener = m_listener.lock()) {
+ listener->onItemEvent(itemIndex, event, x, y);
}
}
@@ -1366,8 +1366,8 @@ namespace gallery {
Elm_Interface_Atspi_Accessible *ImageGrid::requestAtspi(const int itemIndex)
{
if ((itemIndex < 0) || (itemIndex >= m_itemCount)) {
- if (m_listener) {
- return m_listener->onAccessObjectRequest(
+ if (const auto listener = m_listener.lock()) {
+ return listener->onAccessObjectRequest(
(itemIndex >= m_itemCount));
}
return nullptr;
diff --git a/src/view/ImageViewer.cpp b/src/view/ImageViewer.cpp
index 606e376..6a53008 100644
--- a/src/view/ImageViewer.cpp
+++ b/src/view/ImageViewer.cpp
@@ -74,12 +74,12 @@ namespace gallery {
// ImageViewer //
- ImageViewer::ImageViewer(RefCountObjBase &rc, Evas_Object *const scroller,
+ ImageViewer::ImageViewer(IRefCountObj &rc, Evas_Object *const scroller,
const std::string &highResPath, const int loadSize,
const bool forceLoad) :
ElmWidget(&rc, scroller, true),
- m_scroller(makeShared<StyledWidget>(scroller)),
+ m_scroller(makeShared<StyledWidget>(scroller).get()),
m_layout(elm_layout_add(*m_scroller)),
m_grid(evas_object_grid_add(m_layout.getEvas())),
m_lowResImage(evas_object_image_filled_add(m_grid.getEvas())),
diff --git a/src/view/PageContent.cpp b/src/view/PageContent.cpp
index 21d601d..32db59e 100644
--- a/src/view/PageContent.cpp
+++ b/src/view/PageContent.cpp
@@ -91,10 +91,10 @@ namespace gallery {
// PageContent //
- PageContent::PageContent(RefCountObjBase &rc,
+ PageContent::PageContent(IRefCountObj &rc,
const LayoutSRef &layout, const int flags) :
ElmWidget(&rc, *layout, true),
- m_moreOptions(layout)
+ m_mainLayout(layout.get())
{
prepare(flags);
}
@@ -105,16 +105,16 @@ namespace gallery {
void PageContent::prepare(const int flags)
{
- m_moreOptions->setIsOwner(false);
+ m_mainLayout->setIsOwner(false);
- LayoutSRef parent = m_moreOptions;
+ Layout *parent = m_mainLayout;
if (flags & FLAG_SELECT_BUTTON) {
m_selectMode = Layout::Builder().
setTheme(impl::LAYOUT_SELECT_MODE).
build(*parent);
parent->setContent(*m_selectMode);
- parent = m_selectMode;
+ parent = m_selectMode.get();
}
if (flags & FLAG_BOTTOM_BUTTON) {
@@ -122,7 +122,7 @@ namespace gallery {
setTheme(impl::LAYOUT_BOTTOM_BUTTON).
build(*parent);
parent->setContent(*m_bottomButton);
- parent = m_bottomButton;
+ parent = m_bottomButton.get();
}
}
@@ -169,10 +169,7 @@ namespace gallery {
Result PageContent::setMoreOptionsVisible(const bool visible)
{
- if (!m_moreOptions) {
- LOG_RETURN(RES_FAIL, "More options is not supported!");
- }
- const auto content = m_moreOptions->getContent(impl::PART_MORE_OPTIONS);
+ const auto content = m_mainLayout->getContent(impl::PART_MORE_OPTIONS);
if (!content) {
LOG_RETURN(RES_FAIL, "More option is not created!");
}
@@ -190,11 +187,11 @@ namespace gallery {
case Part::DEFAULT:
return impl::callSafe(getTopLayout(), func, PART_CONTENT);
case Part::OVERLAY:
- return impl::callSafe(m_moreOptions.get(), func,
- impl::PART_OVERLAY);
+ func(*m_mainLayout, impl::PART_OVERLAY);
+ return RES_OK;
case Part::MORE_OPTIONS:
- return impl::callSafe(m_moreOptions.get(), func,
- impl::PART_MORE_OPTIONS);
+ func(*m_mainLayout, impl::PART_MORE_OPTIONS);
+ return RES_OK;
case Part::SELECT_BUTTON:
return impl::callSafe(m_selectMode.get(), func, PART_ICON);
case Part::BOTTOM_BUTTON:
@@ -211,6 +208,6 @@ namespace gallery {
if (m_selectMode) {
return m_selectMode.get();
}
- return m_moreOptions.get();
+ return m_mainLayout;
}
}
diff --git a/src/view/TouchParser.cpp b/src/view/TouchParser.cpp
index d06d2f1..8678bdb 100644
--- a/src/view/TouchParser.cpp
+++ b/src/view/TouchParser.cpp
@@ -28,7 +28,7 @@ namespace gallery { namespace { namespace impl {
namespace gallery {
- TouchParser::TouchParser(RefCountObjBase &rc, Widget &eventSource) :
+ TouchParser::TouchParser(IRefCountObj &rc, Widget &eventSource) :
RefCountAware(&rc),
m_holdTimer(nullptr),
m_downTime(0),
diff --git a/ucl/inc/ucl/gui/EdjeWidget.h b/ucl/inc/ucl/gui/EdjeWidget.h
index 8d20b50..0ee57f0 100644
--- a/ucl/inc/ucl/gui/EdjeWidget.h
+++ b/ucl/inc/ucl/gui/EdjeWidget.h
@@ -43,7 +43,7 @@ namespace ucl {
EdjeSignalSrc(""));
protected:
- EdjeWidget(RefCountObjBase *rc, Evas_Object *eo, bool isOwner = false);
+ EdjeWidget(IRefCountObj *rc, Evas_Object *eo, bool isOwner = false);
};
}
diff --git a/ucl/inc/ucl/gui/EdjeWidget.hpp b/ucl/inc/ucl/gui/EdjeWidget.hpp
index 5197f59..3f989c7 100644
--- a/ucl/inc/ucl/gui/EdjeWidget.hpp
+++ b/ucl/inc/ucl/gui/EdjeWidget.hpp
@@ -16,7 +16,7 @@
namespace ucl {
- inline EdjeWidget::EdjeWidget(RefCountObjBase *const rc,
+ inline EdjeWidget::EdjeWidget(IRefCountObj *const rc,
Evas_Object *const eo, const bool isOwner) :
ElmWidget(rc, eo, isOwner)
{
diff --git a/ucl/inc/ucl/gui/ElmWidget.h b/ucl/inc/ucl/gui/ElmWidget.h
index 96d5cf2..3856b49 100644
--- a/ucl/inc/ucl/gui/ElmWidget.h
+++ b/ucl/inc/ucl/gui/ElmWidget.h
@@ -47,8 +47,8 @@ namespace ucl {
Window *getWindow() const;
protected:
- friend class RefCountObj<ElmWidget>;
- ElmWidget(RefCountObjBase *rc, Evas_Object *eo, bool isOwner = false);
+ friend class ReffedObj<ElmWidget>;
+ ElmWidget(IRefCountObj *rc, Evas_Object *eo, bool isOwner = false);
virtual void setFocusedImpl(bool value) final override;
virtual bool isFocusedImpl() const final override;
diff --git a/ucl/inc/ucl/gui/Layout.h b/ucl/inc/ucl/gui/Layout.h
index ec21f45..37732ce 100644
--- a/ucl/inc/ucl/gui/Layout.h
+++ b/ucl/inc/ucl/gui/Layout.h
@@ -42,7 +42,7 @@ namespace ucl {
};
public:
- friend class RefCountObj<Layout>;
+ friend class ReffedObj<Layout>;
using EdjeWidget::EdjeWidget;
explicit Layout(Evas_Object *eo, bool isOwner = false);
diff --git a/ucl/inc/ucl/gui/Naviframe.h b/ucl/inc/ucl/gui/Naviframe.h
index 0cf36f6..4e4336c 100644
--- a/ucl/inc/ucl/gui/Naviframe.h
+++ b/ucl/inc/ucl/gui/Naviframe.h
@@ -85,8 +85,8 @@ namespace ucl {
std::vector<NaviItem> getItems() const;
private:
- friend class RefCountObj<Naviframe>;
- Naviframe(RefCountObjBase &rc, Evas_Object *eo);
+ friend class ReffedObj<Naviframe>;
+ Naviframe(IRefCountObj &rc, Evas_Object *eo);
void onTransitionFinished(Widget &widget, void *eventInfo);
diff --git a/ucl/inc/ucl/gui/StyledWidget.h b/ucl/inc/ucl/gui/StyledWidget.h
index ad995c1..2a0280c 100644
--- a/ucl/inc/ucl/gui/StyledWidget.h
+++ b/ucl/inc/ucl/gui/StyledWidget.h
@@ -25,7 +25,7 @@ namespace ucl {
class StyledWidget : public EdjeWidget {
public:
- friend class RefCountObj<StyledWidget>;
+ friend class ReffedObj<StyledWidget>;
using EdjeWidget::EdjeWidget;
explicit StyledWidget(Evas_Object *eo, bool isOwner = false);
diff --git a/ucl/inc/ucl/gui/Widget.h b/ucl/inc/ucl/gui/Widget.h
index 8dfcd26..c317962 100644
--- a/ucl/inc/ucl/gui/Widget.h
+++ b/ucl/inc/ucl/gui/Widget.h
@@ -97,8 +97,8 @@ namespace ucl {
bool isFocused() const;
protected:
- friend class RefCountObj<Widget>;
- Widget(RefCountObjBase *rc, Evas_Object *eo, bool isOwner = false);
+ friend class ReffedObj<Widget>;
+ Widget(IRefCountObj *rc, Evas_Object *eo, bool isOwner = false);
virtual void setFocusedImpl(bool value);
virtual bool isFocusedImpl() const;
@@ -125,7 +125,7 @@ namespace ucl {
protected:
// This section MUST be protected!
- // Signal to RefCountObj<T> to call onUniqueChanged()
+ // Signal to RefCountObj<T, C> to call onUniqueChanged()
enum { ENABLE_ON_UNIQUE_CHANGED_DISPATCH };
void onUniqueChanged(bool isUnique);
diff --git a/ucl/inc/ucl/gui/Window.h b/ucl/inc/ucl/gui/Window.h
index 8e526b4..b611b25 100644
--- a/ucl/inc/ucl/gui/Window.h
+++ b/ucl/inc/ucl/gui/Window.h
@@ -80,8 +80,8 @@ namespace ucl {
void lower();
private:
- friend class RefCountObj<Window>;
- Window(RefCountObjBase *rc, Evas_Object *eo,
+ friend class ReffedObj<Window>;
+ Window(IRefCountObj *rc, Evas_Object *eo,
bool isOwner, Evas_Object *conform);
private:
diff --git a/ucl/inc/ucl/gui/Window.hpp b/ucl/inc/ucl/gui/Window.hpp
index 3d4c959..d5b1828 100644
--- a/ucl/inc/ucl/gui/Window.hpp
+++ b/ucl/inc/ucl/gui/Window.hpp
@@ -84,7 +84,7 @@ namespace ucl {
// Window //
- inline Window::Window(RefCountObjBase *const rc, Evas_Object *const eo,
+ inline Window::Window(IRefCountObj *const rc, Evas_Object *const eo,
const bool isOwner, Evas_Object *const conform) :
ElmWidget(rc, eo, isOwner),
m_conform(conform)
diff --git a/ucl/inc/ucl/misc/Event.hpp b/ucl/inc/ucl/misc/Event.hpp
index f0caec0..ed4e402 100644
--- a/ucl/inc/ucl/misc/Event.hpp
+++ b/ucl/inc/ucl/misc/Event.hpp
@@ -48,10 +48,7 @@ namespace ucl {
template <class DELEGATE2>
void Event<DELEGATE>::operator+=(DELEGATE2 &&delegate)
{
- if (delegate && std::find(m_delegates.begin(), m_delegates.end(),
- delegate) == m_delegates.end()) {
- m_delegates.emplace_back(std::forward<DELEGATE2>(delegate));
- }
+ m_delegates.emplace_back(std::forward<DELEGATE2>(delegate));
}
template <class DELEGATE>
@@ -73,7 +70,7 @@ namespace ucl {
template <class DELEGATE>
bool Event<DELEGATE>::isEmpty() const
{
- return (isLocked() ? false : m_delegates.empty());
+ return m_delegates.empty();
}
template <class DELEGATE>
diff --git a/ucl/inc/ucl/misc/RefCountAware.h b/ucl/inc/ucl/misc/RefCountAware.h
index 7ec13cc..ed05bfe 100644
--- a/ucl/inc/ucl/misc/RefCountAware.h
+++ b/ucl/inc/ucl/misc/RefCountAware.h
@@ -35,11 +35,14 @@ namespace ucl {
WeakRef<T> asWeakThis(T *thisAlias) const;
protected:
- RefCountAware(RefCountObjBase *rc);
+ RefCountAware(IRefCountObj *rc);
virtual ~RefCountAware() = default;
protected:
- RefCountObjBase *const m_rc;
+ enum { IS_REF_COUNT_AWARE };
+
+ protected:
+ IRefCountObj *const m_rc;
};
// Non-member functions //
diff --git a/ucl/inc/ucl/misc/RefCountAware.hpp b/ucl/inc/ucl/misc/RefCountAware.hpp
index ae51c0d..3906d0e 100644
--- a/ucl/inc/ucl/misc/RefCountAware.hpp
+++ b/ucl/inc/ucl/misc/RefCountAware.hpp
@@ -18,7 +18,7 @@
namespace ucl {
- inline RefCountAware::RefCountAware(RefCountObjBase *const rc) :
+ inline RefCountAware::RefCountAware(IRefCountObj *const rc) :
m_rc(rc)
{
}
diff --git a/ucl/inc/ucl/misc/Timeout.h b/ucl/inc/ucl/misc/Timeout.h
index 707c25c..165265c 100644
--- a/ucl/inc/ucl/misc/Timeout.h
+++ b/ucl/inc/ucl/misc/Timeout.h
@@ -37,7 +37,7 @@ namespace ucl {
bool isExpired() const;
private:
- friend class RefCountObj<Timeout>;
+ friend class ReffedObj<Timeout>;
Timeout(const TimeoutHandler &handler);
~Timeout();
diff --git a/ucl/inc/ucl/util/delegation/BaseDelegate.h b/ucl/inc/ucl/util/delegation/BaseDelegate.h
index d5c518c..62b92ff 100644
--- a/ucl/inc/ucl/util/delegation/BaseDelegate.h
+++ b/ucl/inc/ucl/util/delegation/BaseDelegate.h
@@ -42,8 +42,6 @@ namespace ucl {
template <class FUNC_SIG>
BaseDelegate(BaseDelegate2<FUNC_SIG, DATA> &&d) noexcept;
- R operator()(ARGS ...args) const;
-
void reset() noexcept;
const DATA &getData() const noexcept;
@@ -53,7 +51,7 @@ namespace ucl {
protected:
BaseDelegate(const DATA &data, StubA stubA) noexcept;
- private:
+ protected:
DATA m_data;
StubA m_stubA;
};
diff --git a/ucl/inc/ucl/util/delegation/BaseDelegate.hpp b/ucl/inc/ucl/util/delegation/BaseDelegate.hpp
index 4cb9741..f25c0a7 100644
--- a/ucl/inc/ucl/util/delegation/BaseDelegate.hpp
+++ b/ucl/inc/ucl/util/delegation/BaseDelegate.hpp
@@ -57,13 +57,6 @@ namespace ucl {
}
template <class R, class ...ARGS, class DATA>
- inline R BaseDelegate<R(ARGS...), DATA>::operator()(ARGS ...args) const
- {
- return m_stubA(
- static_cast<void *>(m_data), std::forward<ARGS>(args)...);
- }
-
- template <class R, class ...ARGS, class DATA>
inline void BaseDelegate<R(ARGS...), DATA>::reset() noexcept
{
*this = {};
diff --git a/ucl/inc/ucl/util/delegation/Delegate.h b/ucl/inc/ucl/util/delegation/Delegate.h
index fd53a0a..e1e7416 100644
--- a/ucl/inc/ucl/util/delegation/Delegate.h
+++ b/ucl/inc/ucl/util/delegation/Delegate.h
@@ -29,6 +29,8 @@ namespace ucl {
public:
using BaseDelegate<R(ARGS...), void *>::BaseDelegate;
+ R operator()(ARGS ...args) const;
+
template <class CLASS, R(CLASS::*METHOD)(ARGS...)>
static Delegate make(CLASS *data) noexcept;
template <class CLASS, R(CLASS::*METHOD)(ARGS...) const>
diff --git a/ucl/inc/ucl/util/delegation/Delegate.hpp b/ucl/inc/ucl/util/delegation/Delegate.hpp
index 5f7be3d..632ec24 100644
--- a/ucl/inc/ucl/util/delegation/Delegate.hpp
+++ b/ucl/inc/ucl/util/delegation/Delegate.hpp
@@ -17,6 +17,12 @@
namespace ucl {
template <class R, class ...ARGS>
+ inline R Delegate<R(ARGS...)>::operator()(ARGS ...args) const
+ {
+ return this->m_stubA(this->m_data, std::forward<ARGS>(args)...);
+ }
+
+ template <class R, class ...ARGS>
template <class CLASS, R(CLASS::*METHOD)(ARGS...)>
inline Delegate<R(ARGS...)>
Delegate<R(ARGS...)>::make(CLASS *const data) noexcept
diff --git a/ucl/inc/ucl/util/delegation/Delegate2.h b/ucl/inc/ucl/util/delegation/Delegate2.h
index c49d31c..56ff3fb 100644
--- a/ucl/inc/ucl/util/delegation/Delegate2.h
+++ b/ucl/inc/ucl/util/delegation/Delegate2.h
@@ -29,6 +29,8 @@ namespace ucl {
public:
using BaseDelegate2<R(ARGS...), void *>::BaseDelegate2;
+ R operator()(ARGS ...args) const;
+
template <class CLASS, R(CLASS::*METHOD)(ARGS...)>
static Delegate2 make(CLASS *data) noexcept;
template <class CLASS, R(CLASS::*METHOD)(ARGS...) const>
diff --git a/ucl/inc/ucl/util/delegation/Delegate2.hpp b/ucl/inc/ucl/util/delegation/Delegate2.hpp
index 4d77860..085ba46 100644
--- a/ucl/inc/ucl/util/delegation/Delegate2.hpp
+++ b/ucl/inc/ucl/util/delegation/Delegate2.hpp
@@ -17,6 +17,12 @@
namespace ucl {
template <class R, class ...ARGS>
+ inline R Delegate2<R(ARGS...)>::operator()(ARGS ...args) const
+ {
+ return this->m_stubA(this->m_data, std::forward<ARGS>(args)...);
+ }
+
+ template <class R, class ...ARGS>
template <class CLASS, R(CLASS::*METHOD)(ARGS...)>
inline Delegate2<R(ARGS...)>
Delegate2<R(ARGS...)>::make(CLASS *const data) noexcept
diff --git a/ucl/inc/ucl/util/delegation/helpers.h b/ucl/inc/ucl/util/delegation/helpers.h
index 95e0481..54ebb99 100644
--- a/ucl/inc/ucl/util/delegation/helpers.h
+++ b/ucl/inc/ucl/util/delegation/helpers.h
@@ -64,16 +64,16 @@ namespace ucl {
inline bool operator==(const BaseDelegate<R(ARGS...), DATA1> &lhs,
const BaseDelegate<R(ARGS...), DATA2> &rhs) noexcept
{
- return ((lhs.getStubA() == rhs.getStubA()) && (static_cast<void *>(
- lhs.getData()) == static_cast<void *>(rhs.getData())));
+ return ((lhs.getStubA() == rhs.getStubA()) && (
+ lhs.getData() == rhs.getData()));
}
template <class R, class ...ARGS, class DATA1, class DATA2>
inline bool operator!=(const BaseDelegate<R(ARGS...), DATA1> &lhs,
const BaseDelegate<R(ARGS...), DATA2> &rhs) noexcept
{
- return ((lhs.getStubA() != rhs.getStubA()) || (static_cast<void *>(
- lhs.getData()) != static_cast<void *>(rhs.getData())));
+ return ((lhs.getStubA() != rhs.getStubA()) || (
+ lhs.getData() != rhs.getData()));
}
template <class R, class ...ARGS, class DATA1, class DATA2>
@@ -81,8 +81,8 @@ namespace ucl {
const BaseDelegate<R(ARGS...), DATA2> &rhs) noexcept
{
return ((lhs.getStubA() < rhs.getStubA()) ||
- ((lhs.getStubA() == rhs.getStubA()) && (static_cast<void *>(
- lhs.getData()) < static_cast<void *>(rhs.getData()))));
+ ((lhs.getStubA() == rhs.getStubA()) && (
+ lhs.getData() < rhs.getData())));
}
template <class R, class ...ARGS, class DATA1, class DATA2>
@@ -90,8 +90,8 @@ namespace ucl {
const BaseDelegate<R(ARGS...), DATA2> &rhs) noexcept
{
return ((lhs.getStubA() < rhs.getStubA()) ||
- ((lhs.getStubA() == rhs.getStubA()) && (static_cast<void *>(
- lhs.getData()) <= static_cast<void *>(rhs.getData()))));
+ ((lhs.getStubA() == rhs.getStubA()) && (
+ lhs.getData() <= rhs.getData())));
}
template <class R, class ...ARGS, class DATA1, class DATA2>
@@ -99,8 +99,8 @@ namespace ucl {
const BaseDelegate<R(ARGS...), DATA2> &rhs) noexcept
{
return ((lhs.getStubA() > rhs.getStubA()) ||
- ((lhs.getStubA() == rhs.getStubA()) && (static_cast<void *>(
- lhs.getData()) > static_cast<void *>(rhs.getData()))));
+ ((lhs.getStubA() == rhs.getStubA()) && (
+ lhs.getData() > rhs.getData())));
}
template <class R, class ...ARGS, class DATA1, class DATA2>
@@ -108,8 +108,8 @@ namespace ucl {
const BaseDelegate<R(ARGS...), DATA2> &rhs) noexcept
{
return ((lhs.getStubA() > rhs.getStubA()) ||
- ((lhs.getStubA() == rhs.getStubA()) && (static_cast<void *>(
- lhs.getData()) >= static_cast<void *>(rhs.getData()))));
+ ((lhs.getStubA() == rhs.getStubA()) && (
+ lhs.getData() >= rhs.getData())));
}
}
diff --git a/ucl/inc/ucl/util/memory.h b/ucl/inc/ucl/util/memory.h
index 1fd8523..cc33960 100644
--- a/ucl/inc/ucl/util/memory.h
+++ b/ucl/inc/ucl/util/memory.h
@@ -17,7 +17,6 @@
#ifndef __UCL_UTIL_MEMORY_H__
#define __UCL_UTIL_MEMORY_H__
-#include "memory/RefCountObjBase.h"
#include "memory/RefCountObj.h"
#include "memory/BaseRef.h"
diff --git a/ucl/inc/ucl/util/memory/BaseRef.h b/ucl/inc/ucl/util/memory/BaseRef.h
index 0aa1b59..f82a2c9 100644
--- a/ucl/inc/ucl/util/memory/BaseRef.h
+++ b/ucl/inc/ucl/util/memory/BaseRef.h
@@ -17,7 +17,7 @@
#ifndef __UCL_UTIL_MEMORY_BASE_REF_H__
#define __UCL_UTIL_MEMORY_BASE_REF_H__
-#include "RefCountObjBase.h"
+#include "IRefCountObj.h"
namespace ucl {
@@ -34,23 +34,17 @@ namespace ucl {
friend class WeakRef;
public:
- int getUseCount() const;
-
- T *operator->() const noexcept;
- typename std::add_lvalue_reference<T>::type operator*() const noexcept;
-
- template <class U>
- explicit operator U() const noexcept;
+ int getUseCount() const noexcept;
protected:
constexpr BaseRef() noexcept;
- BaseRef(RefCountObjBase *rc, T *ptr) noexcept;
+ BaseRef(IRefCountObj *rc, T *ptr) noexcept;
BaseRef(BaseRef<T> &&r) noexcept;
template <class U>
BaseRef(BaseRef<U> &&r) noexcept;
protected:
- RefCountObjBase *m_rc;
+ IRefCountObj *m_rc;
T *m_ptr;
};
}
diff --git a/ucl/inc/ucl/util/memory/BaseRef.hpp b/ucl/inc/ucl/util/memory/BaseRef.hpp
index d587bc1..adde1c9 100644
--- a/ucl/inc/ucl/util/memory/BaseRef.hpp
+++ b/ucl/inc/ucl/util/memory/BaseRef.hpp
@@ -25,7 +25,7 @@ namespace ucl {
template <class T>
inline BaseRef<T>::BaseRef(
- RefCountObjBase *const rc, T *const ptr) noexcept :
+ IRefCountObj *const rc, T *const ptr) noexcept :
m_rc(rc),
m_ptr(ptr)
{
@@ -51,28 +51,8 @@ namespace ucl {
}
template <class T>
- inline int BaseRef<T>::getUseCount() const
+ inline int BaseRef<T>::getUseCount() const noexcept
{
return (m_rc ? m_rc->getUseCount() : 0);
}
-
- template <class T>
- inline T *BaseRef<T>::operator->() const noexcept
- {
- return m_ptr;
- }
-
- template <class T>
- inline typename std::add_lvalue_reference<T>::type
- BaseRef<T>::operator*() const noexcept
- {
- return *m_ptr;
- }
-
- template <class T>
- template <class U>
- inline BaseRef<T>::operator U() const noexcept
- {
- return static_cast<U>(m_ptr);
- }
}
diff --git a/ucl/inc/ucl/util/memory/RefCountObjBase.h b/ucl/inc/ucl/util/memory/IRefCountObj.h
index 4e6edf0..567e12c 100644
--- a/ucl/inc/ucl/util/memory/RefCountObjBase.h
+++ b/ucl/inc/ucl/util/memory/IRefCountObj.h
@@ -14,38 +14,24 @@
* limitations under the License.
*/
-#ifndef __UCL_UTIL_MEMORY_REF_COUNT_OBJ_BASE_H__
-#define __UCL_UTIL_MEMORY_REF_COUNT_OBJ_BASE_H__
+#ifndef __UCL_UTIL_MEMORY_I_REF_COUNT_OBJ_H__
+#define __UCL_UTIL_MEMORY_I_REF_COUNT_OBJ_H__
#include "ucl/util/types/classTypes.h"
namespace ucl {
- class RefCountObjBase : public Polymorphic {
+ class IRefCountObj : public Polymorphic {
public:
- void ref() noexcept;
- void unref() noexcept;
-
- void refWeak() noexcept;
- void unrefWeak() noexcept;
-
- int getUseCount() const noexcept;
- bool isDisposed() const noexcept;
-
+ virtual void ref() noexcept = 0;
+ virtual void unref() noexcept = 0;
+ virtual bool refNz() noexcept = 0;
+ virtual void refWeak() noexcept = 0;
+ virtual void unrefWeak() noexcept = 0;
+ virtual unsigned getUseCount() const noexcept = 0;
protected:
- RefCountObjBase();
- virtual ~RefCountObjBase() = default;
-
- virtual void dispose() noexcept;
- virtual void onUniqueChanged(bool isUnique) noexcept = 0;
-
- private:
- int m_useRefs;
- int m_weakRefs;
- bool m_isDisposed;
+ virtual ~IRefCountObj() = default;
};
}
-#include "RefCountObjBase.hpp"
-
-#endif // __UCL_UTIL_MEMORY_REF_COUNT_OBJ_BASE_H__
+#endif // __UCL_UTIL_MEMORY_I_REF_COUNT_OBJ_H__
diff --git a/ucl/inc/ucl/util/memory/RefCountObj.h b/ucl/inc/ucl/util/memory/RefCountObj.h
index 777f07e..e566179 100644
--- a/ucl/inc/ucl/util/memory/RefCountObj.h
+++ b/ucl/inc/ucl/util/memory/RefCountObj.h
@@ -17,58 +17,93 @@
#ifndef __UCL_UTIL_MEMORY_REF_COUNT_OBJ_H__
#define __UCL_UTIL_MEMORY_REF_COUNT_OBJ_H__
-#include "RefCountObjBase.h"
+#include "IRefCountObj.h"
+#include "ReffedObj.h"
namespace ucl {
- template <class T>
- class RefCountObj : public RefCountObjBase {
+ template <class T, class C>
+ class RefCountObj final : public IRefCountObj {
public:
template <class ...ARGS>
RefCountObj(ARGS &&...args);
T *getObj() noexcept;
- protected:
- // RefCountObjBase //
- virtual void dispose() noexcept final override;
- virtual void onUniqueChanged(bool isUnique) noexcept final override;
+ // IRefCountObj //
+
+ virtual void ref() noexcept final override;
+ virtual void unref() noexcept final override;
+ virtual bool refNz() noexcept final override;
+ virtual void refWeak() noexcept final override;
+ virtual void unrefWeak() noexcept final override;
+ virtual unsigned getUseCount() const noexcept final override;
private:
- // Consume-all SFINAE functions
- template <class T2, class ...ARGS>
- void createObj(const P<0> &, ARGS &&...args);
+ template <class T2, class = char[1]>
+ struct IsRefCountAware : std::false_type {};
+ template <class T2>
+ struct IsRefCountAware<T2, char[T2::IS_REF_COUNT_AWARE * 0 + 1]> :
+ std::true_type {};
+
+ template <class T2, class = char[1]>
+ struct IsOnUniqueAware : std::false_type {};
template <class T2>
- void dispatchOnUniqueChanged(
- const P<0> &, const bool isUnique) noexcept;
+ struct IsOnUniqueAware<T2,
+ char[T2::ENABLE_ON_UNIQUE_CHANGED_DISPATCH * 0 + 1]> :
+ std::true_type {};
- // Specialized SFINAE functions
+ private:
+ virtual ~RefCountObj() = default;
+
+ template <class T2, class ...ARGS, class =
+ typename std::enable_if<!IsRefCountAware<T2>::value>::type>
+ void createObj(const P<0> &, ARGS &&...args)
+ {
+ m_obj.create(std::forward<ARGS>(args)...);
+ }
- template <class T2, class ...ARGS>
+ template <class T2, class ...ARGS, class =
+ typename std::enable_if<IsRefCountAware<T2>::value>::type>
auto createObj(const P<1> &, ARGS &&...args) -> decltype(
- (void)(new T2(this, std::forward<ARGS>(args)...)))
+ ReffedObj<T>::template check<T2>(
+ (IRefCountObj *)0, std::forward<ARGS>(args)...))
{
- new (getObj()) T(this, std::forward<ARGS>(args)...);
+ m_obj.create(static_cast<IRefCountObj *>(this),
+ std::forward<ARGS>(args)...);
}
- template <class T2, class ...ARGS>
+ template <class T2, class ...ARGS, class =
+ typename std::enable_if<IsRefCountAware<T2>::value>::type>
auto createObj(const P<2> &, ARGS &&...args) -> decltype(
- (void)(new T2(*this, std::forward<ARGS>(args)...)))
+ ReffedObj<T>::template check<T2>(
+ *(IRefCountObj *)0, std::forward<ARGS>(args)...))
+ {
+ m_obj.create(*static_cast<IRefCountObj *>(this),
+ std::forward<ARGS>(args)...);
+ }
+
+ void dispatchOnUniqueChanged(const bool isUnique)
+ {
+ dispatchOnUniqueChanged<T>(P<1>(), isUnique);
+ }
+
+ template <class T2>
+ void dispatchOnUniqueChanged(...)
{
- new (getObj()) T(*this, std::forward<ARGS>(args)...);
}
- template <class T2,
- class = char(*)[T2::ENABLE_ON_UNIQUE_CHANGED_DISPATCH * 0 + 1]>
- void dispatchOnUniqueChanged(
- const P<1> &, const bool isUnique) noexcept
+ template <class T2, class =
+ typename std::enable_if<IsOnUniqueAware<T2>::value>::type>
+ void dispatchOnUniqueChanged(const P<1> &, const bool isUnique)
{
- getObj()->onUniqueChanged(isUnique);
+ m_obj.template dispatchOnUniqueChanged<T>(isUnique);
}
private:
- // Proper-aligned storage for T
- typename std::aligned_storage<sizeof(T), alignof(T)>::type m_obj;
+ ReffedObj<T> m_obj;
+ C m_useCounter;
+ C m_weakCounter;
};
}
diff --git a/ucl/inc/ucl/util/memory/RefCountObj.hpp b/ucl/inc/ucl/util/memory/RefCountObj.hpp
index 3807bd3..8fce0e3 100644
--- a/ucl/inc/ucl/util/memory/RefCountObj.hpp
+++ b/ucl/inc/ucl/util/memory/RefCountObj.hpp
@@ -16,45 +16,71 @@
namespace ucl {
- template <class T>
+ template <class T, class C>
template <class ...ARGS>
- inline RefCountObj<T>::RefCountObj(ARGS &&...args)
+ inline RefCountObj<T, C>::RefCountObj(ARGS &&...args) :
+ m_useCounter(1),
+ m_weakCounter(1)
{
createObj<T>(P<2>(), std::forward<ARGS>(args)...);
}
- template <class T>
- inline T *RefCountObj<T>::getObj() noexcept
+ template <class T, class C>
+ inline T *RefCountObj<T, C>::getObj() noexcept
{
- return static_cast<T *>(static_cast<void *>(&m_obj));
+ return m_obj.get();
}
- template <class T>
- inline void RefCountObj<T>::dispose() noexcept
+ template <class T, class C>
+ inline void RefCountObj<T, C>::ref() noexcept
{
- if (!isDisposed()) {
- RefCountObjBase::dispose();
- getObj()->~T();
+ if (m_useCounter.ref() == 2) {
+ dispatchOnUniqueChanged(false);
}
}
- template <class T>
- inline void RefCountObj<T>::onUniqueChanged(const bool isUnique) noexcept
+ template <class T, class C>
+ inline void RefCountObj<T, C>::unref() noexcept
{
- dispatchOnUniqueChanged<T>(P<1>(), isUnique);
+ const auto newCount = m_useCounter.unref();
+ if (newCount == 0) {
+ m_obj.destroy();
+ unrefWeak();
+ } else if (newCount == 1) {
+ dispatchOnUniqueChanged(true);
+ }
+ }
+
+ template <class T, class C>
+ inline bool RefCountObj<T, C>::refNz() noexcept
+ {
+ const auto newCount = m_useCounter.refNz();
+ if (newCount == 0) {
+ return false;
+ }
+ if (newCount == 2) {
+ dispatchOnUniqueChanged(false);
+ }
+ return true;
}
- template <class T>
- template <class T2, class ...ARGS>
- inline void RefCountObj<T>::createObj(const P<0> &, ARGS &&...args)
+ template <class T, class C>
+ inline void RefCountObj<T, C>::refWeak() noexcept
{
- new (getObj()) T(std::forward<ARGS>(args)...);
+ m_weakCounter.ref();
+ }
+
+ template <class T, class C>
+ inline void RefCountObj<T, C>::unrefWeak() noexcept
+ {
+ if (m_weakCounter.unref() == 0) {
+ delete this;
+ }
}
- template <class T>
- template <class T2>
- inline void RefCountObj<T>::dispatchOnUniqueChanged(
- const P<0> &, const bool isUnique) noexcept
+ template <class T, class C>
+ inline unsigned RefCountObj<T, C>::getUseCount() const noexcept
{
+ return m_useCounter.get();
}
}
diff --git a/ucl/inc/ucl/util/memory/RefCountObjBase.hpp b/ucl/inc/ucl/util/memory/RefCountObjBase.hpp
deleted file mode 100644
index c4b5d42..0000000
--- a/ucl/inc/ucl/util/memory/RefCountObjBase.hpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2017 Samsung Electronics Co., Ltd
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-namespace ucl {
-
- inline RefCountObjBase::RefCountObjBase() :
- m_useRefs(0),
- m_weakRefs(1),
- m_isDisposed(false)
- {
- }
-
- inline void RefCountObjBase::ref() noexcept
- {
- ++m_useRefs;
- if (m_useRefs == 2) {
- onUniqueChanged(false);
- }
- }
-
- inline void RefCountObjBase::unref() noexcept
- {
- --m_useRefs;
- if (m_useRefs <= 1) {
- if (m_useRefs == 1) {
- onUniqueChanged(true);
- } else {
- dispose();
- unrefWeak();
- }
- }
- }
-
- inline void RefCountObjBase::refWeak() noexcept
- {
- ++m_weakRefs;
- }
-
- inline void RefCountObjBase::unrefWeak() noexcept
- {
- --m_weakRefs;
- if (m_weakRefs == 0) {
- delete this;
- }
- }
-
- inline int RefCountObjBase::getUseCount() const noexcept
- {
- return m_useRefs;
- }
-
- inline bool RefCountObjBase::isDisposed() const noexcept
- {
- return m_isDisposed;
- }
-
- inline void RefCountObjBase::dispose() noexcept
- {
- m_isDisposed = true;
- }
-}
diff --git a/ucl/inc/ucl/util/memory/RefCounterMT.h b/ucl/inc/ucl/util/memory/RefCounterMT.h
new file mode 100644
index 0000000..1d2fb95
--- /dev/null
+++ b/ucl/inc/ucl/util/memory/RefCounterMT.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2017 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UCL_UTIL_MEMORY_REF_COUNTER_MT_H__
+#define __UCL_UTIL_MEMORY_REF_COUNTER_MT_H__
+
+#include "ucl/util/types/baseTypes.h"
+
+namespace ucl {
+
+ class RefCounterMT final {
+ public:
+ explicit RefCounterMT(const UInt count = 0) noexcept;
+
+ UInt ref() noexcept;
+ UInt unref() noexcept;
+ UInt refNz() noexcept;
+
+ UInt get() const noexcept;
+
+ private:
+ std::atomic<UInt> m_counter;
+ };
+}
+
+#include "RefCounterMT.hpp"
+
+#endif // __UCL_UTIL_MEMORY_REF_COUNTER_MT_H__
diff --git a/ucl/inc/ucl/util/memory/RefCounterMT.hpp b/ucl/inc/ucl/util/memory/RefCounterMT.hpp
new file mode 100644
index 0000000..1ff459b
--- /dev/null
+++ b/ucl/inc/ucl/util/memory/RefCounterMT.hpp
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2017 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace ucl {
+
+ inline RefCounterMT::RefCounterMT(const UInt count) noexcept :
+ m_counter(count)
+ {
+ }
+
+ inline UInt RefCounterMT::ref() noexcept
+ {
+ return (m_counter.fetch_add(1, std::memory_order_acq_rel) + 1);
+ }
+
+ inline UInt RefCounterMT::unref() noexcept
+ {
+ return (m_counter.fetch_sub(1, std::memory_order_acq_rel) - 1);
+ }
+
+ inline UInt RefCounterMT::refNz() noexcept
+ {
+ auto curCount = m_counter.load(std::memory_order_relaxed);
+ for (;;) {
+ if (curCount == 0) {
+ return 0;
+ }
+ const auto newCount = (curCount + 1);
+ if (m_counter.compare_exchange_weak(curCount, newCount,
+ std::memory_order_acq_rel, std::memory_order_relaxed)) {
+ return newCount;
+ }
+ }
+ }
+
+ inline UInt RefCounterMT::get() const noexcept
+ {
+ return m_counter.load(std::memory_order_relaxed);
+ }
+}
diff --git a/ucl/inc/ucl/util/memory/RefCounterST.h b/ucl/inc/ucl/util/memory/RefCounterST.h
new file mode 100644
index 0000000..30e5e35
--- /dev/null
+++ b/ucl/inc/ucl/util/memory/RefCounterST.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2017 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UCL_UTIL_MEMORY_REF_COUNTER_ST_H__
+#define __UCL_UTIL_MEMORY_REF_COUNTER_ST_H__
+
+#include "ucl/util/types/baseTypes.h"
+
+namespace ucl {
+
+ class RefCounterST final {
+ public:
+ explicit RefCounterST(const UInt count = 0) noexcept;
+
+ UInt ref() noexcept;
+ UInt unref() noexcept;
+ UInt refNz() noexcept;
+
+ UInt get() const noexcept;
+
+ private:
+ UInt m_counter;
+ };
+}
+
+#include "RefCounterST.hpp"
+
+#endif // __UCL_UTIL_MEMORY_REF_COUNTER_ST_H__
diff --git a/ucl/inc/ucl/util/memory/RefCounterST.hpp b/ucl/inc/ucl/util/memory/RefCounterST.hpp
new file mode 100644
index 0000000..45781c7
--- /dev/null
+++ b/ucl/inc/ucl/util/memory/RefCounterST.hpp
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2017 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace ucl {
+
+ inline RefCounterST::RefCounterST(const UInt count) noexcept :
+ m_counter(count)
+ {
+ }
+
+ inline UInt RefCounterST::ref() noexcept
+ {
+ return (++m_counter);
+ }
+
+ inline UInt RefCounterST::unref() noexcept
+ {
+ return (--m_counter);
+ }
+
+ inline UInt RefCounterST::refNz() noexcept
+ {
+ if (m_counter == 0) {
+ return 0;
+ }
+ return ref();
+ }
+
+ inline UInt RefCounterST::get() const noexcept
+ {
+ return m_counter;
+ }
+}
diff --git a/ucl/inc/ucl/util/memory/ReffedObj.h b/ucl/inc/ucl/util/memory/ReffedObj.h
new file mode 100644
index 0000000..ed84b66
--- /dev/null
+++ b/ucl/inc/ucl/util/memory/ReffedObj.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2017 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UCL_UTIL_MEMORY_REFFED_OBJ_H__
+#define __UCL_UTIL_MEMORY_REFFED_OBJ_H__
+
+#include "RefCounterST.h"
+#include "RefCounterMT.h"
+
+namespace ucl {
+
+ template <class T, class C>
+ class RefCountObj;
+
+ template <class T>
+ class ReffedObj final {
+ private:
+ friend class RefCountObj<T, RefCounterST>;
+ friend class RefCountObj<T, RefCounterMT>;
+
+ template <class ...ARGS>
+ void create(ARGS &&...args);
+ void destroy() noexcept;
+
+ T *get() noexcept;
+
+ template <class T2>
+ void dispatchOnUniqueChanged(bool isUnique);
+
+ private:
+ template <class T2, class ...ARGS>
+ static constexpr auto check(ARGS &&...args) -> decltype(
+ (void)(new T2(std::forward<ARGS>(args)...)))
+ {
+ return;
+ }
+
+ private:
+ typename std::aligned_storage<sizeof(T), alignof(T)>::type m_obj;
+ };
+}
+
+#include "ReffedObj.hpp"
+
+#endif // __UCL_UTIL_MEMORY_REFFED_OBJ_H__
diff --git a/ucl/inc/ucl/util/memory/ReffedObj.hpp b/ucl/inc/ucl/util/memory/ReffedObj.hpp
new file mode 100644
index 0000000..5e9f473
--- /dev/null
+++ b/ucl/inc/ucl/util/memory/ReffedObj.hpp
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2017 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace ucl {
+
+ template <class T>
+ template <class ...ARGS>
+ inline void ReffedObj<T>::create(ARGS &&...args)
+ {
+ new (get()) T(std::forward<ARGS>(args)...);
+ }
+
+ template <class T>
+ inline void ReffedObj<T>::destroy() noexcept
+ {
+ get()->~T();
+ }
+
+ template <class T>
+ inline T *ReffedObj<T>::get() noexcept
+ {
+ return static_cast<T *>(static_cast<void *>(&m_obj));
+ }
+
+ template <class T>
+ template <class T2>
+ inline void ReffedObj<T>::dispatchOnUniqueChanged(const bool isUnique)
+ {
+ get()->onUniqueChanged(isUnique);
+ }
+}
diff --git a/ucl/inc/ucl/util/memory/SharedRef.h b/ucl/inc/ucl/util/memory/SharedRef.h
index 4bd7ca0..396d176 100644
--- a/ucl/inc/ucl/util/memory/SharedRef.h
+++ b/ucl/inc/ucl/util/memory/SharedRef.h
@@ -22,7 +22,7 @@
namespace ucl {
template <class T>
- class SharedRef : public BaseRef<T> {
+ class SharedRef final : public BaseRef<T> {
public:
template <class U>
friend void swap(SharedRef<U> &x, SharedRef<U> &y) noexcept;
@@ -36,11 +36,12 @@ namespace ucl {
constexpr SharedRef() noexcept;
constexpr SharedRef(std::nullptr_t) noexcept;
- SharedRef(RefCountObjBase *rc, T *ptr) noexcept;
+ SharedRef(IRefCountObj *rc, T *ptr) noexcept;
+ SharedRef(IRefCountObj *rc, T *ptr, bool noRef) noexcept;
SharedRef(const SharedRef<T> &r) noexcept;
template <class U>
- SharedRef(const BaseRef<U> &r) noexcept;
+ SharedRef(const SharedRef<U> &r) noexcept;
SharedRef(SharedRef<T> &&r) noexcept;
template <class U>
@@ -55,6 +56,9 @@ namespace ucl {
T *get() const noexcept;
operator bool() const noexcept;
+ T *operator->() const noexcept;
+ typename std::add_lvalue_reference<T>::type operator*() const noexcept;
+
template <class U, class = typename std::enable_if<
std::is_convertible<T *, U *>::value && (
std::is_same<typename std::remove_cv<U>::type, void>::value ||
@@ -70,6 +74,8 @@ namespace ucl {
template <class T, class ...ARGS>
SharedRef<T> makeShared(ARGS &&...args);
+ template <class T, class ...ARGS>
+ SharedRef<T> makeSharedMT(ARGS &&...args);
template <class T, class U>
const SharedRef<T> &constRefCast(const SharedRef<U> &r) noexcept;
diff --git a/ucl/inc/ucl/util/memory/SharedRef.hpp b/ucl/inc/ucl/util/memory/SharedRef.hpp
index 5b5ad55..f085b9c 100644
--- a/ucl/inc/ucl/util/memory/SharedRef.hpp
+++ b/ucl/inc/ucl/util/memory/SharedRef.hpp
@@ -14,8 +14,6 @@
* limitations under the License.
*/
-#include "RefCountObj.h"
-
namespace ucl {
template <class T>
@@ -30,13 +28,20 @@ namespace ucl {
template <class T>
inline SharedRef<T>::SharedRef(
- RefCountObjBase *const rc, T *const ptr) noexcept :
+ IRefCountObj *const rc, T *const ptr) noexcept :
BaseRef<T>(rc, ptr)
{
this->m_rc->ref();
}
template <class T>
+ inline SharedRef<T>::SharedRef(
+ IRefCountObj *const rc, T *const ptr, bool noRef) noexcept :
+ BaseRef<T>(rc, ptr)
+ {
+ }
+
+ template <class T>
inline SharedRef<T>::SharedRef(const SharedRef<T> &r) noexcept :
BaseRef<T>(r.m_rc, r.m_ptr)
{
@@ -47,7 +52,7 @@ namespace ucl {
template <class T>
template <class U>
- inline SharedRef<T>::SharedRef(const BaseRef<U> &r) noexcept :
+ inline SharedRef<T>::SharedRef(const SharedRef<U> &r) noexcept :
BaseRef<T>(r.m_rc, r.m_ptr)
{
if (this->m_rc) {
@@ -101,13 +106,35 @@ namespace ucl {
return !!this->m_ptr;
}
+ template <class T>
+ inline T *SharedRef<T>::operator->() const noexcept
+ {
+ return this->m_ptr;
+ }
+
+ template <class T>
+ inline typename std::add_lvalue_reference<T>::type
+ SharedRef<T>::operator*() const noexcept
+ {
+ return *this->m_ptr;
+ }
+
// Non-member functions //
template <class T, class ...ARGS>
SharedRef<T> makeShared(ARGS &&...args)
{
- const auto rc = new RefCountObj<T>(std::forward<ARGS>(args)...);
- return {rc, rc->getObj()};
+ const auto rc = new RefCountObj<T, RefCounterST>(
+ std::forward<ARGS>(args)...);
+ return {rc, rc->getObj(), true};
+ }
+
+ template <class T, class ...ARGS>
+ SharedRef<T> makeSharedMT(ARGS &&...args)
+ {
+ const auto rc = new RefCountObj<T, RefCounterMT>(
+ std::forward<ARGS>(args)...);
+ return {rc, rc->getObj(), true};
}
template <class T>
diff --git a/ucl/inc/ucl/util/memory/WeakRef.h b/ucl/inc/ucl/util/memory/WeakRef.h
index 78450a5..4cccbe6 100644
--- a/ucl/inc/ucl/util/memory/WeakRef.h
+++ b/ucl/inc/ucl/util/memory/WeakRef.h
@@ -22,7 +22,7 @@
namespace ucl {
template <class T>
- class WeakRef : public BaseRef<T> {
+ class WeakRef final : public BaseRef<T> {
public:
template <class U>
friend void swap(WeakRef<U> &x, WeakRef<U> &y) noexcept;
@@ -36,7 +36,7 @@ namespace ucl {
constexpr WeakRef() noexcept;
constexpr WeakRef(std::nullptr_t) noexcept;
- WeakRef(RefCountObjBase *rc, T *ptr) noexcept;
+ WeakRef(IRefCountObj *rc, T *ptr) noexcept;
WeakRef(const WeakRef<T> &r) noexcept;
template <class U>
@@ -52,7 +52,9 @@ namespace ucl {
void reset() noexcept;
- T *get() const noexcept;
+ SharedRef<T> lock() const noexcept;
+
+ T *getUnsafePtr() const noexcept;
operator bool() const noexcept;
template <class U, class = typename std::enable_if<
diff --git a/ucl/inc/ucl/util/memory/WeakRef.hpp b/ucl/inc/ucl/util/memory/WeakRef.hpp
index b1681ed..6634f3c 100644
--- a/ucl/inc/ucl/util/memory/WeakRef.hpp
+++ b/ucl/inc/ucl/util/memory/WeakRef.hpp
@@ -28,7 +28,7 @@ namespace ucl {
template <class T>
inline WeakRef<T>::WeakRef(
- RefCountObjBase *const rc, T *const ptr) noexcept :
+ IRefCountObj *const rc, T *const ptr) noexcept :
BaseRef<T>(rc, ptr)
{
this->m_rc->refWeak();
@@ -88,7 +88,16 @@ namespace ucl {
}
template <class T>
- inline T *WeakRef<T>::get() const noexcept
+ inline SharedRef<T> WeakRef<T>::lock() const noexcept
+ {
+ if (this->m_rc && this->m_rc->refNz()) {
+ return {this->m_rc, this->m_ptr, true};
+ }
+ return {};
+ }
+
+ template <class T>
+ inline T *WeakRef<T>::getUnsafePtr() const noexcept
{
return (operator bool() ? this->m_ptr : nullptr);
}
@@ -96,7 +105,7 @@ namespace ucl {
template <class T>
inline WeakRef<T>::operator bool() const noexcept
{
- return (this->m_ptr && !this->m_rc->isDisposed());
+ return (this->m_rc && (this->m_rc->getUseCount() > 0));
}
// Non-member functions //
@@ -117,13 +126,13 @@ namespace ucl {
template <class T, class U>
inline WeakRef<T> staticRefCast(const WeakRef<U> &r) noexcept
{
- return {r.m_rc, static_cast<T *>(r.get())};
+ return {r.m_rc, static_cast<T *>(r.getUnsafePtr())};
}
template <class T, class U>
inline WeakRef<T> dynamicRefCast(const WeakRef<U> &r) noexcept
{
- const auto ptr = dynamic_cast<T *>(r.get());
+ const auto ptr = dynamic_cast<T *>(r.getUnsafePtr());
if (!ptr) {
return {};
}
diff --git a/ucl/inc/ucl/util/memory/helpers.h b/ucl/inc/ucl/util/memory/helpers.h
index 4e6c0e0..bef907b 100644
--- a/ucl/inc/ucl/util/memory/helpers.h
+++ b/ucl/inc/ucl/util/memory/helpers.h
@@ -37,52 +37,74 @@ namespace ucl {
// Relation operators //
+ namespace himpl {
+
+ template <class T, class = typename std::enable_if<
+ !std::is_base_of<BaseRef<typename T::Type>, T>::value>::type>
+ inline const T &getCmpPtr(const T &ptr) noexcept
+ {
+ return ptr;
+ }
+
+ template <class T>
+ inline T *getCmpPtr(const SharedRef<T> &r) noexcept
+ {
+ return r.get();
+ }
+
+ template <class T>
+ inline T *getCmpPtr(const WeakRef<T> &r) noexcept
+ {
+ return r.getUnsafePtr();
+ }
+ }
+
template <class T, class U, class = typename std::enable_if<
- std::is_base_of<BaseRef<typename T::Type>, T>::value &&
+ std::is_base_of<BaseRef<typename T::Type>, T>::value ||
std::is_base_of<BaseRef<typename U::Type>, U>::value>::type>
inline bool operator==(const T &lhs, const U &rhs) noexcept
{
- return (lhs.get() == rhs.get());
+ return (himpl::getCmpPtr(lhs) == himpl::getCmpPtr(rhs));
}
template <class T, class U, class = typename std::enable_if<
- std::is_base_of<BaseRef<typename T::Type>, T>::value &&
+ std::is_base_of<BaseRef<typename T::Type>, T>::value ||
std::is_base_of<BaseRef<typename U::Type>, U>::value>::type>
inline bool operator!=(const T &lhs, const U &rhs) noexcept
{
- return (lhs.get() != rhs.get());
+ return (himpl::getCmpPtr(lhs) != himpl::getCmpPtr(rhs));
}
template <class T, class U, class = typename std::enable_if<
- std::is_base_of<BaseRef<typename T::Type>, T>::value &&
+ std::is_base_of<BaseRef<typename T::Type>, T>::value ||
std::is_base_of<BaseRef<typename U::Type>, U>::value>::type>
inline bool operator<(const T &lhs, const U &rhs) noexcept
{
- return (lhs.get() < rhs.get());
+ return (himpl::getCmpPtr(lhs) < himpl::getCmpPtr(rhs));
}
template <class T, class U, class = typename std::enable_if<
- std::is_base_of<BaseRef<typename T::Type>, T>::value &&
+ std::is_base_of<BaseRef<typename T::Type>, T>::value ||
std::is_base_of<BaseRef<typename U::Type>, U>::value>::type>
inline bool operator<=(const T &lhs, const U &rhs) noexcept
{
- return (lhs.get() <= rhs.get());
+ return (himpl::getCmpPtr(lhs) <= himpl::getCmpPtr(rhs));
}
template <class T, class U, class = typename std::enable_if<
- std::is_base_of<BaseRef<typename T::Type>, T>::value &&
+ std::is_base_of<BaseRef<typename T::Type>, T>::value ||
std::is_base_of<BaseRef<typename U::Type>, U>::value>::type>
inline bool operator>(const T &lhs, const U &rhs) noexcept
{
- return (lhs.get() > rhs.get());
+ return (himpl::getCmpPtr(lhs) > himpl::getCmpPtr(rhs));
}
template <class T, class U, class = typename std::enable_if<
- std::is_base_of<BaseRef<typename T::Type>, T>::value &&
+ std::is_base_of<BaseRef<typename T::Type>, T>::value ||
std::is_base_of<BaseRef<typename U::Type>, U>::value>::type>
inline bool operator>=(const T &lhs, const U &rhs) noexcept
{
- return (lhs.get() >= rhs.get());
+ return (himpl::getCmpPtr(lhs) >= himpl::getCmpPtr(rhs));
}
template <class T, class = typename std::enable_if<
diff --git a/ucl/inc/ucl/util/smartDelegation/WeakDelegate.h b/ucl/inc/ucl/util/smartDelegation/WeakDelegate.h
index 0d29f0f..97e1ae8 100644
--- a/ucl/inc/ucl/util/smartDelegation/WeakDelegate.h
+++ b/ucl/inc/ucl/util/smartDelegation/WeakDelegate.h
@@ -31,6 +31,8 @@ namespace ucl {
public:
using BaseDelegate<R(ARGS...), WeakRef<void>>::BaseDelegate;
+ R operator()(ARGS ...args) const;
+
template <class CLASS, R(CLASS::*METHOD)(ARGS...)>
static WeakDelegate make(const WeakRef<CLASS> &data) noexcept;
diff --git a/ucl/inc/ucl/util/smartDelegation/WeakDelegate.hpp b/ucl/inc/ucl/util/smartDelegation/WeakDelegate.hpp
index e4b4b5d..fa7b3f8 100644
--- a/ucl/inc/ucl/util/smartDelegation/WeakDelegate.hpp
+++ b/ucl/inc/ucl/util/smartDelegation/WeakDelegate.hpp
@@ -17,6 +17,16 @@
namespace ucl {
template <class R, class ...ARGS>
+ inline R WeakDelegate<R(ARGS...)>::operator()(ARGS ...args) const
+ {
+ const auto tmp = this->m_data.lock();
+ if (tmp) {
+ return this->m_stubA(tmp.get(), std::forward<ARGS>(args)...);
+ }
+ return R();
+ }
+
+ template <class R, class ...ARGS>
template <class CLASS, R(CLASS::*METHOD)(ARGS...)>
inline WeakDelegate<R(ARGS...)> WeakDelegate<R(ARGS...)>::make(
const WeakRef<CLASS> &data) noexcept
diff --git a/ucl/inc/ucl/util/types/baseTypes.h b/ucl/inc/ucl/util/types/baseTypes.h
index 5b280de..c5062db 100644
--- a/ucl/inc/ucl/util/types/baseTypes.h
+++ b/ucl/inc/ucl/util/types/baseTypes.h
@@ -23,6 +23,7 @@
#include <string>
#include <memory>
+#include <atomic>
#include <functional>
#include <type_traits>
#include <utility>
diff --git a/ucl/src/gui/ElmWidget.cpp b/ucl/src/gui/ElmWidget.cpp
index 73856be..7c39f81 100644
--- a/ucl/src/gui/ElmWidget.cpp
+++ b/ucl/src/gui/ElmWidget.cpp
@@ -21,7 +21,7 @@
namespace ucl {
- ElmWidget::ElmWidget(RefCountObjBase *rc, Evas_Object *eo, bool isOwner) :
+ ElmWidget::ElmWidget(IRefCountObj *rc, Evas_Object *eo, bool isOwner) :
Widget(rc, eo, isOwner),
m_isAtspiGestureCbSet(false)
{
diff --git a/ucl/src/gui/Naviframe.cpp b/ucl/src/gui/Naviframe.cpp
index 881390c..69d80a5 100644
--- a/ucl/src/gui/Naviframe.cpp
+++ b/ucl/src/gui/Naviframe.cpp
@@ -47,7 +47,7 @@ namespace ucl {
// Naviframe //
- Naviframe::Naviframe(RefCountObjBase &rc, Evas_Object *eo) :
+ Naviframe::Naviframe(IRefCountObj &rc, Evas_Object *eo) :
StyledWidget(&rc, eo, true),
m_isInTransition(false)
{
diff --git a/ucl/src/gui/Widget.cpp b/ucl/src/gui/Widget.cpp
index 0d546f4..d2c0dd6 100644
--- a/ucl/src/gui/Widget.cpp
+++ b/ucl/src/gui/Widget.cpp
@@ -110,7 +110,7 @@ namespace ucl {
// Widget //
- Widget::Widget(RefCountObjBase *const rc, Evas_Object *const eo,
+ Widget::Widget(IRefCountObj *const rc, Evas_Object *const eo,
const bool isOwner) :
RefCountAware(rc),
m_eo(eo),
@@ -175,11 +175,9 @@ namespace ucl {
void Widget::updateRefs()
{
- const auto rc = m_rc;
-
updateEoRef();
- if (rc && !rc->isDisposed()) {
+ if (m_rc) {
updateSelfRef();
}
}