📄 asner.cxx
字号:
return 0;
}
BOOL PASN_Null::Decode(PASN_Stream & strm)
{
return strm.NullDecode(*this);
}
void PASN_Null::Encode(PASN_Stream & strm) const
{
strm.NullEncode(*this);
}
///////////////////////////////////////////////////////////////////////
PASN_Boolean::PASN_Boolean(BOOL val)
: PASN_Object(UniversalBoolean, UniversalTagClass)
{
value = val;
}
PASN_Boolean::PASN_Boolean(unsigned tag, TagClass tagClass, BOOL val)
: PASN_Object(tag, tagClass)
{
value = val;
}
PObject::Comparison PASN_Boolean::Compare(const PObject & obj) const
{
PAssert(PIsDescendant(&obj, PASN_Boolean), PInvalidCast);
return value == ((const PASN_Boolean &)obj).value ? EqualTo : GreaterThan;
}
PObject * PASN_Boolean::Clone() const
{
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);
}
PINDEX PASN_Enumeration::GetValueByName(PString name) const
{
for(unsigned uiIndex = 0; uiIndex < namesCount; uiIndex++){
if(strcmp(names[uiIndex].name, name) == 0){
return (maxEnumValue - namesCount + uiIndex + 1);
}
}
return UINT_MAX;
}
///////////////////////////////////////////////////////////////////////
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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -