]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/utils/TextSegment.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / utils / TextSegment.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.g2d.utils;\r
13 \r
14 import java.io.Serializable;\r
15 \r
16 /**\r
17  * @author Tuukka Lehtonen\r
18  */\r
19 public class TextSegment implements Serializable {\r
20 \r
21     private static final long                 serialVersionUID = 1428883453597424952L;\r
22 \r
23     public static transient final TextSegment EMPTY            = new TextSegment(0, 0);\r
24 \r
25     private final int start;\r
26     private final int length;\r
27 \r
28     public static TextSegment whole(String s) {\r
29         return new TextSegment(0, s.length());\r
30     }\r
31 \r
32     public static TextSegment single(int pos) {\r
33         return new TextSegment(pos, 1);\r
34     }\r
35 \r
36     public static TextSegment before(int pos) {\r
37         return new TextSegment(0, pos);\r
38     }\r
39 \r
40     public TextSegment(int start, int length) {\r
41         this.start = start;\r
42         this.length = length;\r
43     }\r
44 \r
45     public int start() {\r
46         return start;\r
47     }\r
48 \r
49     public int end() {\r
50         return start + length;\r
51     }\r
52 \r
53     public int length() {\r
54         return length;\r
55     }\r
56 \r
57     public boolean isEmpty() {\r
58         return length == 0;\r
59     }\r
60 \r
61     public boolean isWhole(String s) {\r
62         if (s == null)\r
63             return false;\r
64         return start == 0 && length == s.length();\r
65     }\r
66 \r
67     public boolean atStart(int pos) {\r
68         return start == pos;\r
69     }\r
70 \r
71     public boolean atEnd(int pos) {\r
72         return end() == pos;\r
73     }\r
74 \r
75     public boolean existsIn(String s) {\r
76         int l = s != null ? s.length() : 0;\r
77         if (start > l)\r
78             return false;\r
79         int end = start + length;\r
80         if (end > l)\r
81             return false;\r
82         return true;\r
83     }\r
84 \r
85     public String removeFrom(String s) {\r
86         if (!existsIn(s))\r
87             throw new IllegalArgumentException("segment " + this + " is out of bounds in string '" + s + "'");\r
88         if (length == 0)\r
89             return s;\r
90         if (start == 0)\r
91             return s.substring(length);\r
92         return s.substring(0, start) + s.substring(start + length);\r
93     }\r
94 \r
95     public String before(String s) {\r
96         if (start == 0)\r
97             return "";\r
98         return s.substring(0, start);\r
99     }\r
100 \r
101     public String after(String s) {\r
102         if (end() == s.length())\r
103             return "";\r
104         return s.substring(start, start + length);\r
105     }\r
106 \r
107     public String of(String s) {\r
108         return s.substring(start, start + length);\r
109     }\r
110 \r
111     public TextSegment beforeStart() {\r
112         if (start == 0)\r
113             return EMPTY;\r
114         return new TextSegment(0, start);\r
115     }\r
116 \r
117     public TextSegment afterEnd(String s) {\r
118         int l = s.length();\r
119         int end = end();\r
120         if (end > l)\r
121             throw new IllegalArgumentException("end " + end + " is beyond string '" + s + "'");\r
122         if (end == l)\r
123             return EMPTY;\r
124         return new TextSegment(end, l - end);\r
125     }\r
126 \r
127     public TextSegment prepend(int count) {\r
128         if (count == 0)\r
129             return this;\r
130         int newStart = start - count;\r
131         if (newStart < 0)\r
132             throw new IllegalArgumentException("prepending " + this + " by " + count + " procudes invalid segment start " + newStart);\r
133         int newLength = length + count;\r
134         if (newLength < 0)\r
135             throw new IllegalArgumentException("prepending " + this + " by " + count + " produces negative length: " + newLength);\r
136         return new TextSegment(start - count, newLength);\r
137     }\r
138 \r
139     public TextSegment append(int count) {\r
140         if (count == 0)\r
141             return this;\r
142         int newLength = length + count;\r
143         if (newLength < 0)\r
144             throw new IllegalArgumentException("appending by " + count + " produces negative length: " + newLength);\r
145         return new TextSegment(start, newLength);\r
146     }\r
147 \r
148     public TextSegment extendToEnd(String s) {\r
149         int l = s.length();\r
150         int end = end();\r
151         if (end > l)\r
152             throw new IllegalArgumentException("end " + end + " is beyond string '" + s + "'");\r
153         if (end == l)\r
154             return this;\r
155         return new TextSegment(start, l - start);\r
156     }\r
157 \r
158     @Override\r
159     public int hashCode() {\r
160         final int prime = 31;\r
161         int result = 1;\r
162         result = prime * result + length;\r
163         result = prime * result + start;\r
164         return result;\r
165     }\r
166 \r
167     @Override\r
168     public boolean equals(Object obj) {\r
169         if (this == obj)\r
170             return true;\r
171         if (obj == null)\r
172             return false;\r
173         if (getClass() != obj.getClass())\r
174             return false;\r
175         TextSegment other = (TextSegment) obj;\r
176         if (length != other.length)\r
177             return false;\r
178         if (start != other.start)\r
179             return false;\r
180         return true;\r
181     }\r
182 \r
183     @Override\r
184     public String toString() {\r
185         return "[" + start + "," + (start + length) + "]"; \r
186     }\r
187 \r
188 }\r