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.runtime.Context;
27 import org.overturetool.vdmj.runtime.ValueException;
28 import org.overturetool.vdmj.types.TokenType;
29 import org.overturetool.vdmj.types.Type;
30
31 public class TokenValue extends Value
32 {
33 private static final long serialVersionUID = 1L;
34 private final Value value;
35 private final int hash;
36
37 public TokenValue(Value exp)
38 {
39 this.value = exp;
40 this.hash = exp.hashCode();
41 }
42
43 @Override
44 public String toString()
45 {
46 return "mk_token(" + value + ")";
47 }
48
49 @Override
50 public boolean equals(Object other)
51 {
52 if (other instanceof Value)
53 {
54 Value val = ((Value)other).deref();
55
56 if (val instanceof TokenValue)
57 {
58 TokenValue tok = (TokenValue)val;
59 return tok.hash == hash;
60 }
61 }
62
63 return false;
64 }
65
66 @Override
67 public int hashCode()
68 {
69 return hash;
70 }
71
72 @Override
73 public String kind()
74 {
75 return toString();
76 }
77
78 @Override
79 public Value convertValueTo(Type to, Context ctxt) throws ValueException
80 {
81 if (to.isType(TokenType.class))
82 {
83 return this;
84 }
85 else
86 {
87 return super.convertValueTo(to, ctxt);
88 }
89 }
90
91 @Override
92 public Object clone()
93 {
94 return new TokenValue(value);
95 }
96 }