1/*
2 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
3 */
4/*
5 * Licensed to the Apache Software Foundation (ASF) under one or more
6 * contributor license agreements.  See the NOTICE file distributed with
7 * this work for additional information regarding copyright ownership.
8 * The ASF licenses this file to You under the Apache License, Version 2.0
9 * (the "License"); you may not use this file except in compliance with
10 * the License.  You may obtain a copy of the License at
11 *
12 *      http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 */
20
21package com.sun.org.apache.bcel.internal.classfile;
22
23import java.io.DataInput;
24import java.io.DataOutputStream;
25import java.io.IOException;
26
27import com.sun.org.apache.bcel.internal.Const;
28
29/**
30 * This class is derived from the abstract  {@link Constant}
31 * and represents a reference to a Double object.
32 *
33 * @version $Id: ConstantDouble.java 1747278 2016-06-07 17:28:43Z britter $
34 * @see     Constant
35 */
36public final class ConstantDouble extends Constant implements ConstantObject {
37
38    private double bytes;
39
40
41    /**
42     * @param bytes Data
43     */
44    public ConstantDouble(final double bytes) {
45        super(Const.CONSTANT_Double);
46        this.bytes = bytes;
47    }
48
49
50    /**
51     * Initialize from another object.
52     */
53    public ConstantDouble(final ConstantDouble c) {
54        this(c.getBytes());
55    }
56
57
58    /**
59     * Initialize instance from file data.
60     *
61     * @param file Input stream
62     * @throws IOException
63     */
64    ConstantDouble(final DataInput file) throws IOException {
65        this(file.readDouble());
66    }
67
68
69    /**
70     * Called by objects that are traversing the nodes of the tree implicitely
71     * defined by the contents of a Java class. I.e., the hierarchy of methods,
72     * fields, attributes, etc. spawns a tree of objects.
73     *
74     * @param v Visitor object
75     */
76    @Override
77    public void accept( final Visitor v ) {
78        v.visitConstantDouble(this);
79    }
80
81
82    /**
83     * Dump constant double to file stream in binary format.
84     *
85     * @param file Output file stream
86     * @throws IOException
87     */
88    @Override
89    public final void dump( final DataOutputStream file ) throws IOException {
90        file.writeByte(super.getTag());
91        file.writeDouble(bytes);
92    }
93
94
95    /**
96     * @return data, i.e., 8 bytes.
97     */
98    public final double getBytes() {
99        return bytes;
100    }
101
102
103    /**
104     * @param bytes the raw bytes that represent the double value
105     */
106    public final void setBytes( final double bytes ) {
107        this.bytes = bytes;
108    }
109
110
111    /**
112     * @return String representation.
113     */
114    @Override
115    public final String toString() {
116        return super.toString() + "(bytes = " + bytes + ")";
117    }
118
119
120    /** @return Double object
121     */
122    @Override
123    public Object getConstantValue( final ConstantPool cp ) {
124        return new Double(bytes);
125    }
126}
127