📄 object.cxx
字号:
PUnSerialiser & PTextUnSerialiser::operator>>(char &)
{ return *this; }
PUnSerialiser & PTextUnSerialiser::operator>>(unsigned char &)
{ return *this; }
PUnSerialiser & PTextUnSerialiser::operator>>(signed char &)
{ return *this; }
PUnSerialiser & PTextUnSerialiser::operator>>(short &)
{ return *this; }
PUnSerialiser & PTextUnSerialiser::operator>>(unsigned short &)
{ return *this; }
PUnSerialiser & PTextUnSerialiser::operator>>(int &)
{ return *this; }
PUnSerialiser & PTextUnSerialiser::operator>>(unsigned int &)
{ return *this; }
PUnSerialiser & PTextUnSerialiser::operator>>(long &)
{ return *this; }
PUnSerialiser & PTextUnSerialiser::operator>>(unsigned long &)
{ return *this; }
PUnSerialiser & PTextUnSerialiser::operator>>(float &)
{ return *this; }
PUnSerialiser & PTextUnSerialiser::operator>>(double &)
{ return *this; }
PUnSerialiser & PTextUnSerialiser::operator>>(long double &)
{ return *this; }
PUnSerialiser & PTextUnSerialiser::operator>>(char *)
{ return *this; }
PUnSerialiser & PTextUnSerialiser::operator>>(unsigned char *)
{ return *this; }
PUnSerialiser & PTextUnSerialiser::operator>>(signed char *)
{ return *this; }
PUnSerialiser & PTextUnSerialiser::operator>>(PObject &)
{ return *this; }
PBinaryUnSerialiser::PBinaryUnSerialiser(istream & strm)
: PUnSerialiser(strm)
{
classesUsed = new PStringArray;
}
PBinaryUnSerialiser::~PBinaryUnSerialiser()
{
delete classesUsed;
}
PUnSerialiser & PBinaryUnSerialiser::operator>>(char &)
{ return *this; }
PUnSerialiser & PBinaryUnSerialiser::operator>>(unsigned char &)
{ return *this; }
PUnSerialiser & PBinaryUnSerialiser::operator>>(signed char &)
{ return *this; }
PUnSerialiser & PBinaryUnSerialiser::operator>>(short &)
{ return *this; }
PUnSerialiser & PBinaryUnSerialiser::operator>>(unsigned short &)
{ return *this; }
PUnSerialiser & PBinaryUnSerialiser::operator>>(int &)
{ return *this; }
PUnSerialiser & PBinaryUnSerialiser::operator>>(unsigned int &)
{ return *this; }
PUnSerialiser & PBinaryUnSerialiser::operator>>(long &)
{ return *this; }
PUnSerialiser & PBinaryUnSerialiser::operator>>(unsigned long &)
{ return *this; }
PUnSerialiser & PBinaryUnSerialiser::operator>>(float &)
{ return *this; }
PUnSerialiser & PBinaryUnSerialiser::operator>>(double &)
{ return *this; }
PUnSerialiser & PBinaryUnSerialiser::operator>>(long double &)
{ return *this; }
PUnSerialiser & PBinaryUnSerialiser::operator>>(char *)
{ return *this; }
PUnSerialiser & PBinaryUnSerialiser::operator>>(unsigned char *)
{ return *this; }
PUnSerialiser & PBinaryUnSerialiser::operator>>(signed char *)
{ return *this; }
PUnSerialiser & PBinaryUnSerialiser::operator>>(PObject &)
{ return *this; }
///////////////////////////////////////////////////////////////////////////////
// General reference counting support
PSmartPointer::PSmartPointer(const PSmartPointer & ptr)
{
object = ptr.object;
if (object != NULL)
++object->referenceCount;
}
PSmartPointer & PSmartPointer::operator=(const PSmartPointer & ptr)
{
if (object == ptr.object)
return *this;
if (object != NULL && --object->referenceCount == 0)
delete object;
object = ptr.object;
if (object != NULL)
++object->referenceCount;
return *this;
}
PSmartPointer::~PSmartPointer()
{
if (object != NULL && --object->referenceCount == 0)
delete object;
}
PObject::Comparison PSmartPointer::Compare(const PObject & obj) const
{
PAssert(obj.IsDescendant(PSmartPointer::Class()), PInvalidCast);
PSmartObject * other = ((const PSmartPointer &)obj).object;
if (object == other)
return EqualTo;
return object < other ? LessThan : GreaterThan;
}
///////////////////////////////////////////////////////////////////////////////
// Large integer support
#ifdef P_NEEDS_INT64
void PInt64__::Add(const PInt64__ & v)
{
unsigned long old = low;
high += v.high;
low += v.low;
if (low < old)
high++;
}
void PInt64__::Sub(const PInt64__ & v)
{
unsigned long old = low;
high -= v.high;
low -= v.low;
if (low > old)
high--;
}
void PInt64__::Mul(const PInt64__ & v)
{
DWORD p1 = (low&0xffff)*(v.low&0xffff);
DWORD p2 = (low >> 16)*(v.low >> 16);
DWORD p3 = (high&0xffff)*(v.high&0xffff);
DWORD p4 = (high >> 16)*(v.high >> 16);
low = p1 + (p2 << 16);
high = (p2 >> 16) + p3 + (p4 << 16);
}
void PInt64__::Div(const PInt64__ & v)
{
long double dividend = high;
dividend *= 4294967296.0;
dividend += low;
long double divisor = high;
divisor *= 4294967296.0;
divisor += low;
long double quotient = dividend/divisor;
low = quotient;
high = quotient/4294967296.0;
}
void PInt64__::Mod(const PInt64__ & v)
{
PInt64__ t = *this;
t.Div(v);
t.Mul(t);
Sub(t);
}
void PInt64__::ShiftLeft(int bits)
{
if (bits >= 32) {
high = low << (bits - 32);
low = 0;
}
else {
high <<= bits;
high |= low >> (32 - bits);
low <<= bits;
}
}
void PInt64__::ShiftRight(int bits)
{
if (bits >= 32) {
low = high >> (bits - 32);
high = 0;
}
else {
low >>= bits;
low |= high << (32 - bits);
high >>= bits;
}
}
BOOL PInt64::Lt(const PInt64 & v) const
{
if ((long)high < (long)v.high)
return TRUE;
if ((long)high > (long)v.high)
return FALSE;
if ((long)high < 0)
return (long)low > (long)v.low;
return (long)low < (long)v.low;
}
BOOL PInt64::Gt(const PInt64 & v) const
{
if ((long)high > (long)v.high)
return TRUE;
if ((long)high < (long)v.high)
return FALSE;
if ((long)high < 0)
return (long)low < (long)v.low;
return (long)low > (long)v.low;
}
BOOL PUInt64::Lt(const PUInt64 & v) const
{
if (high < v.high)
return TRUE;
if (high > v.high)
return FALSE;
return low < high;
}
BOOL PUInt64::Gt(const PUInt64 & v) const
{
if (high > v.high)
return TRUE;
if (high < v.high)
return FALSE;
return low > high;
}
static void Out64(ostream & stream, PUInt64 num)
{
char buf[25];
char * p = &buf[sizeof(buf)];
*--p = '\0';
switch (stream.flags()&ios::basefield) {
case ios::oct :
while (num != 0) {
*--p = (num&7) + '0';
num >>= 3;
}
break;
case ios::hex :
while (num != 0) {
*--p = (num&15) + '0';
if (*p > '9')
*p += 7;
num >>= 4;
}
break;
default :
while (num != 0) {
*--p = num%10 + '0';
num /= 10;
}
}
if (*p == '\0')
*--p = '0';
stream << p;
}
ostream & operator<<(ostream & stream, const PInt64 & v)
{
if (v >= 0)
Out64(stream, v);
else {
int w = stream.width();
stream.put('-');
if (w > 0)
stream.width(w-1);
Out64(stream, -v);
}
return stream;
}
ostream & operator<<(ostream & stream, const PUInt64 & v)
{
Out64(stream, v);
return stream;
}
static PUInt64 Inp64(istream & stream)
{
int base;
switch (stream.flags()&ios::basefield) {
case ios::oct :
base = 8;
break;
case ios::hex :
base = 16;
break;
default :
base = 10;
}
if (isspace(stream.peek()))
stream.get();
PInt64 num = 0;
while (isxdigit(stream.peek())) {
int c = stream.get() - '0';
if (c > 9)
c -= 7;
if (c > 9)
c -= 32;
num = num*base + c;
}
return num;
}
istream & operator>>(istream & stream, PInt64 & v)
{
if (isspace(stream.peek()))
stream.get();
switch (stream.peek()) {
case '-' :
stream.ignore();
v = -(PInt64)Inp64(stream);
break;
case '+' :
stream.ignore();
default :
v = (PInt64)Inp64(stream);
}
return stream;
}
istream & operator>>(istream & stream, PUInt64 & v)
{
v = Inp64(stream);
return stream;
}
#endif
#if defined(P_VXWORKS) // hack.. not properly implemented.
// VxWorks does not support long long streams
ostream& ostream::operator<<(long long n)
{
cout << "ostream& ostream::operator<<(long long n)" << endl;
return ostream::operator<<(static_cast<long>(n));
}
ostream& ostream::operator<<(unsigned long long n)
{
cout << "ostream& ostream::operator<<(unsigned long long n)" << endl;
return ostream::operator<<(static_cast<unsigned long>(n));
}
istream& istream::operator>>(long long&n)
{
cout << "istream& istream::operator>>(long long&n)" << endl;
long ln;
istream &i = istream::operator>>(ln);
n = ln;
return i;
}
istream& istream::operator>>(unsigned long long&n)
{
cout << "istream& istream::operator>>(unsigned long long&n)" << endl;
unsigned long ln;
istream &i = istream::operator>>(ln);
n = ln;
return i;
}
ostream &operator<<(ostream &o, long double n)
{
cout << "ostream &operator<<(ostream &o, long double n)" << endl;
return operator<<(o,static_cast<double>(n));
}
istream &operator>>(istream &i, long double n)
{
cout << "istream &operator>>(istream &i, long double n)" << endl;
return operator>>(i,static_cast<double>(n));
}
#endif //! VXWORKS..
// End Of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -