📄 object.h
字号:
When comparing class names, always use the #strcmp()# function rather than comparing pointers. The pointers are not necessarily the same over compilation units depending on the compiler, platform etc. The #PCLASSINFO# macro declares an override of this function for the particular class. The user need not implement it. @return pointer to C string literal. */ virtual const char * GetClass(unsigned /*ancestor*/ = 0) const { return Class(); } BOOL IsClass(const char * cls) const { return strcmp(cls, GetClass()) == 0; } /** Determine if the dynamic type of the current instance is a descendent of the specified class. The class name is usually provided by the #Class()# static function of the desired class. The #PCLASSINFO# macro declares an override of this function for the particular class. The user need not implement it. @return TRUE if object is descended from the class. */ virtual BOOL InternalIsDescendant( const char * clsName // Ancestor class name to compare against. ) const { return IsClass(clsName); } //@} /**@name Comparison functions */ //@{ /** Result of the comparison operation performed by the #Compare()# function. */ enum Comparison { LessThan = -1, EqualTo = 0, GreaterThan = 1 }; /** Compare the two objects and return their relative rank. This function is usually overridden by descendent classes to yield the ranking according to the semantics of the object. The default function is to use the #CompareObjectMemoryDirect()# function to do a byte wise memory comparison of the two objects. @return #LessThan#, #EqualTo# or #GreaterThan# according to the relative rank of the objects. */ virtual Comparison Compare( const PObject & obj // Object to compare against. ) const; /** Determine the byte wise comparison of two objects. This is the default comparison operation for objects that do not explicitly override the #Compare()# function. The #PCLASSINFO# macro declares an override of this function for the particular class. The user need not implement it. @return #LessThan#, #EqualTo# or #GreaterThan# according to the result #memcpy()# function. */ virtual Comparison CompareObjectMemoryDirect( const PObject & obj // Object to compare against. ) const; /** Compare the two objects. @return TRUE if objects are equal. */ bool operator==( const PObject & obj // Object to compare against. ) const { return Compare(obj) == EqualTo; } /** Compare the two objects. @return TRUE if objects are not equal. */ bool operator!=( const PObject & obj // Object to compare against. ) const { return Compare(obj) != EqualTo; } /** Compare the two objects. @return TRUE if objects are less than. */ bool operator<( const PObject & obj // Object to compare against. ) const { return Compare(obj) == LessThan; } /** Compare the two objects. @return TRUE if objects are greater than. */ bool operator>( const PObject & obj // Object to compare against. ) const { return Compare(obj) == GreaterThan; } /** Compare the two objects. @return TRUE if objects are less than or equal. */ bool operator<=( const PObject & obj // Object to compare against. ) const { return Compare(obj) != GreaterThan; } /** Compare the two objects. @return TRUE if objects are greater than or equal. */ bool operator>=( const PObject & obj // Object to compare against. ) const { return Compare(obj) != LessThan; } //@} /**@name I/O functions */ //@{ /** Output the contents of the object to the stream. The exact output is dependent on the exact semantics of the descendent class. This is primarily used by the standard #operator<<# function. The default behaviour is to print the class name. */ virtual void PrintOn( ostream &strm // Stream to print the object into. ) const; /** Input the contents of the object from the stream. The exact input is dependent on the exact semantics of the descendent class. This is primarily used by the standard #operator>># function. The default behaviour is to do nothing. */ virtual void ReadFrom( istream &strm // Stream to read the objects contents from. ); /** Global function for using the standard << operator on objects descended from PObject. This simply calls the objects #PrintOn()# function. @return the #strm# parameter. */ inline friend ostream & operator<<( ostream &strm, // Stream to print the object into. const PObject & obj // Object to print to the stream. ) { obj.PrintOn(strm); return strm; } /** Global function for using the standard >> operator on objects descended from PObject. This simply calls the objects #ReadFrom()# function. @return the #strm# parameter. */ inline friend istream & operator>>( istream &strm, // Stream to read the objects contents from. PObject & obj // Object to read inormation into. ) { obj.ReadFrom(strm); return strm; } /**@name Miscellaneous functions */ //@{ /** Create a copy of the class on the heap. The exact semantics of the descendent class determine what is required to make a duplicate of the instance. Not all classes can even {\bf do} a clone operation. The main user of the clone function is the #PDictionary# class as it requires copies of the dictionary keys. The default behaviour is for this function to assert. @return pointer to new copy of the class instance. */ virtual PObject * Clone() const; /** This function yields a hash value required by the #PDictionary# class. A descendent class that is required to be the key of a dictionary should override this function. The precise values returned is dependent on the semantics of the class. For example, the #PString# class overrides it to provide a hash function for distinguishing text strings. The default behaviour is to return the value zero. @return hash function value for class instance. */ virtual PINDEX HashFunction() const; //@}};///////////////////////////////////////////////////////////////////////////////// Platform independent types// All these classes encapsulate primitive types such that they may be// transfered in a platform independent manner. In particular it is used to// do byte swapping for little endien and big endien processor architectures// as well as accommodating structure packing rules for memory structures.#define PANSI_CHAR 1#define PLITTLE_ENDIAN 2#define PBIG_ENDIAN 3#if 0class PStandardType/* Encapsulate a standard 8 bit character into a portable format. This would rarely need to do translation, only if the target platform uses EBCDIC would it do anything. The platform independent form here is always 8 bit ANSI. */{ public: PStandardType( type newVal // Value to initialise data in platform dependent form. ) { data = newVal; } /* Create a new instance of the platform independent type using platform dependent data, or platform independent streams. */ operator type() { return data; } /* Get the platform dependent value for the type. @return data for instance. */ friend ostream & operator<<(ostream & strm, const PStandardType & val) { return strm << (type)val; } /* Output the platform dependent value for the type to the stream. @return the stream output was made to. */ friend istream & operator>>(istream & strm, PStandardType & val) { type data; strm >> data; val = PStandardType(data); return strm; } /* Input the platform dependent value for the type from the stream. @return the stream input was made from. */ private: type data;};#endif#define PI_SAME(name, type) \ struct name { \ name() { } \ name(type value) { data = value; } \ name(const name & value) { data = value.data; } \ name & operator =(type value) { data = value; return *this; } \ name & operator =(const name & value) { data = value.data; return *this; } \ operator type() const { return data; } \ friend ostream & operator<<(ostream & s, const name & v) { return s << v.data; } \ friend istream & operator>>(istream & s, name & v) { return s >> v.data; } \ private: type data; \ }#define PI_LOOP(src, dst) \ BYTE *s = ((BYTE *)&src)+sizeof(src); BYTE *d = (BYTE *)&dst; \ while (s != (BYTE *)&src) *d++ = *--s;#define PI_DIFF(name, type) \ struct name { \ name() { } \ name(type value) { operator=(value); } \ name(const name & value) { data = value.data; } \ name & operator =(type value) { PI_LOOP(value, data); return *this; } \ name & operator =(const name & value) { data = value.data; return *this; } \ operator type() const { type value; PI_LOOP(data, value); return value; } \ friend ostream & operator<<(ostream & s, const name & value) { return s << (type)value; } \ friend istream & operator>>(istream & s, name & v) { type val; s >> val; v = val; return s; } \ private: type data; \ }#ifndef PCHAR8#define PCHAR8 PANSI_CHAR#endif#if PCHAR8==PANSI_CHARPI_SAME(PChar8, char);#endifPI_SAME(PInt8, signed char);PI_SAME(PUInt8, unsigned char);#if PBYTE_ORDER==PLITTLE_ENDIANPI_SAME(PInt16l, PInt16);#elif PBYTE_ORDER==PBIG_ENDIANPI_DIFF(PInt16l, PInt16);#endif#if PBYTE_ORDER==PLITTLE_ENDIANPI_DIFF(PInt16b, PInt16);#elif PBYTE_ORDER==PBIG_ENDIANPI_SAME(PInt16b, PInt16);#endif#if PBYTE_ORDER==PLITTLE_ENDIANPI_SAME(PUInt16l, WORD);#elif PBYTE_ORDER==PBIG_ENDIANPI_DIFF(PUInt16l, WORD);#endif#if PBYTE_ORDER==PLITTLE_ENDIANPI_DIFF(PUInt16b, WORD);#elif PBYTE_ORDER==PBIG_ENDIANPI_SAME(PUInt16b, WORD);#endif#if PBYTE_ORDER==PLITTLE_ENDIANPI_SAME(PInt32l, PInt32);#elif PBYTE_ORDER==PBIG_ENDIANPI_DIFF(PInt32l, PInt32);#endif#if PBYTE_ORDER==PLITTLE_ENDIANPI_DIFF(PInt32b, PInt32);#elif PBYTE_ORDER==PBIG_ENDIANPI_SAME(PInt32b, PInt32);#endif#if PBYTE_ORDER==PLITTLE_ENDIANPI_SAME(PUInt32l, DWORD);#elif PBYTE_ORDER==PBIG_ENDIANPI_DIFF(PUInt32l, DWORD);#endif#if PBYTE_ORDER==PLITTLE_ENDIANPI_DIFF(PUInt32b, DWORD);#elif PBYTE_ORDER==PBIG_ENDIANPI_SAME(PUInt32b, DWORD);#endif#if PBYTE_ORDER==PLITTLE_ENDIANPI_SAME(PInt64l, PInt64);#elif PBYTE_ORDER==PBIG_ENDIANPI_DIFF(PInt64l, PInt64);#endif#if PBYTE_ORDER==PLITTLE_ENDIANPI_DIFF(PInt64b, PInt64);#elif PBYTE_ORDER==PBIG_ENDIANPI_SAME(PInt64b, PInt64);#endif#if PBYTE_ORDER==PLITTLE_ENDIANPI_SAME(PUInt64l, PUInt64);#elif PBYTE_ORDER==PBIG_ENDIANPI_DIFF(PUInt64l, PUInt64);#endif#if PBYTE_ORDER==PLITTLE_ENDIANPI_DIFF(PUInt64b, PUInt64);#elif PBYTE_ORDER==PBIG_ENDIANPI_SAME(PUInt64b, PUInt64);#endif#if PBYTE_ORDER==PLITTLE_ENDIANPI_SAME(PFloat32l, float);#elif PBYTE_ORDER==PBIG_ENDIANPI_DIFF(PFloat32l, float);#endif#if PBYTE_ORDER==PLITTLE_ENDIANPI_DIFF(PFloat32b, float);#elif PBYTE_ORDER==PBIG_ENDIANPI_SAME(PFloat32b, float);#endif#if PBYTE_ORDER==PLITTLE_ENDIANPI_SAME(PFloat64l, double);#elif PBYTE_ORDER==PBIG_ENDIANPI_DIFF(PFloat64l, double);#endif#if PBYTE_ORDER==PLITTLE_ENDIANPI_DIFF(PFloat64b, double);#elif PBYTE_ORDER==PBIG_ENDIANPI_SAME(PFloat64b, double);#endif#ifndef NO_LONG_DOUBLE // stupid OSX compiler#if PBYTE_ORDER==PLITTLE_ENDIANPI_SAME(PFloat80l, long double);#elif PBYTE_ORDER==PBIG_ENDIANPI_DIFF(PFloat80l, long double);#endif#if PBYTE_ORDER==PLITTLE_ENDIANPI_DIFF(PFloat80b, long double);#elif PBYTE_ORDER==PBIG_ENDIANPI_SAME(PFloat80b, long double);#endif#endif#undef PI_LOOP#undef PI_SAME#undef PI_DIFF///////////////////////////////////////////////////////////////////////////////// Miscellaneous/*$MACRO PARRAYSIZE(array) This macro is used to calculate the number of array elements in a static array. */#define PARRAYSIZE(array) ((PINDEX)(sizeof(array)/sizeof(array[0])))/*$MACRO PMIN(v1, v2) This macro is used to calculate the minimum of two values. As this is a macro the expression in #v1# or #v2# is executed twice so extreme care should be made in its use. */#define PMIN(v1, v2) ((v1) < (v2) ? (v1) : (v2))/*$MACRO PMAX(v1, v2) This macro is used to calculate the maximum of two values. As this is a macro the expression in #v1# or #v2# is executed twice so extreme care should be made in its use. */#define PMAX(v1, v2) ((v1) > (v2) ? (v1) : (v2))/*$MACRO PABS(val) This macro is used to calculate an absolute value. As this is a macro the expression in #val# is executed twice so extreme care should be made in its use. */#define PABS(v) ((v) < 0 ? -(v) : (v))#endif // _POBJECT_H// End Of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -