package com.laytonsmith.core.constructs; import com.laytonsmith.PureUtilities.Version; import com.laytonsmith.annotations.typeof; import com.laytonsmith.core.CHVersion; import com.laytonsmith.core.exceptions.CRE.CRECastException; import com.laytonsmith.core.exceptions.CRE.CREFormatException; import com.laytonsmith.core.natives.interfaces.Sizable; import java.util.ArrayList; import java.util.List; import java.util.Stack; /** * */ @typeof("mutable_primitive") public class CMutablePrimitive extends CArray implements Sizable { private Construct value = CNull.NULL; public CMutablePrimitive(Target t){ this(null, t); } public CMutablePrimitive(Construct value, Target t) { super(t, 0); set(value, t); } @Override public boolean isDynamic() { return true; } /** * Sets the value of the underlying primitive. Only primitives (and null) may * be stored. * @param value * @param t */ public void set(Construct value, Target t){ if(value instanceof CArray){ throw new CREFormatException("mutable_primitives can only store primitive values.", t); } this.value = value; } /** * Sets the value as if {@link #set(com.laytonsmith.core.constructs.Construct, com.laytonsmith.core.constructs.Target)} were called, * then returns a reference to this object. * @param value * @param t * @return */ public CMutablePrimitive setAndReturn(Construct value, Target t){ set(value, t); return this; } public Construct get(){ return value; } @Override public String val() { return value.val(); } @Override public String toString() { return value.toString(); } @Override public CMutablePrimitive clone() { return this; } @Override protected String getQuote() { return value.getQuote(); } @Override public long size() { if(value instanceof CString){ return ((CString)value).size(); } else { return 0; } } @Override public Construct get(Construct index, Target t) { return value; } @Override public boolean canBeAssociative() { return false; } @Override public List<Construct> asList() { return getArray(); } @Override public void clear() { value = CNull.NULL; } @Override public CArray createNew(Target t) { return new CMutablePrimitive(value, t); } @Override protected List<Construct> getArray() { List<Construct> array = new ArrayList<>(); array.add(value); return array; } @Override protected String getString(Stack<CArray> arrays, Target t) { return value.val(); } @Override public void push(Construct c, Integer i, Target t) { set(c, t); } @Override public void set(Construct index, Construct c, Target t) { throw new CRECastException("mutable_primitives cannot have values set in them", t); } @Override public String docs() { return "A mutible primitive is a special data type that allows you to store primitives by reference, instead of value."; } @Override public Version since() { return CHVersion.V3_3_1; } }