/*
Компилятор языка программирования
Объектно-ориентированный продвинутый векторный транслятор
Copyright © 2021, 2024 Малик Разработчик
Это свободная программа: вы можете перераспространять ее и/или изменять
ее на условиях Стандартной общественной лицензии GNU в том виде,
в каком она была опубликована Фондом свободного программного обеспечения;
либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она будет полезной,
но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Стандартной
общественной лицензии GNU.
Вы должны были получить копию Стандартной общественной лицензии GNU
вместе с этой программой. Если это не так, см.
<https://www.gnu.org/licenses/>.
*/
package ru.malik.elaborarer.avtoo.lang;
public final class ConstantFactory(Object, AVTOOConstants)
{
private ClassType fldPackageType;
private ClassType fldStringType;
private ClassType fldClassType;
private Constant fldFalseValue;
private Constant fldTrueValue;
private Constant fldNullValue;
private final PrimitiveType[] fldPrimitives;
package () { fldPrimitives = new PrimitiveType[PRIMITIVES_LENGTH]; }
public Constant createNull() { return fldNullValue; }
public Constant createBoolean(boolean value) { return value ? fldTrueValue : fldFalseValue; }
public Constant createIntegral(int value) {
PrimitiveType type = fldPrimitives[value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE ? BYTE - VOID : value >= Short.MIN_VALUE && value <= Short.MAX_VALUE ? SHORT - VOID : INT - VOID];
return new Constant(type, (long8) value);
}
public Constant createChar(char value) { return new Constant(fldPrimitives[CHAR - VOID], value); }
public Constant createByte(byte value) { return new Constant(fldPrimitives[BYTE - VOID], (long8) value); }
public Constant createByte2(byte2 value) { return new Constant(fldPrimitives[BYTE2 - VOID], (long8) value); }
public Constant createByte4(byte4 value) { return new Constant(fldPrimitives[BYTE4 - VOID], (long8) value); }
public Constant createByte8(byte8 value) { return new Constant(fldPrimitives[BYTE8 - VOID], (long8) value); }
public Constant createShort(short value) { return new Constant(fldPrimitives[SHORT - VOID], (long8) value); }
public Constant createShort2(short2 value) { return new Constant(fldPrimitives[SHORT2 - VOID], (long8) value); }
public Constant createShort4(short4 value) { return new Constant(fldPrimitives[SHORT4 - VOID], (long8) value); }
public Constant createShort8(short8 value) { return new Constant(fldPrimitives[SHORT8 - VOID], (long8) value); }
public Constant createInt(int value) { return new Constant(fldPrimitives[INT - VOID], (long8) value); }
public Constant createInt2(int2 value) { return new Constant(fldPrimitives[INT2 - VOID], (long8) value); }
public Constant createInt4(int4 value) { return new Constant(fldPrimitives[INT4 - VOID], (long8) value); }
public Constant createInt8(int8 value) { return new Constant(fldPrimitives[INT8 - VOID], (long8) value); }
public Constant createLong(long value) { return new Constant(fldPrimitives[LONG - VOID], (long8) value); }
public Constant createLong2(long2 value) { return new Constant(fldPrimitives[LONG2 - VOID], (long8) value); }
public Constant createLong4(long4 value) { return new Constant(fldPrimitives[LONG4 - VOID], (long8) value); }
public Constant createLong8(long8 value) { return new Constant(fldPrimitives[LONG8 - VOID], value); }
public Constant createFloat(float value) { return new Constant(fldPrimitives[FLOAT - VOID], (double8) value); }
public Constant createFloat2(float2 value) { return new Constant(fldPrimitives[FLOAT2 - VOID], (double8) value); }
public Constant createFloat4(float4 value) { return new Constant(fldPrimitives[FLOAT4 - VOID], (double8) value); }
public Constant createFloat8(float8 value) { return new Constant(fldPrimitives[FLOAT8 - VOID], (double8) value); }
public Constant createDouble(double value) { return new Constant(fldPrimitives[DOUBLE - VOID], (double8) value); }
public Constant createDouble2(double2 value) { return new Constant(fldPrimitives[DOUBLE2 - VOID], (double8) value); }
public Constant createDouble4(double4 value) { return new Constant(fldPrimitives[DOUBLE4 - VOID], (double8) value); }
public Constant createDouble8(double8 value) { return new Constant(fldPrimitives[DOUBLE8 - VOID], value); }
public Constant createReal(real value) { return new Constant(fldPrimitives[REAL - VOID], value); }
public Constant createPackage(Package value) { return new Constant(fldPackageType, value); }
public Constant createString(String value) { return new Constant(fldStringType, value); }
public Constant createClass(Type value) { return new Constant(fldClassType, value); }
public Constant createFrom(Object source) {
if(source == null)
{
return createNull();
}
Class type = source.getClass();
if(Type.class.isAssignableFrom(type))
{
return createClass((Type) source);
}
if(String.class == type)
{
return createString((String) source);
}
if(Package.class.isAssignableFrom(type))
{
return createPackage((Package) source);
}
if(Boolean.class == type)
{
return createBoolean(((Boolean) source).booleanValue);
}
if(Numeric.class.isAssignableFrom(type))
{
Numeric numeric = (Numeric) source;
switch(numeric.kind)
{
case Class.CHAR: return createChar(numeric.asChar());
case Class.BYTE: return createByte(numeric.asByte());
case Class.BYTE2: return createByte2(numeric.asByte2());
case Class.BYTE4: return createByte4(numeric.asByte4());
case Class.BYTE8: return createByte8(numeric.asByte8());
case Class.SHORT: return createShort(numeric.asShort());
case Class.SHORT2: return createShort2(numeric.asShort2());
case Class.SHORT4: return createShort4(numeric.asShort4());
case Class.SHORT8: return createShort8(numeric.asShort8());
case Class.INT: return createInt(numeric.asInt());
case Class.INT2: return createInt2(numeric.asInt2());
case Class.INT4: return createInt4(numeric.asInt4());
case Class.INT8: return createInt8(numeric.asInt8());
case Class.LONG: return createLong(numeric.asLong());
case Class.LONG2: return createLong2(numeric.asLong2());
case Class.LONG4: return createLong4(numeric.asLong4());
case Class.LONG8: return createLong8(numeric.asLong8());
case Class.FLOAT: return createFloat(numeric.asFloat());
case Class.FLOAT2: return createFloat2(numeric.asFloat2());
case Class.FLOAT4: return createFloat4(numeric.asFloat4());
case Class.FLOAT8: return createFloat8(numeric.asFloat8());
case Class.DOUBLE: return createDouble(numeric.asDouble());
case Class.DOUBLE2: return createDouble2(numeric.asDouble2());
case Class.DOUBLE4: return createDouble4(numeric.asDouble4());
case Class.DOUBLE8: return createDouble8(numeric.asDouble8());
case Class.REAL: return createReal(numeric.asReal());
}
}
throw new IllegalArgumentException(String.format(avt.lang.package.getResourceString("illegal-argument.unsupported-type"), new Object[] { "source" }));
}
package void loadDataFrom(Programme source) {
NullType nullType = source.getNullType();
PrimitiveType booleanType = source.getPrimitiveType(BOOLEAN);
fldPackageType = source.getClassType(PACKNAME_LANG + "." + TYPENAME_PACKAGE);
fldStringType = source.getClassType(PACKNAME_LANG + "." + TYPENAME_STRING);
fldClassType = source.getClassType(PACKNAME_LANG + "." + TYPENAME_CLASS);
fldFalseValue = new Constant(booleanType, false);
fldTrueValue = new Constant(booleanType, true);
fldNullValue = new Constant(nullType, null);
for(PrimitiveType[] primitives = fldPrimitives, int kind = BOOLEAN; kind < VOID + PRIMITIVES_LENGTH; kind++) primitives[kind - VOID] = source.getPrimitiveType(kind);
}
}