/******************************************************************************* * This file is part of logisim-evolution. * * logisim-evolution is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * logisim-evolution is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with logisim-evolution. If not, see <http://www.gnu.org/licenses/>. * * Original code by Carl Burch (http://www.cburch.com), 2011. * Subsequent modifications by : * + Haute École Spécialisée Bernoise * http://www.bfh.ch * + Haute École du paysage, d'ingénierie et d'architecture de Genève * http://hepia.hesge.ch/ * + Haute École d'Ingénierie et de Gestion du Canton de Vaud * http://www.heig-vd.ch/ * The project is currently maintained by : * + REDS Institute - HEIG-VD * Yverdon-les-Bains, Switzerland * http://reds.heig-vd.ch *******************************************************************************/ package com.cburch.logisim; public class LogisimVersion { /** * Create a new version object for the current Logisim instance (the * constructor is private) where the revision number is set to its default * value and no variant is used */ public static LogisimVersion get(int major, int minor, int release) { return (get(major, minor, release, FINAL_REVISION, "")); } /** * Create a new version object for the current Logisim instance (the * constructor is private) where no variant is used */ public static LogisimVersion get(int major, int minor, int release, int revision) { return (get(major, minor, release, revision, "")); } /** * Create a new version object for the current Logisim instance (the * constructor is private) */ public static LogisimVersion get(int major, int minor, int release, int revision, String variant) { return (new LogisimVersion(major, minor, release, revision, variant)); } /** * Create a new version object for the current Logisim instance (the * constructor is private) where the revision field is set to its default * value */ public static LogisimVersion get(int major, int minor, int release, String variant) { return (get(major, minor, release, FINAL_REVISION, variant)); } /** * Parse a string containing a version number and returns the corresponding * LogisimVersion object. No exception is thrown if the version string * contains non-integers, because literal values are allowed. * * @return LogisimVersion built from the string passed as parameter */ public static LogisimVersion parse(String versionString) { String[] parts = versionString.split("\\."); int major = 0; int minor = 0; int release = 0; int revision = FINAL_REVISION; String variant = ""; if (versionString.isEmpty()) { // Return the default values for an empty version string return (new LogisimVersion(major, minor, release, revision, variant)); } try { if (parts.length >= 1) major = Integer.parseInt(parts[0]); if (parts.length >= 2) minor = Integer.parseInt(parts[1]); if (parts.length >= 3) release = Integer.parseInt(parts[2]); if (parts.length >= 4) revision = Integer.parseInt(parts[3]); if (parts.length >= 5) variant = parts[4]; } catch (NumberFormatException e) { } return (new LogisimVersion(major, minor, release, revision, variant)); } public static final int FINAL_REVISION = Integer.MAX_VALUE / 4; private int major; private int minor; private int release; private int revision; private String variant; private String repr; private LogisimVersion(int major, int minor, int release, int revision, String variant) { this.major = major; this.minor = minor; this.release = release; this.revision = revision; this.variant = variant; this.repr = null; } /** * Compare two Logisim version, returning whether the one passed as * parameter is newer than the current one or not * * @return Negative value if the current version is older than the one * passed as parameter */ public int compareTo(LogisimVersion other) { int ret = this.major - other.major; if (ret != 0) { return ret; } else { ret = this.minor - other.minor; if (ret != 0) { return (ret); } else { ret = this.release - other.release; if (ret != 0) { return (ret); } else { ret = this.revision - other.revision; if (ret != 0) { return (ret); } else { return (this.variant.compareTo(other.variant)); } } } } } /** * Compares two Logisim version numbers. */ @Override public boolean equals(Object other) { if (other instanceof LogisimVersion) { LogisimVersion o = (LogisimVersion) other; return (this.major == o.major && this.minor == o.minor && this.release == o.release && this.revision == o.revision && this.variant == o.variant); } else { return (false); } } /** * Build the hash code starting from the version number */ @Override public int hashCode() { int ret = major * 31 + minor; ret = ret * 31 + release; ret = ret * 31 + revision; return (ret); } /** * If the considered Logisim version includes a tracker, returns true. * Assumption: the tracker is identified by a variant equals to "t" */ public boolean hasTracker() { return (variant.equals("t")); } public String mainVersion() { return (major + "." + minor + "." + release); } public String rev() { if (revision != FINAL_REVISION) { return ("rev. " + revision); } else { return (""); } } @Override public String toString() { String ret = repr; if (ret == null) { ret = major + "." + minor + "." + release; if (revision != FINAL_REVISION) ret += "." + revision; if (variant != "") ret += "." + variant; repr = ret; } return (ret); } }