001    /***
002     * ASM: a very small and fast Java bytecode manipulation framework
003     * Copyright (c) 2000-2005 INRIA, France Telecom
004     * All rights reserved.
005     *
006     * Redistribution and use in source and binary forms, with or without
007     * modification, are permitted provided that the following conditions
008     * are met:
009     * 1. Redistributions of source code must retain the above copyright
010     *    notice, this list of conditions and the following disclaimer.
011     * 2. Redistributions in binary form must reproduce the above copyright
012     *    notice, this list of conditions and the following disclaimer in the
013     *    documentation and/or other materials provided with the distribution.
014     * 3. Neither the name of the copyright holders nor the names of its
015     *    contributors may be used to endorse or promote products derived from
016     *    this software without specific prior written permission.
017     *
018     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021     * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
022     * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
023     * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
024     * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
025     * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
026     * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
027     * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
028     * THE POSSIBILITY OF SUCH DAMAGE.
029     */
030    package net.sourceforge.retroweaver.optimizer;
031    
032    import java.io.Serializable;
033    import java.util.Comparator;
034    
035    public class ConstantComparator implements Comparator<Constant>, Serializable {
036    
037            public int compare(final Constant c1, final Constant c2) {
038                int d = getSort(c1) - getSort(c2);
039                if (d == 0) {
040                    switch (c1.type) {
041                        case 'I':
042                            return new Integer(c1.intVal).compareTo(new Integer(c2.intVal)); // NOPMD by xlv
043                        case 'J':
044                            return new Long(c1.longVal).compareTo(new Long(c2.longVal));
045                        case 'F':
046                            return new Float(c1.floatVal).compareTo(new Float(c2.floatVal));
047                        case 'D':
048                            return new Double(c1.doubleVal).compareTo(new Double(c2.doubleVal));
049                        case 's':
050                        case 'S':
051                        case 'C':
052                            return c1.strVal1.compareTo(c2.strVal1);
053                        case 'T':
054                            d = c1.strVal1.compareTo(c2.strVal1);
055                            if (d == 0) {
056                                d = c1.strVal2.compareTo(c2.strVal2);
057                            }
058                            break;
059                        default:
060                            d = c1.strVal1.compareTo(c2.strVal1);
061                            if (d == 0) {
062                                d = c1.strVal2.compareTo(c2.strVal2);
063                                if (d == 0) {
064                                    d = c1.strVal3.compareTo(c2.strVal3);
065                                }
066                            }
067                    }
068                }
069                return d;
070            }
071    
072            private int getSort(Constant c) {
073                switch (c.type) {
074                    case 'I':
075                        return 0;
076                    case 'J':
077                        return 1;
078                    case 'F':
079                        return 2;
080                    case 'D':
081                        return 3;
082                    case 's':
083                        return 4;
084                    case 'S':
085                        return 5;
086                    case 'C':
087                        return 6;
088                    case 'T':
089                        return 7;
090                    case 'G':
091                        return 8;
092                    case 'M':
093                        return 9;
094                    default:
095                        return 10;
096                }
097            }
098        }
099