📄 object.h
字号:
@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 0
class 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_CHAR
PI_SAME(PChar8, char);
#endif
PI_SAME(PInt8, signed char);
PI_SAME(PUInt8, unsigned char);
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_SAME(PInt16l, PInt16);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_DIFF(PInt16l, PInt16);
#endif
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_DIFF(PInt16b, PInt16);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_SAME(PInt16b, PInt16);
#endif
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_SAME(PUInt16l, WORD);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_DIFF(PUInt16l, WORD);
#endif
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_DIFF(PUInt16b, WORD);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_SAME(PUInt16b, WORD);
#endif
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_SAME(PInt32l, PInt32);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_DIFF(PInt32l, PInt32);
#endif
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_DIFF(PInt32b, PInt32);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_SAME(PInt32b, PInt32);
#endif
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_SAME(PUInt32l, DWORD);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_DIFF(PUInt32l, DWORD);
#endif
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_DIFF(PUInt32b, DWORD);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_SAME(PUInt32b, DWORD);
#endif
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_SAME(PInt64l, PInt64);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_DIFF(PInt64l, PInt64);
#endif
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_DIFF(PInt64b, PInt64);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_SAME(PInt64b, PInt64);
#endif
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_SAME(PUInt64l, PUInt64);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_DIFF(PUInt64l, PUInt64);
#endif
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_DIFF(PUInt64b, PUInt64);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_SAME(PUInt64b, PUInt64);
#endif
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_SAME(PFloat32l, float);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_DIFF(PFloat32l, float);
#endif
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_DIFF(PFloat32b, float);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_SAME(PFloat32b, float);
#endif
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_SAME(PFloat64l, double);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_DIFF(PFloat64l, double);
#endif
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_DIFF(PFloat64b, double);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_SAME(PFloat64b, double);
#endif
#ifndef NO_LONG_DOUBLE // stupid OSX compiler
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_SAME(PFloat80l, long double);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_DIFF(PFloat80l, long double);
#endif
#if PBYTE_ORDER==PLITTLE_ENDIAN
PI_DIFF(PFloat80b, long double);
#elif PBYTE_ORDER==PBIG_ENDIAN
PI_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 + -