1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 2000,2008 Oracle.  All rights reserved.
5 *
6 * $Id: SortedDoubleBinding.java,v 12.6 2008/02/07 17:12:25 mark Exp $
7 */
8
9package com.sleepycat.bind.tuple;
10
11import com.sleepycat.db.DatabaseEntry;
12
13/**
14 * A concrete <code>TupleBinding</code> for a <code>Double</code> primitive
15 * wrapper or a <code>double</code> primitive.
16 *
17 * <p>This class produces byte array values that by default (without a custom
18 * comparator) sort correctly, including sorting of negative values.
19 * Therefore, this class should normally be used instead of {@link
20 * DoubleBinding} which does not by default support sorting of negative values.
21 * Please note that:</p>
22 * <ul>
23 * <li>The byte array (stored) formats used by {@link DoubleBinding} and
24 * {@link SortedDoubleBinding} are different and incompatible.  They are not
25 * interchangeable once data has been stored.</li>
26 * <li>An instance of {@link DoubleBinding}, not {@link SortedDoubleBinding},
27 * is returned by {@link TupleBinding#getPrimitiveBinding} method.  Therefore,
28 * to use {@link SortedDoubleBinding}, {@link TupleBinding#getPrimitiveBinding}
29 * should not be called.</li>
30 * </ul>
31 *
32 * <p>There are two ways to use this class:</p>
33 * <ol>
34 * <li>When using the {@link com.sleepycat.db} package directly, the static
35 * methods in this class can be used to convert between primitive values and
36 * {@link DatabaseEntry} objects.</li>
37 * <li>When using the {@link com.sleepycat.collections} package, an instance of
38 * this class can be used with any stored collection.</li>
39 * </ol>
40 */
41public class SortedDoubleBinding extends TupleBinding {
42
43    /* javadoc is inherited */
44    public Object entryToObject(TupleInput input) {
45
46        return new Double(input.readSortedDouble());
47    }
48
49    /* javadoc is inherited */
50    public void objectToEntry(Object object, TupleOutput output) {
51
52        output.writeSortedDouble(((Number) object).doubleValue());
53    }
54
55    /* javadoc is inherited */
56    protected TupleOutput getTupleOutput(Object object) {
57
58        return DoubleBinding.sizedOutput();
59    }
60
61    /**
62     * Converts an entry buffer into a simple <code>double</code> value.
63     *
64     * @param entry is the source entry buffer.
65     *
66     * @return the resulting value.
67     */
68    public static double entryToDouble(DatabaseEntry entry) {
69
70        return entryToInput(entry).readSortedDouble();
71    }
72
73    /**
74     * Converts a simple <code>double</code> value into an entry buffer.
75     *
76     * @param val is the source value.
77     *
78     * @param entry is the destination entry buffer.
79     */
80    public static void doubleToEntry(double val, DatabaseEntry entry) {
81
82        outputToEntry(DoubleBinding.sizedOutput().writeSortedDouble(val),
83                      entry);
84    }
85}
86