您的位置:首页 > 编程语言 > C语言/C++

C++源码分享(四):对象属性泛型基类

2010-08-03 11:21 441 查看
对象属性泛型基类可用于保存对象的属性,类似于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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: