C++源碼分享(四):對象屬性泛型基類

來源:互聯網
上載者:User

   對象屬性泛型基類可用於儲存對象的屬性,類似於DOM節點的屬性儲存,提供屬性遍曆,使用方法如下:

 

class CView : public Base::CObjectAttributesBase

{

...

};

 

 

//**********************************************************************
// Copyright (c) 2010
// 迪斯特軟體開發小組.
// 檔案: ObjectAttributeBase.hpp
// 內容:
// 曆史:
//    序號        修改時間        修改人        修改內容
//    1            2010-8-2        hlq            首次產生
//*********************************************************************

//聲明本標頭檔宏   
#ifndef _OBJECTATTRIBUTEBASE_HPP
#define _OBJECTATTRIBUTEBASE_HPP

//包含標頭檔
#include <string>
#include <list>

//Base名字空間開始
namespace Base
{

//**********************************************************************
// 類名: CObjectAttributesBase
// 目的: 對象屬性集基類
//*********************************************************************
class CObjectAttributesBase
{
////型別宣告
public:
    typedef CObjectAttributesBase                                my_type;
    typedef std::string                                            string_type;
    typedef std::list<std::pair<string_type,string_type> >        attribute_container_type;
    typedef attribute_container_type::value_type                attribute_type;
    typedef attribute_container_type::const_iterator            attribute_const_iterator;
    typedef attribute_container_type::iterator                    attribute_iterator;
    typedef unsigned int                                        size_type;
    typedef size_type                                            index_type;

////基本查詢
public:
    //是否有指定屬性
    bool HasAttribute(const string_type& szName) const {return attribute_find(szName) != attribute_end();}
    //得到屬性數量
    size_type GetAttributesCount(void) const {return static_cast<size_type>(m_aAttributes.size());}
    //得到屬性名稱
    const string_type& GetAttributeName(index_type nIndex) const;
    //得到屬性值
    const string_type& GetAttribute(const string_type& szName) const;
    //得到帶預設值的屬性值
    const string_type& GetAttribute(const string_type& szName,const string_type& szDefaultValue) const;
    //得到屬性值(模板)
    template<typename T> void GetAttribute(const string_type& szName,T& aValue) const {Convert(GetAttribute(szName),aValue);}
    //得到帶預設值的屬性值(模板)
    template<typename T,typename T1> void GetAttribute(const string_type& szName,T& aValue,const T1& aDefaultValue) const;
    //屬性事件是否已經凍結
    bool IsAttributeEventFreezeed(void) const {return m_bFreezeAttributeEvent;}

////命令
public:
    //插入屬性
    void InsertAttribute(index_type nIndex,const string_type& szName,const string_type& szValue);
    //插入屬性(模板)
    template<typename T> void InsertAttribute(index_type nIndex,const string_type& szName,const T& aValue) {InsertAttribute(nIndex,szName,Convert<string_type>(aValue));}
    //添加屬性
    void AppendAttribute(const string_type& szName,const string_type& szValue) {InsertAttribute(m_aAttributes.size(),szName,szValue);}
    //添加屬性(模板)
    template<typename T> void AppendAttribute(const string_type& szName,const T& szValue) {AppendAttribute(szName,Convert<string_type>(aValue));}
    //修改屬性
    void ModifyAttribute(const string_type& szName,const string_type& szValue);
    //修改屬性(模板)
    template<typename T> void ModifyAttribute(const string_type& szName,const T& aValue){ModifyAttribute(szName,Convert<string_type>(aValue));}
    //設定屬性
    void SetAttribute(const string_type& szName,const string_type& szValue);
    //設定屬性(模板)
    template<typename T> void SetAttribute(const string_type& szName,const T& aValue) {SetAttribute(szName,Convert<string_type>(aValue));}
    //刪除屬性
    void RemoveAttribute(const string_type& szName);
    //清除屬性
    void ClearAttributes(void);
    //凍結屬性事件通知
    void FreezeAttributeEvent(bool bFreeze) {m_bFreezeAttributeEvent = bFreeze;}

////事件重載函數
public:
    //即將添加屬性事件
    virtual void OnAttributeWillAdd(const string_type& szName,const string_type& szValue,bool& bPermit) {}
    //屬性已經添加事件
    virtual void OnAttributeAdded(const string_type& szName,const string_type& szValue){}
    //即將修改屬性事件
    virtual void OnAttributeWillModify(const string_type& szName,const string_type& szValue,bool& bPermit) {}
    //屬性已經修改事件
    virtual void OnAttributeModified(const string_type& szName,const string_type& szValue) {}
    //即將刪除屬性事件
    virtual void OnAttributeWillRemove(const string_type& szName,bool& bPermit) {}
    //屬性已經刪除事件
    virtual void OnAttributeRemoved(const string_type& szName) {}
    //即將清除所有屬性事件
    virtual void OnAttributesWillClear(bool& bPermit) {}
    //屬性已經清除事件
    virtual void OnAttributesCleared(void) {}

////構造、解構函式
public:
    //建構函式
    CObjectAttributesBase(void) : m_bFreezeAttributeEvent(false) {}

////迭代器實現
public:
    attribute_iterator attribute_begin(void) { return m_aAttributes.begin();}
    attribute_const_iterator attribute_begin(void) const { return m_aAttributes.begin();}
    attribute_iterator attribute_end(void) { return m_aAttributes.end();}
    attribute_const_iterator attribute_end(void) const { return m_aAttributes.end();}
    attribute_iterator attribute_find(const string_type& szName);
    attribute_const_iterator attribute_find(const string_type& szName) const;

////執行函數
public:
    //轉換資料類型
    template<typename FromType,typename ToType>    static void Convert(const FromType& aFromValue,ToType& aToValue);
    //轉換資料類型
    template<typename FromType,typename ToType>    static const ToType Convert(const FromType& aFromValue) {ToType aValue;Convert(aFromValue,aValue);return aValue;}

////資料成員
private:
    attribute_container_type                m_aAttributes;                    //屬性集合
    bool                                    m_bFreezeAttributeEvent;        //凍結屬性事件
};

//**********************************************************************
// 函數: attribute_find
// 功能: 尋找屬性
//*********************************************************************
inline CObjectAttributesBase::attribute_iterator CObjectAttributesBase::attribute_find(const string_type& szName)
{
    attribute_iterator pEnd = attribute_end();
    for(attribute_iterator p = attribute_begin();p != pEnd;++p)
    {
        if(p->first == szName)
            return p;
    }
    return pEnd;
}

//**********************************************************************
// 函數: attribute_find
// 功能: 尋找屬性
//*********************************************************************
inline CObjectAttributesBase::attribute_const_iterator CObjectAttributesBase::attribute_find(const string_type& szName) const
{
    attribute_const_iterator pEnd = attribute_end();
    for(attribute_const_iterator p = attribute_begin();p != pEnd;++p)
    {
        if(p->first == szName)
            return p;
    }
    return pEnd;
}

//**********************************************************************
// 函數: Convert
// 功能: 轉換資料類型
//*********************************************************************
template<typename FromType,typename ToType>   
inline void CObjectAttributesBase::Convert(const FromType& aFromValue,ToType& aToValue)
{
    string_typestream ss;
    ss << aFromValue;
    ss >> aToValue;
    return aToValue;
}

//**********************************************************************
// 函數: GetAttributeName
// 功能: 得到屬性名稱
//*********************************************************************
inline const CObjectAttributesBase::string_type& CObjectAttributesBase::GetAttributeName(index_type nIndex) const
{
    attribute_const_iterator p;
    if(nIndex >= GetAttributesCount())
    {
        static string_type s_szEmptyName;
        return s_szEmptyName;
    }
    else
    {
        p = attribute_begin();
        std::advance(p,nIndex);
        return p->first;
    }
}

//**********************************************************************
// 函數: GetAttribute
// 功能: 得到屬性值
//*********************************************************************
inline const CObjectAttributesBase::string_type& CObjectAttributesBase::GetAttribute(const string_type& szName) const
{
    static string_type s_szEmptyValue;
    attribute_const_iterator p = attribute_find(szName);
    return (p != attribute_end()) ? p->second : s_szEmptyValue;
}

//**********************************************************************
// 函數: GetAttribute
// 功能: 得到帶預設值的屬性值
//*********************************************************************
inline const CObjectAttributesBase::string_type& CObjectAttributesBase::GetAttribute(const string_type& szName,const string_type& szDefaultValue) const
{
    attribute_const_iterator p = attribute_find(szName);
    if(p != attribute_end())
        return p->second;
    else
    {
        static string_type s_szDefaultValue;
        s_szDefaultValue = szDefaultValue;
        return s_szDefaultValue;
    }
}

//**********************************************************************
// 函數: GetAttribute
// 功能: 得到帶預設值的屬性值(模板)
//*********************************************************************
template<typename T,typename T1>
inline void CObjectAttributesBase::GetAttribute(const string_type& szName,T& aValue, const T1& aDefaultValue) const
{
    string_typestream ss;
    attribute_const_iterator p = attribute_find(szName);
    if(p != attribute_end())
        ss << p->second;
    else
        ss << aDefaultValue;
    ss >> aValue;
}

//**********************************************************************
// 函數: InsertAttribute
// 功能: 插入屬性
//*********************************************************************
inline void CObjectAttributesBase::InsertAttribute(index_type nIndex,const string_type& szName,const string_type& szValue)
{
    //前條件
    assert(!HasAttribute(szName));

    //煥發事件
    if(!IsAttributeEventFreezeed())
    {
        bool bPermit = true;
        OnAttributeWillAdd(szName,szValue,bPermit);
        if(!bPermit)
            return;
    }

    //添加屬性
    if(nIndex > m_aAttributes.size())
        nIndex = m_aAttributes.size();
    attribute_iterator p = attribute_begin();
    std::advance(p,nIndex);
    m_aAttributes.insert(p,attribute_type(szName,szValue));
    assert(HasAttribute(szName));

    //煥發事件
    if(!IsAttributeEventFreezeed())
        OnAttributeAdded(szName,szValue);
}

//**********************************************************************
// 函數: ModifyAttribute
// 功能: 修改屬性
//*********************************************************************
inline void CObjectAttributesBase::ModifyAttribute(const string_type& szName,const string_type& szValue)
{
    assert(HasAttribute(szName));
    attribute_iterator p = attribute_find(szName);
    if(!IsAttributeEventFreezeed())
    {
        //煥發事件
        bool bPermit = true;
        OnAttributeWillModify(szName,szValue,bPermit);
        if(!bPermit)
            return;
    }

    //修改屬性
    p->second = szValue;

    //煥發事件
    if(!IsAttributeEventFreezeed())
        OnAttributeModified(szName,szValue);
}

//**********************************************************************
// 函數: SetAttribute
// 功能: 設定屬性
//*********************************************************************
inline void CObjectAttributesBase::SetAttribute(const string_type& szName,const string_type& szValue)
{
    if(HasAttribute(szName))
        ModifyAttribute(szName,szValue);
    else
        AppendAttribute(szName,szValue);
}

//**********************************************************************
// 函數: RemoveAttribute
// 功能: 刪除屬性
//*********************************************************************
inline void CObjectAttributesBase::RemoveAttribute(const string_type& szName)
{
    attribute_iterator p = attribute_find(szName);
    if(p != attribute_end())
    {
        if(!IsAttributeEventFreezeed())
        {
            //煥發事件
            bool bPermit = true;
            OnAttributeWillRemove(szName,bPermit);
            if(!bPermit)
                return;
        }

        //移除屬性
        m_aAttributes.erase(p);   

        //煥發事件
        if(!IsAttributeEventFreezeed())
            OnAttributeRemoved(szName);
    }
}

//**********************************************************************
// 函數: ClearAttributes
// 功能: 清除屬性
//*********************************************************************
inline void CObjectAttributesBase::ClearAttributes(void)
{
    //煥發事件
    if(!IsAttributeEventFreezeed())
    {
        bool bPermit = true;
        OnAttributesWillClear(bPermit);
        if(!bPermit)
            return;
    }

    //清除屬性
    m_aAttributes.clear();

    //煥發事件
    if(!IsAttributeEventFreezeed())
        OnAttributesCleared();
}

} // Base名字空間結束
#endif //假如未定義_OBJECTATTRIBUTEBASE_HPP宏

 

 

胡樂秋

2010/8/3

http://blog.csdn.net/hlqyq

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.