001    /*--------------------------------------------------------------------------+
002    $Id: Region.java 26268 2010-02-18 10:44:30Z juergens $
003    |                                                                          |
004    | Copyright 2005-2010 Technische Universitaet Muenchen                     |
005    |                                                                          |
006    | Licensed under the Apache License, Version 2.0 (the "License");          |
007    | you may not use this file except in compliance with the License.         |
008    | You may obtain a copy of the License at                                  |
009    |                                                                          |
010    |    http://www.apache.org/licenses/LICENSE-2.0                            |
011    |                                                                          |
012    | Unless required by applicable law or agreed to in writing, software      |
013    | distributed under the License is distributed on an "AS IS" BASIS,        |
014    | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
015    | See the License for the specific language governing permissions and      |
016    | limitations under the License.                                           |
017    +--------------------------------------------------------------------------*/
018    package edu.tum.cs.commons.region;
019    
020    /**
021     * Regions represent intervals. Both the start and the end position are
022     * considered to be part of the region. Regions can i.e. be used to represent
023     * fragments of files.
024     * <p>
025     * This class is immutable.
026     * 
027     * @author Elmar Juergens
028     * @author $Author: juergens $
029     * 
030     * @version $Revision: 26268 $
031     * @levd.rating GREEN Hash: 7B5A6EE152CFF787B1C23A03B25BD6AE
032     */
033    public final class Region implements Comparable<Region> {
034    
035            /** Name that is used if region is created without name */
036            public static final String UNKNOWN_ORIGIN = "Unkwnon origin";
037    
038            /**
039             * Origin of the region. Can be used to store information about who created
040             * the region.
041             */
042            private final String origin;
043    
044            /** Region start position */
045            private final int start;
046    
047            /** Region end position. */
048            private final int end;
049    
050            /**
051             * Creates a region with an origin
052             * 
053             * @param start
054             *            Start position of the region
055             * @param end
056             *            End position of the region
057             * @param origin
058             *            Region origin. (i.e. region producer)
059             */
060            public Region(int start, int end, String origin) {
061                    this.start = start;
062                    this.end = end;
063                    this.origin = origin;
064            }
065    
066            /**
067             * Creates a region with an unknown origin
068             * 
069             * @param start
070             *            Start position of the region
071             * @param end
072             *            End position of the region
073             */
074            public Region(int start, int end) {
075                    this(start, end, UNKNOWN_ORIGIN);
076            }
077    
078            /** Checks if the region contains a position */
079            public boolean containsPosition(int position) {
080                    return (start <= position && end >= position);
081            }
082    
083            /** Checks if two regions are overlapping */
084            public boolean overlaps(Region r) {
085                    // Region with smaller start value performs overlap check
086                    if (r.start < start) {
087                            return r.overlaps(this);
088                    }
089    
090                    return (start <= r.start && end >= r.start);
091            }
092    
093            /** Checks if two regions are adjacent */
094            public boolean adjacent(Region r) {
095                    // Region with smaller start value performs adjacency check
096                    if (r.start < start) {
097                            return r.adjacent(this);
098                    }
099    
100                    return (end + 1 == r.start);
101            }
102    
103            /** Get origin. */
104            public String getOrigin() {
105                    return origin;
106            }
107    
108            /** Gets the end position of the region */
109            public int getEnd() {
110                    return end;
111            }
112    
113            /** Gets the start position of the region */
114            public int getStart() {
115                    return start;
116            }
117    
118            /** Gets the length of the region */
119            public int getLength() {
120                    return end - start + 1;
121            }
122    
123            /** {@inheritDoc} */
124            @Override
125            public String toString() {
126                    return "[" + start + "-" + end + "]";
127            }
128    
129            /** Compares regions by their start position */
130            public int compareTo(Region compareTo) {
131                    return new Integer(start).compareTo(new Integer(compareTo.start));
132            }
133    
134    }