⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asner.cxx

📁 pwlib源码库
💻 CXX
📖 第 1 页 / 共 5 页
字号:
{  PAssert(IsClass(PASN_Boolean::Class()), PInvalidCast);  return new PASN_Boolean(*this);}void PASN_Boolean::PrintOn(ostream & strm) const{  if (value)    strm << "TRUE";  else    strm << "FALSE";}PString PASN_Boolean::GetTypeAsString() const{  return "Boolean";}PINDEX PASN_Boolean::GetDataLength() const{  return 1;}BOOL PASN_Boolean::Decode(PASN_Stream & strm){  return strm.BooleanDecode(*this);}void PASN_Boolean::Encode(PASN_Stream & strm) const{  strm.BooleanEncode(*this);}///////////////////////////////////////////////////////////////////////PASN_Integer::PASN_Integer(unsigned val)  : PASN_ConstrainedObject(UniversalInteger, UniversalTagClass){  value = val;}PASN_Integer::PASN_Integer(unsigned tag, TagClass tagClass, unsigned val)  : PASN_ConstrainedObject(tag, tagClass){  value = val;}BOOL PASN_Integer::IsUnsigned() const{  return constraint != Unconstrained && lowerLimit >= 0;}PASN_Integer & PASN_Integer::operator=(unsigned val){  if (constraint == Unconstrained)    value = val;  else if (lowerLimit >= 0) { // Is unsigned integer    if (val < (unsigned)lowerLimit)      value = lowerLimit;    else if (val > upperLimit)      value = upperLimit;    else      value = val;  }  else {    int ival = (int)val;    if (ival < lowerLimit)      value = lowerLimit;    else if (upperLimit < INT_MAX && ival > (int)upperLimit)      value = upperLimit;    else      value = val;  }  return *this;}PObject::Comparison PASN_Integer::Compare(const PObject & obj) const{  PAssert(PIsDescendant(&obj, PASN_Integer), PInvalidCast);  const PASN_Integer & other = (const PASN_Integer &)obj;  if (IsUnsigned()) {    if (value < other.value)      return LessThan;    if (value > other.value)      return GreaterThan;  }  else {    if ((int)value < (int)other.value)      return LessThan;    if ((int)value > (int)other.value)      return GreaterThan;  }  return EqualTo;}PObject * PASN_Integer::Clone() const{  PAssert(IsClass(PASN_Integer::Class()), PInvalidCast);  return new PASN_Integer(*this);}void PASN_Integer::PrintOn(ostream & strm) const{  if (constraint == Unconstrained || lowerLimit < 0)    strm << (int)value;  else    strm << value;}void PASN_Integer::SetConstraintBounds(ConstraintType type, int lower, unsigned upper){  PASN_ConstrainedObject::SetConstraintBounds(type, lower, upper);  operator=(value);}PString PASN_Integer::GetTypeAsString() const{  return "Integer";}static PINDEX GetIntegerDataLength(int value){  // create a mask which is the top nine bits of a DWORD, or 0xFF800000  // on a big endian machine  int shift = (sizeof(value)-1)*8-1;  // remove all sequences of nine 0's or 1's at the start of the value  while (shift > 0 && ((value >> shift)&0x1ff) == (value < 0 ? 0x1ff : 0))    shift -= 8;  return (shift+9)/8;}PINDEX PASN_Integer::GetDataLength() const{  return GetIntegerDataLength(value);}BOOL PASN_Integer::Decode(PASN_Stream & strm){  return strm.IntegerDecode(*this);}void PASN_Integer::Encode(PASN_Stream & strm) const{  strm.IntegerEncode(*this);}///////////////////////////////////////////////////////////////////////PASN_Enumeration::PASN_Enumeration(unsigned val): PASN_Object(UniversalEnumeration, UniversalTagClass, FALSE),names(NULL),namesCount(0){  value = val;  maxEnumValue = P_MAX_INDEX;}PASN_Enumeration::PASN_Enumeration(unsigned tag, TagClass tagClass,                                   unsigned maxEnum, BOOL extend,                                   unsigned val)  : PASN_Object(tag, tagClass, extend),names(NULL),namesCount(0){  value = val;  maxEnumValue = maxEnum;}PASN_Enumeration::PASN_Enumeration(unsigned tag, TagClass tagClass,                                   unsigned maxEnum, BOOL extend,                                   const PASN_Names * nameSpec,                                   unsigned namesCnt,                                   unsigned val)  : PASN_Object(tag, tagClass, extend),  names(nameSpec),namesCount(namesCnt){  maxEnumValue = maxEnum;  PAssert(val <= maxEnum, PInvalidParameter);  value = val;}PObject::Comparison PASN_Enumeration::Compare(const PObject & obj) const{  PAssert(PIsDescendant(&obj, PASN_Enumeration), PInvalidCast);  const PASN_Enumeration & other = (const PASN_Enumeration &)obj;  if (value < other.value)    return LessThan;  if (value > other.value)    return GreaterThan;  return EqualTo;}PObject * PASN_Enumeration::Clone() const{  PAssert(IsClass(PASN_Enumeration::Class()), PInvalidCast);  return new PASN_Enumeration(*this);}void PASN_Enumeration::PrintOn(ostream & strm) const{  PINDEX idx = FindNameByValue(names, namesCount, value);  if (idx != P_MAX_INDEX)    strm << names[idx].name;  else    strm << '<' << value << '>';}PString PASN_Enumeration::GetTypeAsString() const{  return "Enumeration";}PINDEX PASN_Enumeration::GetDataLength() const{  return GetIntegerDataLength(value);}BOOL PASN_Enumeration::Decode(PASN_Stream & strm){  return strm.EnumerationDecode(*this);}void PASN_Enumeration::Encode(PASN_Stream & strm) const{  strm.EnumerationEncode(*this);}///////////////////////////////////////////////////////////////////////PASN_Real::PASN_Real(double val)  : PASN_Object(UniversalReal, UniversalTagClass){  value = val;}PASN_Real::PASN_Real(unsigned tag, TagClass tagClass, double val)  : PASN_Object(tag, tagClass){  value = val;}PObject::Comparison PASN_Real::Compare(const PObject & obj) const{  PAssert(PIsDescendant(&obj, PASN_Real), PInvalidCast);  const PASN_Real & other = (const PASN_Real &)obj;  if (value < other.value)    return LessThan;  if (value > other.value)    return GreaterThan;  return EqualTo;}PObject * PASN_Real::Clone() const{  PAssert(IsClass(PASN_Real::Class()), PInvalidCast);  return new PASN_Real(*this);}void PASN_Real::PrintOn(ostream & strm) const{  strm << value;}PString PASN_Real::GetTypeAsString() const{  return "Real";}PINDEX PASN_Real::GetDataLength() const{  PAssertAlways(PUnimplementedFunction);  return 0;}BOOL PASN_Real::Decode(PASN_Stream & strm){  return strm.RealDecode(*this);}void PASN_Real::Encode(PASN_Stream & strm) const{  strm.RealEncode(*this);}///////////////////////////////////////////////////////////////////////PASN_ObjectId::PASN_ObjectId(const char * dotstr)  : PASN_Object(UniversalObjectId, UniversalTagClass){  if (dotstr != NULL)    SetValue(dotstr);}PASN_ObjectId::PASN_ObjectId(unsigned tag, TagClass tagClass)  : PASN_Object(tag, tagClass){}PASN_ObjectId::PASN_ObjectId(const PASN_ObjectId & other)  : PASN_Object(other),    value(other.value, other.GetSize()){}PASN_ObjectId & PASN_ObjectId::operator=(const PASN_ObjectId & other){  PASN_Object::operator=(other);  value = PUnsignedArray(other.value, other.GetSize());  return *this;}PASN_ObjectId & PASN_ObjectId::operator=(const char * dotstr){  if (dotstr != NULL)    SetValue(dotstr);  else    value.SetSize(0);  return *this;}PASN_ObjectId & PASN_ObjectId::operator=(const PString & dotstr){  SetValue(dotstr);  return *this;}PASN_ObjectId & PASN_ObjectId::operator=(const PUnsignedArray & numbers){  SetValue(numbers);  return *this;}void PASN_ObjectId::SetValue(const PString & dotstr){  PStringArray parts = dotstr.Tokenise('.');  value.SetSize(parts.GetSize());  for (PINDEX i = 0; i < parts.GetSize(); i++)    value[i] = parts[i].AsUnsigned();}void PASN_ObjectId::SetValue(const unsigned * numbers, PINDEX size){  value = PUnsignedArray(numbers, size);}bool PASN_ObjectId::operator==(const char * dotstr) const{  PASN_ObjectId id;  id.SetValue(dotstr);  return *this == id;}PObject::Comparison PASN_ObjectId::Compare(const PObject & obj) const{  PAssert(PIsDescendant(&obj, PASN_ObjectId), PInvalidCast);  const PASN_ObjectId & other = (const PASN_ObjectId &)obj;  return value.Compare(other.value);}PObject * PASN_ObjectId::Clone() const{  PAssert(IsClass(PASN_ObjectId::Class()), PInvalidCast);  return new PASN_ObjectId(*this);}void PASN_ObjectId::PrintOn(ostream & strm) const{  for (PINDEX i = 0; i < value.GetSize(); i++) {    strm << (unsigned)value[i];    if (i < value.GetSize()-1)      strm << '.';  }}PString PASN_ObjectId::AsString() const{  PStringStream s;  PrintOn(s);  return s;}PString PASN_ObjectId::GetTypeAsString() const{  return "Object ID";}BOOL PASN_ObjectId::CommonDecode(PASN_Stream & strm, unsigned dataLen){  value.SetSize(0);  // handle zero length strings correctly  if (dataLen == 0)    return TRUE;  unsigned subId;  // start at the second identifier in the buffer, because we will later  // expand the first number into the first two IDs  PINDEX i = 1;  while (dataLen > 0) {    unsigned byte;    subId = 0;    do {    /* shift and add in low order 7 bits */      if (strm.IsAtEnd())        return FALSE;      byte = strm.ByteDecode();      subId = (subId << 7) + (byte & 0x7f);      dataLen--;    } while ((byte & 0x80) != 0);    value.SetAt(i++, subId);  }  /*   * The first two subidentifiers are encoded into the first component   * with the value (X * 40) + Y, where:   *  X is the value of the first subidentifier.   *  Y is the value of the second subidentifier.   */  subId = value[1];  if (subId < 40) {    value[0] = 0;    value[1] = subId;  }  else if (subId < 80) {    value[0] = 1;    value[1] = subId-40;  }  else {    value[0] = 2;    value[1] = subId-80;  }  return TRUE;}void PASN_ObjectId::CommonEncode(PBYTEArray & encodecObjectId) const{  PINDEX length = value.GetSize();  const unsigned * objId = value;  if (length < 2) {    // Thise case is really illegal, but we have to do SOMETHING    encodecObjectId.SetSize(0);    return;  }  unsigned subId = (objId[0] * 40) + objId[1];  objId += 2;  PINDEX outputPosition = 0;  while (--length > 0) {    if (subId < 128)      encodecObjectId[outputPosition++] = (BYTE)subId;    else {      unsigned mask = 0x7F; /* handle subid == 0 case */      int bits = 0;      /* testmask *MUST* !!!! be of an unsigned type */      unsigned testmask = 0x7F;      int      testbits = 0;      while (testmask != 0) {        if (subId & testmask) {  /* if any bits set */          mask = testmask;	        bits = testbits;	      }        testmask <<= 7;        testbits += 7;      }      /* mask can't be zero here */      while (mask != 0x7F) {        /* fix a mask that got truncated above */      	if (mask == 0x1E00000)	        mask = 0xFE00000;        encodecObjectId[outputPosition++] = (BYTE)(((subId & mask) >> bits) | 0x80);        mask >>= 7;        bits -= 7;      }      encodecObjectId[outputPosition++] = (BYTE)(subId & mask);    }    if (length > 1)      subId = *objId++;  }}PINDEX PASN_ObjectId::GetDataLength() const

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -