Home | History | Annotate | Download | only in shared
      1 // Copyright 2016 Google Inc. All rights reserved.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //     http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 package com.google.archivepatcher.shared;
     16 
     17 /**
     18  * A range, annotated with metadata, that is represented as an offset and a length. Comparison is
     19  * performed based on the natural ordering of the offset field.
     20  * @param <T> the type of the metadata
     21  */
     22 public class TypedRange<T> implements Comparable<TypedRange<T>> {
     23   /**
     24    * The offset at which the range starts.
     25    */
     26   private final long offset;
     27 
     28   /**
     29    * The length of the range.
     30    */
     31   private final long length;
     32 
     33   /**
     34    * Optional metadata associated with this range.
     35    */
     36   private final T metadata;
     37 
     38   /**
     39    * Constructs a new range with the specified parameters.
     40    * @param offset the offset at which the range starts
     41    * @param length the length of the range
     42    * @param metadata optional metadata associated with this range
     43    */
     44   public TypedRange(long offset, long length, T metadata) {
     45     this.offset = offset;
     46     this.length = length;
     47     this.metadata = metadata;
     48   }
     49 
     50   @Override
     51   public String toString() {
     52     return "offset " + offset + ", length " + length + ", metadata " + metadata;
     53   }
     54 
     55   /**
     56    * Returns the offset at which the range starts.
     57    * @return as described
     58    */
     59   public long getOffset() {
     60     return offset;
     61   }
     62 
     63   /**
     64    * Returns the length of the range.
     65    * @return as described
     66    */
     67   public long getLength() {
     68     return length;
     69   }
     70 
     71   /**
     72    * Returns the metadata associated with the range, or null if no metadata has been set.
     73    * @return as described
     74    */
     75   public T getMetadata() {
     76     return metadata;
     77   }
     78 
     79   @Override
     80   public int hashCode() {
     81     final int prime = 31;
     82     int result = 1;
     83     result = prime * result + (int) (length ^ (length >>> 32));
     84     result = prime * result + ((metadata == null) ? 0 : metadata.hashCode());
     85     result = prime * result + (int) (offset ^ (offset >>> 32));
     86     return result;
     87   }
     88 
     89   @Override
     90   public boolean equals(Object obj) {
     91     if (this == obj) return true;
     92     if (obj == null) return false;
     93     if (getClass() != obj.getClass()) return false;
     94     TypedRange<?> other = (TypedRange<?>) obj;
     95     if (length != other.length) return false;
     96     if (metadata == null) {
     97       if (other.metadata != null) return false;
     98     } else if (!metadata.equals(other.metadata)) return false;
     99     if (offset != other.offset) return false;
    100     return true;
    101   }
    102 
    103   @Override
    104   public int compareTo(TypedRange<T> other) {
    105     if (getOffset() < other.getOffset()) {
    106       return -1;
    107     } else if (getOffset() > other.getOffset()) {
    108       return 1;
    109     }
    110     return 0;
    111   }
    112 }
    113