📄 screfobj.h
字号:
/*
* This file is part of the EMFexplorer projet.
* Copyright (C) 2004 Smith Charles.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*
* Extension: for commercial use, apply the Equity Public License, which
* adds to the normal terms of the GLPL a condition of donation to the author.
* If you are interested in support for this source code,
* contact Smith Charles <smith.charles@free.fr> for more information.
*/
#ifndef _SCREFOBJ_H_
#define _SCREFOBJ_H_
///
/// Little class to keep the counter
///
class SCCounterKeeper
{
public:
SCCounterKeeper() : m_ulCounter(0) {;}
unsigned long &SCGet() { return m_ulCounter; }
private:
unsigned long m_ulCounter;
};
///
/// Declare SCAddRef/SCRelease and the counter
///
#define SC_DECLARE_REFCOUNT() \
public : \
unsigned long SCAddRef();\
unsigned long SCRelease();\
unsigned long SCGetRefCount() { return _m_SCCounter.SCGet();}\
protected:\
SCCounterKeeper _m_SCCounter;
///
/// Implement (SCAddRef/SCRelease)
///
#define SC_IMPLEMENT_REFCOUNT(ClassName)\
unsigned long ClassName##::SCAddRef()\
{\
return ++(_m_SCCounter.SCGet());\
}\
unsigned long ClassName##::SCRelease()\
{\
if (--(_m_SCCounter.SCGet())) return (_m_SCCounter.SCGet()); \
delete this;\
return 0;\
}
///
/// Implement (SCAddRef/SCRelease) for template
///
#define SC_IMPLEMENT_REFCOUNT_TEMPLATE(ClassName)\
template <class T> \
unsigned long ClassName##< T >::SCAddRef()\
{\
return ++(_m_SCCounter.SCGet());\
}\
template <class T> \
unsigned long ClassName##< T >::SCRelease()\
{\
if (--(_m_SCCounter.SCGet())) return (_m_SCCounter.SCGet()); \
delete this;\
return 0;\
}
///
/// Operation macros
///
#define SC_REFCOUNTED_ADDREF(pObj)\
((pObj) ? pObj->SCAddRef() : 0)
#define SC_REFCOUNTED_RELEASE(pObj)\
((pObj) ? pObj->SCRelease() : 0)
#define SC_REFCOUNTED_SAFERELEASE(pObj)\
((pObj)? pObj=(0==pObj->SCRelease())?NULL:pObj :0)
#define SC_REFCOUNTED_AUTO_ADDREF()\
this->SCAddRef()
#define SC_REFCOUNTED_AUTO_RELEASE()\
this->SCRelease()
#endif //_SCREFOBJ_H_
// ------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -