/*
Исходный код среды исполнения ПВТ-ОО.
Этот исходный код является частью проекта ПВТ-ОО.
Copyright © 2021 Малик Разработчик
Это свободная программа: вы можете перераспространять её и/или
изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
в каком она была опубликована Фондом свободного программного обеспечения;
либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она может быть полезна,
но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
общественной лицензии GNU.
Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
вместе с этой программой. Если это не так, см.
<http://www.gnu.org/licenses/>.
*/
package avt.lang;
public final class StackTraceElement(Object, Cloneable)
{
private final int fldLineNumber;
private final String fldSourceName;
private final String fldMethodName;
private final String fldTypeName;
private final Class fldTypeRef;
private final String fldRepresentation;
public (Class typeRef, String methodName, String sourceName, int lineNumber) {
if(typeRef == null) typeRef = Object.class;
if(methodName == null) methodName = "";
if(sourceName == null) sourceName = "";
if(lineNumber < 0) lineNumber = 0;
String typeName = typeRef.canonicalName;
StringBuilder representation = new StringBuilder() + typeName + '.' + methodName;
if(!sourceName.isEmpty())
{
representation + '(' + sourceName;
if(lineNumber > 0) representation + ':' + lineNumber;
representation + ')';
}
fldLineNumber = lineNumber;
fldSourceName = sourceName;
fldMethodName = methodName;
fldTypeName = typeName;
fldTypeRef = typeRef;
fldRepresentation = representation.toString();
}
public boolean equals(Object anot) { return anot == this || anot instanceof StackTraceElement && ((StackTraceElement) anot).fldRepresentation.equals(fldRepresentation); }
public long hashCodeAsLong() { return fldRepresentation.hashCodeAsLong(); }
public long2 hashCodeAsLong2() { return fldRepresentation.hashCodeAsLong2(); }
public long4 hashCodeAsLong4() { return new long4 { fldTypeName.hashCodeAsLong(), fldMethodName.hashCodeAsLong(), fldSourceName.hashCodeAsLong(), fldLineNumber }; }
public long8 hashCodeAsLong8() { return Long8.create(fldTypeName.hashCodeAsLong2(), fldMethodName.hashCodeAsLong2(), fldSourceName.hashCodeAsLong2(), fldLineNumber); }
public String toString() { return fldRepresentation; }
public StackTraceElement clone() { return new StackTraceElement(fldTypeRef, fldMethodName, fldSourceName, fldLineNumber); }
public int lineNumber { read = fldLineNumber }
public String sourceName { read = fldSourceName }
public String methodName { read = fldMethodName }
public Class typeRef { read = fldTypeRef }
}