changed the behavior of member functions of RefCounted.
Changed SharedPtr to make use of RefCounted. Added StrBase and String.
This commit is contained in:
parent
36e75b3bb2
commit
b4fd70b1e4
@ -33,6 +33,9 @@
|
||||
QSE_BEGIN_NAMESPACE(QSE)
|
||||
/////////////////////////////////
|
||||
|
||||
/// The RefCounted class provides common functions required to
|
||||
/// implement a reference counted class.
|
||||
|
||||
class QSE_EXPORT RefCounted: public Uncopyable
|
||||
{
|
||||
protected:
|
||||
@ -41,29 +44,29 @@ protected:
|
||||
}
|
||||
|
||||
public:
|
||||
virtual ~RefCounted ()
|
||||
{
|
||||
QSE_ASSERT (this->_ref_count == 0);
|
||||
}
|
||||
|
||||
void ref () const
|
||||
/// The ref() function increments the reference count and returns
|
||||
/// the incremented count.
|
||||
qse_size_t ref () const
|
||||
{
|
||||
this->_ref_count++;
|
||||
return ++this->_ref_count;
|
||||
}
|
||||
|
||||
void deref (bool kill = true) const
|
||||
/// The deref() function decrements the reference count and returns
|
||||
/// the decremented count. The caller should kill the callee if it
|
||||
/// returns 0.
|
||||
qse_size_t deref () const
|
||||
{
|
||||
if (--this->_ref_count == 0 && kill)
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
return --this->_ref_count;
|
||||
}
|
||||
|
||||
/// The getRefCount() function returns the current reference count.
|
||||
qse_size_t getRefCount () const
|
||||
{
|
||||
return this->_ref_count;
|
||||
}
|
||||
|
||||
/// The isShared() function returns true if the object is referenced
|
||||
/// more than twice and false otherwise.
|
||||
bool isShared () const
|
||||
{
|
||||
return this->_ref_count > 1;
|
||||
|
@ -53,6 +53,7 @@ if ENABLE_CXX
|
||||
pkginclude_HEADERS += \
|
||||
Mmgr.hpp StdMmgr.hpp HeapMmgr.hpp Mmged.hpp \
|
||||
ScopedPtr.hpp SharedPtr.hpp \
|
||||
StrBase.hpp String.hpp \
|
||||
Mpool.hpp Association.hpp LinkedList.hpp HashList.hpp HashTable.hpp \
|
||||
RedBlackTree.hpp RedBlackTable.hpp \
|
||||
Array.hpp BinaryHeap.hpp
|
||||
|
@ -53,6 +53,7 @@ host_triplet = @host@
|
||||
@ENABLE_CXX_TRUE@am__append_1 = \
|
||||
@ENABLE_CXX_TRUE@ Mmgr.hpp StdMmgr.hpp HeapMmgr.hpp Mmged.hpp \
|
||||
@ENABLE_CXX_TRUE@ ScopedPtr.hpp SharedPtr.hpp \
|
||||
@ENABLE_CXX_TRUE@ StrBase.hpp String.hpp \
|
||||
@ENABLE_CXX_TRUE@ Mpool.hpp Association.hpp LinkedList.hpp HashList.hpp HashTable.hpp \
|
||||
@ENABLE_CXX_TRUE@ RedBlackTree.hpp RedBlackTable.hpp \
|
||||
@ENABLE_CXX_TRUE@ Array.hpp BinaryHeap.hpp
|
||||
@ -94,9 +95,9 @@ am__pkginclude_HEADERS_DIST = alg.h chr.h cp949.h cp950.h dir.h dll.h \
|
||||
nwio.h oht.h opt.h path.h pio.h pma.h rbt.h rex.h sck.h sio.h \
|
||||
sll.h slmb.h str.h task.h time.h tio.h tmr.h tre.h uni.h uri.h \
|
||||
utf8.h xma.h Mmgr.hpp StdMmgr.hpp HeapMmgr.hpp Mmged.hpp \
|
||||
ScopedPtr.hpp SharedPtr.hpp Mpool.hpp Association.hpp \
|
||||
LinkedList.hpp HashList.hpp HashTable.hpp RedBlackTree.hpp \
|
||||
RedBlackTable.hpp Array.hpp BinaryHeap.hpp
|
||||
ScopedPtr.hpp SharedPtr.hpp StrBase.hpp String.hpp Mpool.hpp \
|
||||
Association.hpp LinkedList.hpp HashList.hpp HashTable.hpp \
|
||||
RedBlackTree.hpp RedBlackTable.hpp Array.hpp BinaryHeap.hpp
|
||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||
am__vpath_adj = case $$p in \
|
||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||
|
@ -77,28 +77,29 @@ public:
|
||||
SharedPtr (T* ptr = (T*)QSE_NULL, void* darg = (void*)QSE_NULL): Mmged(QSE_NULL)
|
||||
{
|
||||
this->_item = new (this->getMmgr()) item_t;
|
||||
this->_item->ref = 1;
|
||||
this->_item->ptr = ptr;
|
||||
this->_item->darg = darg;
|
||||
|
||||
this->_item->ref ();
|
||||
}
|
||||
|
||||
SharedPtr (Mmgr* mmgr, T* ptr = (T*)QSE_NULL, void* darg = (void*)QSE_NULL): Mmged(mmgr)
|
||||
{
|
||||
this->_item = new (this->getMmgr()) item_t;
|
||||
this->_item->ref = 1;
|
||||
this->_item->ptr = ptr;
|
||||
this->_item->darg = darg;
|
||||
|
||||
this->_item->ref ();
|
||||
}
|
||||
|
||||
SharedPtr (const SelfType& sp): Mmged(sp), _item(sp._item)
|
||||
{
|
||||
this->_item->ref++;
|
||||
this->_item->ref ();
|
||||
}
|
||||
|
||||
~SharedPtr ()
|
||||
{
|
||||
this->_item->ref--;
|
||||
if (this->_item->ref <= 0)
|
||||
if (this->_item->deref() <= 0)
|
||||
{
|
||||
if (this->_item->ptr) this->_item->deleter (this->_item->ptr, this->_item->darg);
|
||||
// no destructor as *this->_ref is a plain type.
|
||||
@ -110,8 +111,7 @@ public:
|
||||
{
|
||||
if (this != &sp)
|
||||
{
|
||||
this->_item->ref--;
|
||||
if (this->_item->ref <= 0)
|
||||
if (this->_item->deref() <= 0)
|
||||
{
|
||||
if (this->_item->ptr) this->_item->deleter (this->_item->ptr, this->_item->darg);
|
||||
// no destructor as *this->_ref is a plain type.
|
||||
@ -123,7 +123,7 @@ public:
|
||||
this->setMmgr (sp.getMmgr());
|
||||
|
||||
this->_item = sp._item;
|
||||
this->_item->ref++;
|
||||
this->_item->ref ();
|
||||
}
|
||||
|
||||
return *this;
|
||||
@ -175,9 +175,8 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
struct item_t
|
||||
struct item_t: public RefCounted
|
||||
{
|
||||
qse_size_t ref;
|
||||
T* ptr;
|
||||
void* darg;
|
||||
DELETER deleter;
|
||||
|
1012
qse/include/qse/cmn/StrBase.hpp
Normal file
1012
qse/include/qse/cmn/StrBase.hpp
Normal file
File diff suppressed because it is too large
Load Diff
80
qse/include/qse/cmn/String.hpp
Normal file
80
qse/include/qse/cmn/String.hpp
Normal file
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _QSE_CMN_STRING_HPP_
|
||||
#define _QSE_CMN_STRING_HPP_
|
||||
|
||||
#include <qse/cmn/StrBase.hpp>
|
||||
#include <qse/cmn/str.h>
|
||||
|
||||
/////////////////////////////////
|
||||
QSE_BEGIN_NAMESPACE(QSE)
|
||||
/////////////////////////////////
|
||||
|
||||
struct WcStringOpset
|
||||
{
|
||||
qse_size_t copy (qse_wchar_t* dst, const qse_wchar_t* src, qse_size_t ssz)
|
||||
{
|
||||
return qse_wcsncpy(dst, src, ssz);
|
||||
}
|
||||
|
||||
// compare two strings of the same length
|
||||
int compare (const qse_wchar_t* str1, const qse_wchar_t* str2, qse_size_t len)
|
||||
{
|
||||
return qse_wcsxncmp(str1, len, str2, len);
|
||||
}
|
||||
|
||||
// compare a length-bound string with a null-terminated string.
|
||||
int compare (const qse_wchar_t* str1, qse_size_t len, const qse_wchar_t* str2)
|
||||
{
|
||||
return qse_wcsxcmp(str1, len, str2);
|
||||
}
|
||||
|
||||
int length (const qse_wchar_t* str)
|
||||
{
|
||||
return qse_strlen(str);
|
||||
}
|
||||
};
|
||||
|
||||
//struct MbStringOpset
|
||||
//{
|
||||
//};
|
||||
|
||||
typedef StrBase<qse_wchar_t, QSE_WT('\0'), WcStringOpset > WcString;
|
||||
//typedef StrBase<qse_mchar_t, QSE_MT('\0'), MbStringOpset > MbString;
|
||||
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
//typedef MbString String;
|
||||
#else
|
||||
typedef WcString String;
|
||||
#endif
|
||||
|
||||
|
||||
/////////////////////////////////
|
||||
QSE_END_NAMESPACE(QSE)
|
||||
/////////////////////////////////
|
||||
|
||||
#endif
|
@ -98,7 +98,7 @@ if ENABLE_CXX
|
||||
#rex02_CXXFLAGS = -I/usr/lib/wx/include/gtk2-unicode-release-2.8 -I/usr/include/wx-2.8 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -D__WXGTK__ -pthread
|
||||
#rex02_LDFLAGS = -pthread -Wl,-Bsymbolic-functions -lwx_gtk2ud_richtext-2.8 -lwx_gtk2ud_aui-2.8 -lwx_gtk2ud_xrc-2.8 -lwx_gtk2ud_qa-2.8 -lwx_gtk2ud_html-2.8 -lwx_gtk2ud_adv-2.8 -lwx_gtk2ud_core-2.8 -lwx_baseud_xml-2.8 -lwx_baseud_net-2.8 -lwx_baseud-2.8
|
||||
|
||||
bin_PROGRAMS += arr01 bh01 hl01 htb02 rbt02 rbt03 sp01 sp02
|
||||
bin_PROGRAMS += arr01 bh01 hl01 htb02 rbt02 rbt03 sp01 sp02 str02
|
||||
|
||||
arr01_SOURCES = arr01.cpp
|
||||
arr01_LDADD = $(LDADD) -lqsecmnxx
|
||||
@ -124,4 +124,7 @@ sp01_LDADD = $(LDADD) -lqsecmnxx
|
||||
sp02_SOURCES = sp02.cpp # SharedPtr
|
||||
sp02_LDADD = $(LDADD) -lqsecmnxx
|
||||
|
||||
str02_SOURCES = str02.cpp # SharedPtr
|
||||
str02_LDADD = $(LDADD) -lqsecmnxx
|
||||
|
||||
endif
|
||||
|
@ -68,7 +68,7 @@ bin_PROGRAMS = chr01$(EXEEXT) dir01$(EXEEXT) dll$(EXEEXT) \
|
||||
#rex02_SOURCES = rex02.cpp
|
||||
#rex02_CXXFLAGS = -I/usr/lib/wx/include/gtk2-unicode-release-2.8 -I/usr/include/wx-2.8 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -D__WXGTK__ -pthread
|
||||
#rex02_LDFLAGS = -pthread -Wl,-Bsymbolic-functions -lwx_gtk2ud_richtext-2.8 -lwx_gtk2ud_aui-2.8 -lwx_gtk2ud_xrc-2.8 -lwx_gtk2ud_qa-2.8 -lwx_gtk2ud_html-2.8 -lwx_gtk2ud_adv-2.8 -lwx_gtk2ud_core-2.8 -lwx_baseud_xml-2.8 -lwx_baseud_net-2.8 -lwx_baseud-2.8
|
||||
@ENABLE_CXX_TRUE@am__append_2 = arr01 bh01 hl01 htb02 rbt02 rbt03 sp01 sp02
|
||||
@ENABLE_CXX_TRUE@am__append_2 = arr01 bh01 hl01 htb02 rbt02 rbt03 sp01 sp02 str02
|
||||
subdir = samples/cmn
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
@ -88,7 +88,8 @@ CONFIG_CLEAN_FILES =
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
@ENABLE_CXX_TRUE@am__EXEEXT_1 = arr01$(EXEEXT) bh01$(EXEEXT) \
|
||||
@ENABLE_CXX_TRUE@ hl01$(EXEEXT) htb02$(EXEEXT) rbt02$(EXEEXT) \
|
||||
@ENABLE_CXX_TRUE@ rbt03$(EXEEXT) sp01$(EXEEXT) sp02$(EXEEXT)
|
||||
@ENABLE_CXX_TRUE@ rbt03$(EXEEXT) sp01$(EXEEXT) sp02$(EXEEXT) \
|
||||
@ENABLE_CXX_TRUE@ str02$(EXEEXT)
|
||||
am__installdirs = "$(DESTDIR)$(bindir)"
|
||||
PROGRAMS = $(bin_PROGRAMS)
|
||||
am__arr01_SOURCES_DIST = arr01.cpp
|
||||
@ -269,6 +270,10 @@ am_str01_OBJECTS = str01.$(OBJEXT)
|
||||
str01_OBJECTS = $(am_str01_OBJECTS)
|
||||
str01_LDADD = $(LDADD)
|
||||
str01_DEPENDENCIES = $(am__DEPENDENCIES_2)
|
||||
am__str02_SOURCES_DIST = str02.cpp
|
||||
@ENABLE_CXX_TRUE@am_str02_OBJECTS = str02.$(OBJEXT)
|
||||
str02_OBJECTS = $(am_str02_OBJECTS)
|
||||
@ENABLE_CXX_TRUE@str02_DEPENDENCIES = $(am__DEPENDENCIES_3)
|
||||
task01_SOURCES = task01.c
|
||||
task01_OBJECTS = task01.$(OBJEXT)
|
||||
task01_LDADD = $(LDADD)
|
||||
@ -343,8 +348,9 @@ SOURCES = $(arr01_SOURCES) $(bh01_SOURCES) $(chr01_SOURCES) dir01.c \
|
||||
$(rbt01_SOURCES) $(rbt02_SOURCES) $(rbt03_SOURCES) \
|
||||
$(rex01_SOURCES) $(sio01_SOURCES) $(sio02_SOURCES) \
|
||||
$(sio03_SOURCES) $(sll_SOURCES) $(slmb01_SOURCES) \
|
||||
$(sp01_SOURCES) $(sp02_SOURCES) $(str01_SOURCES) task01.c \
|
||||
$(time_SOURCES) $(tre01_SOURCES) uri01.c $(xma_SOURCES)
|
||||
$(sp01_SOURCES) $(sp02_SOURCES) $(str01_SOURCES) \
|
||||
$(str02_SOURCES) task01.c $(time_SOURCES) $(tre01_SOURCES) \
|
||||
uri01.c $(xma_SOURCES)
|
||||
DIST_SOURCES = $(am__arr01_SOURCES_DIST) $(am__bh01_SOURCES_DIST) \
|
||||
$(chr01_SOURCES) dir01.c $(dll_SOURCES) $(env01_SOURCES) \
|
||||
$(fio01_SOURCES) $(fio02_SOURCES) $(fma_SOURCES) \
|
||||
@ -358,8 +364,9 @@ DIST_SOURCES = $(am__arr01_SOURCES_DIST) $(am__bh01_SOURCES_DIST) \
|
||||
$(am__rbt03_SOURCES_DIST) $(rex01_SOURCES) $(sio01_SOURCES) \
|
||||
$(sio02_SOURCES) $(sio03_SOURCES) $(sll_SOURCES) \
|
||||
$(slmb01_SOURCES) $(am__sp01_SOURCES_DIST) \
|
||||
$(am__sp02_SOURCES_DIST) $(str01_SOURCES) task01.c \
|
||||
$(time_SOURCES) $(tre01_SOURCES) uri01.c $(xma_SOURCES)
|
||||
$(am__sp02_SOURCES_DIST) $(str01_SOURCES) \
|
||||
$(am__str02_SOURCES_DIST) task01.c $(time_SOURCES) \
|
||||
$(tre01_SOURCES) uri01.c $(xma_SOURCES)
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
@ -599,6 +606,8 @@ xma_SOURCES = xma.c
|
||||
@ENABLE_CXX_TRUE@sp01_LDADD = $(LDADD) -lqsecmnxx
|
||||
@ENABLE_CXX_TRUE@sp02_SOURCES = sp02.cpp # SharedPtr
|
||||
@ENABLE_CXX_TRUE@sp02_LDADD = $(LDADD) -lqsecmnxx
|
||||
@ENABLE_CXX_TRUE@str02_SOURCES = str02.cpp # SharedPtr
|
||||
@ENABLE_CXX_TRUE@str02_LDADD = $(LDADD) -lqsecmnxx
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
@ -808,6 +817,9 @@ sp02$(EXEEXT): $(sp02_OBJECTS) $(sp02_DEPENDENCIES) $(EXTRA_sp02_DEPENDENCIES)
|
||||
str01$(EXEEXT): $(str01_OBJECTS) $(str01_DEPENDENCIES) $(EXTRA_str01_DEPENDENCIES)
|
||||
@rm -f str01$(EXEEXT)
|
||||
$(AM_V_CCLD)$(LINK) $(str01_OBJECTS) $(str01_LDADD) $(LIBS)
|
||||
str02$(EXEEXT): $(str02_OBJECTS) $(str02_DEPENDENCIES) $(EXTRA_str02_DEPENDENCIES)
|
||||
@rm -f str02$(EXEEXT)
|
||||
$(AM_V_CXXLD)$(CXXLINK) $(str02_OBJECTS) $(str02_LDADD) $(LIBS)
|
||||
task01$(EXEEXT): $(task01_OBJECTS) $(task01_DEPENDENCIES) $(EXTRA_task01_DEPENDENCIES)
|
||||
@rm -f task01$(EXEEXT)
|
||||
$(AM_V_CCLD)$(LINK) $(task01_OBJECTS) $(task01_LDADD) $(LIBS)
|
||||
@ -873,6 +885,7 @@ distclean-compile:
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sp01.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sp02.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str01.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str02.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task01.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tre01.Po@am__quote@
|
||||
|
35
qse/samples/cmn/str02.cpp
Normal file
35
qse/samples/cmn/str02.cpp
Normal file
@ -0,0 +1,35 @@
|
||||
#include <qse/cmn/sio.h>
|
||||
#include <qse/cmn/String.hpp>
|
||||
#include <qse/cmn/HeapMmgr.hpp>
|
||||
|
||||
|
||||
void t1 ()
|
||||
{
|
||||
QSE::HeapMmgr heap_mmgr (QSE::Mmgr::getDFL(), 30000);
|
||||
QSE::String* z = new QSE::String();
|
||||
|
||||
{
|
||||
QSE::String x (&heap_mmgr, QSE_T("this is a sample string"));
|
||||
QSE::String y (x);
|
||||
|
||||
*z = y;
|
||||
qse_printf (QSE_T("[%s]\n"), x.getBuffer());
|
||||
}
|
||||
|
||||
qse_printf (QSE_T("-----------------\n"));
|
||||
delete z;
|
||||
|
||||
}
|
||||
|
||||
int main ()
|
||||
{
|
||||
|
||||
|
||||
qse_openstdsios ();
|
||||
|
||||
t1 ();
|
||||
qse_printf (QSE_T("=================\n"));
|
||||
qse_closestdsios ();
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user