ConstantFactory.avt

Переключить прокрутку окна
Загрузить этот исходный код

/*
    Компилятор языка программирования
    Объектно-ориентированный продвинутый векторный транслятор

    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);
    }
}