JAL-1645 Version-Rel Version 2.9 Year-Rel 2015 Licensing glob
[jalview.git] / src / jalview / util / ShiftList.java
index 8885e2c..860a700 100644 (file)
-/*\r
- * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
- *\r
- * This program is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License\r
- * as published by the Free Software Foundation; either version 2\r
- * of the License, or (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
- */\r
-package jalview.util;\r
-\r
-import java.util.*;\r
-\r
-/**\r
- * ShiftList\r
- * Simple way of mapping a linear series to a new linear range with new points introduced.\r
- * Use at your own risk!\r
- * Now growing to be used for interval ranges (position, offset) storing deletions/insertions\r
- */\r
-public class ShiftList\r
-{\r
-  public Vector shifts;\r
-  public ShiftList()\r
-  {\r
-    shifts = new Vector();\r
-  }\r
-\r
-  /**\r
-   * addShift\r
-   * @param pos start position for shift (in original reference frame)\r
-   * @param shift length of shift\r
-   */\r
-  public void addShift(int pos, int shift)\r
-  {\r
-    int sidx = 0;\r
-    int[] rshift = null;\r
-    while (sidx < shifts.size() &&\r
-           (rshift = (int[]) shifts.elementAt(sidx))[0] < pos)\r
-    {\r
-      sidx++;\r
-    }\r
-    if (sidx == shifts.size())\r
-    {\r
-      shifts.insertElementAt(new int[]\r
-                             {pos, shift}, sidx);\r
-    }\r
-    else\r
-    {\r
-      rshift[1] += shift;\r
-    }\r
-  }\r
-\r
-  /**\r
-   * shift\r
-   *\r
-   * @param pos int\r
-   * @return int shifted position\r
-   */\r
-  public int shift(int pos)\r
-  {\r
-    if (shifts.size() == 0)\r
-    {\r
-      return pos;\r
-    }\r
-    int shifted = pos;\r
-    int sidx = 0;\r
-    int rshift[];\r
-    while (sidx < shifts.size()\r
-           &&\r
-           (rshift = ( (int[]) shifts.elementAt(sidx++)))[0] <= pos)\r
-    {\r
-      shifted += rshift[1];\r
-    }\r
-    return shifted;\r
-  }\r
-\r
-  /**\r
-   * clear all shifts\r
-   */\r
-  public void clear()\r
-  {\r
-    shifts.removeAllElements();\r
-  }\r
-\r
-  /**\r
-   * invert the shifts\r
-   * @return ShiftList with inverse shift operations\r
-   */\r
-  public ShiftList getInverse()\r
-  {\r
-    ShiftList inverse = new ShiftList();\r
-    if (shifts != null)\r
-    {\r
-      for (int i = 0, j = shifts.size(); i < j; i++)\r
-      {\r
-        int[] sh = (int[]) shifts.elementAt(i);\r
-        if (sh != null)\r
-        {\r
-          inverse.shifts.addElement(new int[]\r
-                                    {sh[0], -sh[1]});\r
-        }\r
-      }\r
-    }\r
-    return inverse;\r
-  }\r
-\r
-  /**\r
-   * parse a 1d map of position 1<i<n to L<pos[i]<N\r
-   * such as that returned from SequenceI.gapMap()\r
-   * @param gapMap\r
-   * @return shifts from map index to mapped position\r
-   */\r
-  public static ShiftList parseMap(int[] gapMap)\r
-  {\r
-    ShiftList shiftList = null;\r
-    if (gapMap != null && gapMap.length > 0)\r
-    {\r
-      shiftList = new ShiftList();\r
-      for (int i = 0, p = 0; i < gapMap.length; p++, i++)\r
-      {\r
-        if (p != gapMap[i])\r
-        {\r
-          shiftList.addShift(p, gapMap[i] - p);\r
-          p = gapMap[i];\r
-        }\r
-      }\r
-    }\r
-    return shiftList;\r
-  }\r
-}\r
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9)
+ * Copyright (C) 2015 The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview 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.
+ *  
+ * Jalview 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 Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * ShiftList Simple way of mapping a linear series to a new linear range with
+ * new points introduced. Use at your own risk! Now growing to be used for
+ * interval ranges (position, offset) storing deletions/insertions
+ */
+public class ShiftList
+{
+  private List<int[]> shifts;
+
+  public ShiftList()
+  {
+    shifts = new ArrayList<int[]>();
+  }
+
+  /**
+   * addShift
+   * 
+   * @param pos
+   *          start position for shift (in original reference frame)
+   * @param shift
+   *          length of shift
+   */
+  public void addShift(int pos, int shift)
+  {
+    synchronized (shifts)
+    {
+      int sidx = 0;
+      int[] rshift = null;
+      while (sidx < shifts.size() && (rshift = shifts.get(sidx))[0] < pos)
+      {
+        sidx++;
+      }
+      if (sidx == shifts.size())
+      {
+        shifts.add(sidx, new int[] { pos, shift });
+      }
+      else
+      {
+        rshift[1] += shift;
+      }
+    }
+  }
+
+  /**
+   * shift
+   * 
+   * @param pos
+   *          int
+   * @return int shifted position
+   */
+  public int shift(int pos)
+  {
+    if (shifts.size() == 0)
+    {
+      return pos;
+    }
+    int shifted = pos;
+    int sidx = 0;
+    int rshift[];
+    while (sidx < shifts.size()
+            && (rshift = (shifts.get(sidx++)))[0] <= pos)
+    {
+      shifted += rshift[1];
+    }
+    return shifted;
+  }
+
+  /**
+   * clear all shifts
+   */
+  public synchronized void clear()
+  {
+    shifts.clear();
+  }
+
+  /**
+   * invert the shifts
+   * 
+   * @return ShiftList with inverse shift operations
+   */
+  public ShiftList getInverse()
+  {
+    ShiftList inverse = new ShiftList();
+    synchronized (shifts)
+    {
+      if (shifts != null)
+      {
+        for (int[] sh : shifts)
+        {
+          if (sh != null)
+          {
+            inverse.shifts.add(new int[] { sh[0], -sh[1] });
+          }
+        }
+      }
+    }
+    return inverse;
+  }
+
+  /**
+   * parse a 1d map of position 1&lt;i&lt;n to L&lt;pos[i]&lt;N such as that
+   * returned from SequenceI.gapMap()
+   * 
+   * @param gapMap
+   * @return shifts from map index to mapped position
+   */
+  public static ShiftList parseMap(int[] gapMap)
+  {
+    ShiftList shiftList = null;
+    if (gapMap != null && gapMap.length > 0)
+    {
+      shiftList = new ShiftList();
+      for (int i = 0, p = 0; i < gapMap.length; p++, i++)
+      {
+        if (p != gapMap[i])
+        {
+          shiftList.addShift(p, gapMap[i] - p);
+          p = gapMap[i];
+        }
+      }
+    }
+    return shiftList;
+  }
+
+  public List<int[]> getShifts()
+  {
+    return shifts;
+  }
+}