//
// Copyright (c) 2021, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
// 09 Aug 2021 Matthew Giannini Creation
//
**
** Models an ASN.1 'OBJECT IDENTIFIER' type.
**
final const class AsnOid : AsnObj
{
//////////////////////////////////////////////////////////////////////////
// Construction
//////////////////////////////////////////////////////////////////////////
protected new make(AsnTag[] tags, Int[] val) : super(tags, val)
{
if (univTag != AsnTag.univOid) throw ArgErr("Invalid tags for OID: $tags")
}
//////////////////////////////////////////////////////////////////////////
// Identity
//////////////////////////////////////////////////////////////////////////
** Convenience to get the value as a list of its 'Int' identifiers.
Int[] ids()
{
this.val
}
//////////////////////////////////////////////////////////////////////////
// Oid
//////////////////////////////////////////////////////////////////////////
** Convenience to get a Str where the sub-identifiers are joined with a '.'
**
** Asn.oid("1.2.3").oidStr == "1.2.3"
Str oidStr()
{
ids.join(".")
}
** Get a new Oid based on the specified range. This Oid
** is guaranteed to be in the universal tag class (i.e. - the
** tag is not preservered).
**
** Throw IndexErr if the range is illegal.
@Operator
AsnOid getRange(Range range)
{
Asn.oid(ids[range])
}
// override AsnOid push(AsnTag tag)
// {
// AsnOid([tag].addAll(this.tags), val)
// }
//////////////////////////////////////////////////////////////////////////
// Obj
//////////////////////////////////////////////////////////////////////////
** Oid is ordered by comparing its sub-identifier parts numerically.
override Int compare(Obj that)
{
thatOid := (AsnOid)that
if (this.ids == thatOid.ids) return 0
i := 0
cmp := this.ids[i] <=> thatOid.ids[i]
while (cmp == 0)
{
++i
if (i >= this.ids.size) return -1
else if (i >= thatOid.ids.size) return 1
cmp = this.ids[i] <=> thatOid.ids[i]
}
return cmp
}
override Str valStr() { oidStr }
}