View Javadoc

1   /********************************************************************************
2    *
3    *	Copyright (C) 2008 Fujitsu Services Ltd.
4    *
5    *	Author: Nick Battle
6    *
7    *	This file is part of VDMJ.
8    *
9    *	VDMJ is free software: you can redistribute it and/or modify
10   *	it under the terms of the GNU General Public License as published by
11   *	the Free Software Foundation, either version 3 of the License, or
12   *	(at your option) any later version.
13   *
14   *	VDMJ is distributed in the hope that it will be useful,
15   *	but WITHOUT ANY WARRANTY; without even the implied warranty of
16   *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   *	GNU General Public License for more details.
18   *
19   *	You should have received a copy of the GNU General Public License
20   *	along with VDMJ.  If not, see <http://www.gnu.org/licenses/>.
21   *
22   ******************************************************************************/
23  
24  package org.overturetool.vdmj.values;
25  
26  import org.overturetool.vdmj.Settings;
27  import org.overturetool.vdmj.runtime.Context;
28  import org.overturetool.vdmj.runtime.ValueException;
29  import org.overturetool.vdmj.types.NamedType;
30  import org.overturetool.vdmj.types.Type;
31  
32  public class InvariantValue extends ReferenceValue
33  {
34  	private static final long serialVersionUID = 1L;
35  	public final NamedType type;
36  
37  	public InvariantValue(NamedType type, Value value, Context ctxt)
38  		throws ValueException
39  	{
40  		super(value);
41  		this.type = type;
42  
43  		FunctionValue invariant = type.getInvariant(ctxt);
44  
45  		if (invariant != null && Settings.invchecks &&
46  			!invariant.eval(invariant.location, value, ctxt).boolValue(ctxt))
47  		{
48  			abort(4060, "Type invariant violated for " + type.typename, ctxt);
49  		}
50  	}
51  
52  	// For clone only
53  	private InvariantValue(NamedType type, Value value)
54  	{
55  		super(value);
56  		this.type = type;
57  	}
58  
59  	@Override
60  	public Value convertValueTo(Type to, Context ctxt) throws ValueException
61  	{
62  		if (to.equals(type))
63  		{
64  			return this;
65  		}
66  		else
67  		{
68  			return value.convertValueTo(to, ctxt);
69  		}
70  	}
71  
72  	@Override
73  	public Value getUpdatable(ValueListener listener)
74  	{
75  		return new UpdatableValue(
76  			new InvariantValue(type, value.getUpdatable(listener)), listener);
77  	}
78  
79  	@Override
80  	public Object clone()
81  	{
82  		return new InvariantValue(type, value);
83  	}
84  }