001/*
002 * $Id$
003 */
004
005package edu.jas.commons.math;
006
007
008import org.apache.commons.math3.Field;
009
010import edu.jas.structure.ElemFactory;
011import edu.jas.structure.Element;
012import edu.jas.structure.RingElem;
013import edu.jas.structure.RingFactory;
014
015
016/**
017 * Class that wraps a JAS <code>RingFactory</code> in a commons-math
018 * <code>Field</code>.
019 * @author Heinz Kredel
020 * @param <C> JAS ring element type
021 */
022public class CMField<C extends RingElem<C>> implements Field<CMFieldElement<C>> {
023
024
025    public final RingFactory<C> fac;
026
027
028    /**
029     * @param f
030     */
031    public CMField(ElemFactory<C> f) {
032        this((RingFactory<C>) f);
033    }
034
035
036    /**
037     * @param f
038     */
039    public CMField(RingFactory<C> f) {
040        fac = f;
041    }
042
043
044    /**
045     * get runtime class
046     */
047    @SuppressWarnings({"unchecked","cast"})
048    @Override
049    public Class<CMFieldElement<C>> getRuntimeClass() {
050        return (Class<CMFieldElement<C>>) (Class) CMFieldElement.class; //getClass();
051    }
052
053
054    /**
055     * @see java.lang.Object#equals(java.lang.Object)
056     */
057    @SuppressWarnings("unchecked")
058    @Override
059    public boolean equals(Object obj) {
060        // System.out.println("factory equals, this = " + this + ", obj = " + obj);
061        if (!(obj instanceof Field)) {
062            return false;
063        }
064        Field other = (Field) obj;
065        CMField<C> fother = (CMField<C>) other;
066        RingFactory<C> ofac = fother.fac;
067        // System.out.println("factory equals, this = " + fac.getClass() +
068        // ", obj = " + ofac.getClass());
069        if (!fac.getClass().getName().equals(ofac.getClass().getName())) {
070            return false;
071        }
072        RingFactory<C> ofac1 = null;
073        try {
074            ofac1 = (RingFactory<C>) ((RingElem<C>) ofac).factory();
075        } catch (ClassCastException e) {
076        }
077        if ( /* fac */ofac.equals(ofac1)) { // case BigInteger etc
078            return true;
079        }
080        // System.out.println("factory equals, this = " + ofac + ", obj = " +
081        // ofac1);
082        // if (fac.characteristic().equals(ffac.characteristic())) {
083        // return true;
084        // }
085        return fac.equals(ofac);
086    }
087
088
089    public CMFieldElement<C> get(int i) {
090        return new CMFieldElement<C>(fac.fromInteger(i));
091    }
092
093
094    public CMFieldElement<C> get(long i) {
095        return new CMFieldElement<C>(fac.fromInteger(i));
096    }
097
098
099    public CMFieldElement<C> get(Object o) {
100        if (o == null) {
101            return null;
102        }
103        String s = o.toString();
104        return new CMFieldElement<C>(fac.parse(s));
105    }
106
107
108    @SuppressWarnings("unchecked")
109    public CMFieldElement<C>[] getArray(int size) {
110        CMFieldElement<C>[] arr = new CMFieldElement[size];
111        for (int i = 0; i < arr.length; i++) {
112            arr[i] = getZero();
113        }
114        return arr;
115    }
116
117
118    @SuppressWarnings("unchecked")
119    public CMFieldElement<C>[][] getArray(int rows, int columns) {
120        CMFieldElement<C>[][] arr = new CMFieldElement[rows][columns];
121        for (int i = 0; i < arr.length; i++) {
122            arr[i] = getArray(columns);
123        }
124        return arr;
125    }
126
127
128    @Override
129    public CMFieldElement<C> getOne() {
130        return new CMFieldElement<C>(fac.getONE());
131    }
132
133
134    @Override
135    public CMFieldElement<C> getZero() {
136        return new CMFieldElement<C>(fac.getZERO());
137    }
138
139
140    /**
141     * @see java.lang.Object#hashCode()
142     */
143    @SuppressWarnings("unchecked")
144    @Override
145    public int hashCode() {
146        RingFactory<C> fac1 = null;
147        try {
148            fac1 = (RingFactory<C>) ((RingElem<C>) fac).factory();
149        } catch (ClassCastException e) {
150        }
151        if (fac.equals(fac1)) { // case BigInteger etc
152            // int h = fac.getClass().getSimpleName().hashCode();
153            // h = h * 37 + fac.characteristic().hashCode();
154            return fac.getClass().getName().hashCode();
155        }
156        return fac.hashCode();
157    }
158
159
160    /**
161     * Get the string representation.
162     * 
163     * @see java.lang.Object#toString()
164     */
165    @SuppressWarnings("unchecked")
166    @Override
167    public String toString() {
168        StringBuffer s = new StringBuffer();
169        String f = null;
170        try {
171            f = ((Element<C>) fac).toScriptFactory();
172        } catch (Exception ignored) {
173            f = fac.toScript();
174        }
175        if (f != null) {
176            s.append(f);
177        }
178        return s.toString();
179    }
180
181}