The object attribute generic base class can be used to save the attributes of an object. It is similar to the attributes of a DOM node and provides property traversal. The usage is as follows:
Class cview: public base: cobjectattributesbase
{
...
};
//************************************** ********************************
// Copy right (c) 2010
// Dester software development team.
// File: objectattributebase. HPP
// Content:
// History:
// Modified by the sequence number modification time
// 1 2010-8-2 hlq First Generation
//************************************** *******************************
// Declare the macro of this header file
# Ifndef _ objectattributebase_hpp
# DEFINE _ objectattributebase_hpp
// Contains the header file
# Include <string>
# Include <list>
// Base namespace starts
Namespace Base
{
//************************************** ********************************
// Class Name: cobjectattributesbase
// Purpose: Object Property set base class
//************************************** *******************************
Class cobjectattributesbase
{
//// Type declaration
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;
//// Basic query
Public:
// Whether the specified attribute exists
Bool hasattribute (const string_type & szname) const {return attribute_find (szname )! = Attribute_end ();}
// Obtain the attribute quantity
Size_type getattributescount (void) const {return static_cast <size_type> (m_aattributes.size ());}
// Obtain the attribute name.
Const string_type & getattributename (index_type nindex) const;
// Obtain the property value
Const string_type & getattribute (const string_type & szname) const;
// Obtain the property value with the default value
Const string_type & getattribute (const string_type & szname, const string_type & szdefaultvalue) const;
// Get the property value (Template)
Template <typename T> void getattribute (const string_type & szname, T & avalue) const {convert (getattribute (szname), avalue );}
// Get the property value with the default value (Template)
Template <typename T, typename T1> void getattribute (const string_type & szname, T & avalue, const T1 & adefaultvalue) const;
// Whether the property event has been frozen
Bool isattributeeventfreezeed (void) const {return m_bfreezeattributeevent ;}
//// Command
Public:
// Insert attributes
Void insertattribute (index_type nindex, const string_type & szname, const string_type & szvalue );
// Insert attributes (Template)
Template <typename T> void insertattribute (index_type nindex, const string_type & szname, const T & avalue) {insertattribute (nindex, szname, convert <string_type> (avalue ));}
// Add attributes
Void appendattribute (const string_type & szname, const string_type & szvalue) {insertattribute (m_aattributes.size (), szname, szvalue );}
// Add attributes (Template)
Template <typename T> void appendattribute (const string_type & szname, const T & szvalue) {appendattribute (szname, convert <string_type> (avalue ));}
// Modify attributes
Void modifyattribute (const string_type & szname, const string_type & szvalue );
// Modify attributes (Template)
Template <typename T> void modifyattribute (const string_type & szname, const T & avalue) {modifyattribute (szname, convert <string_type> (avalue ));}
// Set attributes
Void setattribute (const string_type & szname, const string_type & szvalue );
// Set attributes (Template)
Template <typename T> void setattribute (const string_type & szname, const T & avalue) {setattribute (szname, convert <string_type> (avalue ));}
// Delete attributes
Void removeattribute (const string_type & szname );
// Clear attributes
Void clearattributes (void );
// Notification of property freezing event
Void freezeattributeevent (bool bfreeze) {m_bfreezeattributeevent = bfreeze ;}
//// Event overload Function
Public:
// Attribute event to be added
Virtual void onattributewilladd (const string_type & szname, const string_type & szvalue, bool & bpermit ){}
// An event has been added to the property.
Virtual void onattributeadded (const string_type & szname, const string_type & szvalue ){}
// Attribute event to be modified
Virtual void onattributewillmodify (const string_type & szname, const string_type & szvalue, bool & bpermit ){}
// The attribute has been modified.
Virtual void onattributemodified (const string_type & szname, const string_type & szvalue ){}
// Attribute event to be deleted
Virtual void onattributewillremove (const string_type & szname, bool & bpermit ){}
// The property has been deleted.
Virtual void onattributeremoved (const string_type & szname ){}
// All attribute events to be cleared
Virtual void onattributeswillclear (bool & bpermit ){}
// The property has been cleared.
Virtual void onattributescleared (void ){}
//// Constructor and destructor
Public:
// Constructor
Cobjectattributesbase (void): m_bfreezeattributeevent (false ){}
//// Iterator implementation
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;
//// Execute the Function
Public:
// Convert the Data Type
Template <typename fromtype, typename totype> static void convert (const fromtype & afromvalue, totype & atovalue );
// Convert the Data Type
Template <typename fromtype, typename totype> static const totype convert (const fromtype & afromvalue) {totype avalue; convert (afromvalue, avalue); Return avalue ;}
/// Data member
PRIVATE:
Attribute_container_type m_aattributes; // Attribute Set
Bool m_bfreezeattributeevent; // freeze attribute events
};
//************************************** ********************************
// Function: attribute_find
// Function: Search for Attributes
//************************************** *******************************
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;
}
//************************************** ********************************
// Function: attribute_find
// Function: Search for Attributes
//************************************** *******************************
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;
}
//************************************** ********************************
// Function: Convert
// Function: convert data types
//************************************** *******************************
Template <typename fromtype, typename totype>
Inline void cobjectattributesbase: Convert (const fromtype & afromvalue, totype & atovalue)
{
String_typestream SS;
SS <afromvalue;
SS> atovalue;
Return atovalue;
}
//************************************** ********************************
// Function: getattributename
// Function: Get the property name
//************************************** *******************************
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;
}
}
//************************************** ********************************
// Function: getattribute
// Function: Get the property value
//************************************** *******************************
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;
}
//************************************** ********************************
// Function: getattribute
// Function: Get the property value with the default value
//************************************** *******************************
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;
}
}
//************************************** ********************************
// Function: getattribute
// Function: Get the property value with the default value (Template)
//************************************** *******************************
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;
}
//************************************** ********************************
// Function: insertattribute
// Function: insert attributes
//************************************** *******************************
Inline void cobjectattributesbase: insertattribute (index_type nindex, const string_type & szname, const string_type & szvalue)
{
// Prerequisites
Assert (! Hasattribute (szname ));
// Glow event
If (! Isattributeeventfreezeed ())
{
Bool bpermit = true;
Onattributewilladd (szname, szvalue, bpermit );
If (! Bpermit)
Return;
}
// Add attributes
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 ));
// Glow event
If (! Isattributeeventfreezeed ())
Onattributeadded (szname, szvalue );
}
//************************************** ********************************
// Function: modifyattribute
// Function: modify attributes
//************************************** *******************************
Inline void cobjectattributesbase: modifyattribute (const string_type & szname, const string_type & szvalue)
{
Assert (hasattribute (szname ));
Attribute_iterator P = attribute_find (szname );
If (! Isattributeeventfreezeed ())
{
// Glow event
Bool bpermit = true;
Onattributewillmodify (szname, szvalue, bpermit );
If (! Bpermit)
Return;
}
// Modify attributes
P-> second = szvalue;
// Glow event
If (! Isattributeeventfreezeed ())
Onattributemodified (szname, szvalue );
}
//************************************** ********************************
// Function: setattribute
// Function: Set attributes
//************************************** *******************************
Inline void cobjectattributesbase: setattribute (const string_type & szname, const string_type & szvalue)
{
If (hasattribute (szname ))
Modifyattribute (szname, szvalue );
Else
Appendattribute (szname, szvalue );
}
//************************************** ********************************
// Function: removeattribute
// Function: delete attributes
//************************************** *******************************
Inline void cobjectattributesbase: removeattribute (const string_type & szname)
{
Attribute_iterator P = attribute_find (szname );
If (P! = Attribute_end ())
{
If (! Isattributeeventfreezeed ())
{
// Glow event
Bool bpermit = true;
Onattributewillremove (szname, bpermit );
If (! Bpermit)
Return;
}
// Remove attributes
M_aattributes.erase (P );
// Glow event
If (! Isattributeeventfreezeed ())
Onattributeremoved (szname );
}
}
//************************************** ********************************
// Function: clearattributes
// Function: Clear attributes
//************************************** *******************************
Inline void cobjectattributesbase: clearattributes (void)
{
// Glow event
If (! Isattributeeventfreezeed ())
{
Bool bpermit = true;
Onattributeswillclear (bpermit );
If (! Bpermit)
Return;
}
// Clear attributes
M_aattributes.clear ();
// Glow event
If (! Isattributeeventfreezeed ())
Onattributescleared ();
}
} // End of base namespace
# Endif // If the _ objectattributebase_hpp macro is not defined
Hu leqiu
2010/8/3
Http://blog.csdn.net/hlqyq