View Javadoc

1   package org.jscsi.target.util;
2   
3   /**
4    * A class for serial number arithmetics, as defined in <code>[RFC 1982]</code>, with <code>SERIAL_BITS = 32</code>.
5    * <p>
6    * Unlike the original algorithm, this implementation is based on unsigned subtraction, resolving the issue of undefined
7    * comparisons, however introducing one additional oddity - each member of a pair of serial numbers with a wrapped
8    * distance of <code>2^(SERIAL_BITS - 1)</code> will be considered less than (and greater than) the other one.
9    * 
10   * @author Andreas Ergenzinger
11   */
12  public final class SerialArithmeticNumber {
13  
14      /**
15       * The signed integer representation of the serial arithmetic number.
16       */
17      private int value;
18  
19      /**
20       * Creates a new {@link SerialArithmeticNumber} with a starting {@link #value} of zero.
21       */
22      public SerialArithmeticNumber () {
23          this(0);
24      }
25  
26      /**
27       * Creates a new {@link SerialArithmeticNumber} with the specified starting {@link #value}.
28       * 
29       * @param value the initial {@link #value}
30       */
31      public SerialArithmeticNumber (final int value) {
32          this.value = value;
33      }
34  
35      /**
36       * Increments the {@link SerialArithmeticNumber}'s {@link #value} by one.
37       */
38      public void increment () {
39          ++value;
40      }
41  
42      /**
43       * Returns <code>true</code> if the parameter matches the {@link #value} and <code>false</code> if it does not.
44       * 
45       * @param serialArithmeticNumber the serial arithmetic number to match
46       * @return <code>true</code> if the parameter matches the {@link #value} and <code>false</code> if it does not
47       */
48      public boolean equals (final int serialArithmeticNumber) {
49          return value == serialArithmeticNumber;
50      }
51  
52      /**
53       * Returns <code>true</code> if the parameter is less than the {@link #value} in serial number arithmetics and
54       * <code>false</code> if it is not.
55       * 
56       * @param serialArithmeticNumber the serial arithmetic number to match
57       * @return <code>true</code> if the parameter is less than the {@link #value} in serial number arithmetics and
58       *         <code>false</code> if it is not
59       */
60      public boolean lessThan (final int serialArithmeticNumber) {
61          if (value - serialArithmeticNumber < 0) return true;
62          return false;
63      }
64  
65      /**
66       * Returns <code>true</code> if the parameter is greater than the {@link #value} in serial number arithmetics and
67       * <code>false</code> if it is not.
68       * 
69       * @param serialArithmeticNumber the serial arithmetic number to match
70       * @return <code>true</code> if the parameter is greater than the {@link #value} in serial number arithmetics and
71       *         <code>false</code> if it is not
72       */
73      public boolean greaterThan (final int serialArithmeticNumber) {
74          if (serialArithmeticNumber - value < 0) return true;
75          return false;
76      }
77  
78      /**
79       * Returns the {@link SerialArithmeticNumber}'s {@link #value}.
80       * 
81       * @return the {@link #value}
82       */
83      public int getValue () {
84          return value;
85      }
86  }