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