Support for bitwise AND/OR/XOR in ImmutableByteSequence

Also, minor refactoring of the fit() method to improve code readability

Change-Id: I826650c3fc45573c723d9d2dd8692da174d9ae08
diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/AbstractCriterionTranslator.java b/core/net/src/main/java/org/onosproject/net/pi/impl/AbstractCriterionTranslator.java
index 36e9068..9b2b4a0 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/AbstractCriterionTranslator.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/AbstractCriterionTranslator.java
@@ -23,7 +23,6 @@
 import java.util.Optional;
 
 import static org.onlab.util.ImmutableByteSequence.ByteSequenceTrimException;
-import static org.onlab.util.ImmutableByteSequence.fit;
 
 /**
  * Abstract implementation of a criterion translator that opportunistically tries to generate different types of match
@@ -48,7 +47,7 @@
     void initAsExactMatch(ImmutableByteSequence value, int bitWidth)
             throws ByteSequenceTrimException {
         this.initType = PiMatchType.EXACT;
-        this.value = fit(value, bitWidth);
+        this.value = value.fit(bitWidth);
         this.bitWidth = bitWidth;
     }
 
@@ -63,8 +62,8 @@
     void initAsTernaryMatch(ImmutableByteSequence value, ImmutableByteSequence mask, int bitWidth)
             throws ByteSequenceTrimException {
         this.initType = PiMatchType.TERNARY;
-        this.value = fit(value, bitWidth);
-        this.mask = fit(mask, bitWidth);
+        this.value = value.fit(bitWidth);
+        this.mask = mask.fit(bitWidth);
         this.bitWidth = bitWidth;
     }
 
@@ -79,7 +78,7 @@
     void initAsLpm(ImmutableByteSequence value, int prefixLength, int bitWidth)
             throws ByteSequenceTrimException {
         this.initType = PiMatchType.LPM;
-        this.value = fit(value, bitWidth);
+        this.value = value.fit(bitWidth);
         this.prefixLength = prefixLength;
         this.bitWidth = bitWidth;
     }
diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/PiFlowRuleTranslatorImpl.java b/core/net/src/main/java/org/onosproject/net/pi/impl/PiFlowRuleTranslatorImpl.java
index b4ce830..85c763c 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/PiFlowRuleTranslatorImpl.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/PiFlowRuleTranslatorImpl.java
@@ -59,7 +59,6 @@
 
 import static java.lang.String.format;
 import static org.onlab.util.ImmutableByteSequence.ByteSequenceTrimException;
-import static org.onlab.util.ImmutableByteSequence.fit;
 import static org.onosproject.net.flow.criteria.Criterion.Type.PROTOCOL_INDEPENDENT;
 import static org.onosproject.net.pi.impl.CriterionTranslatorHelper.translateCriterion;
 import static org.onosproject.net.pi.impl.PiUtils.getInterpreterOrNull;
@@ -247,7 +246,7 @@
                             "Not such parameter '%s' for action '%s'", param.id(), actionModel)));
             try {
                 newActionBuilder.withParameter(new PiActionParam(param.id(),
-                                                                 fit(param.value(), paramModel.bitWidth())));
+                                                                 param.value().fit(paramModel.bitWidth())));
             } catch (ByteSequenceTrimException e) {
                 throw new PiTranslationException(format(
                         "Size mismatch for parameter '%s' of action '%s': %s",
@@ -413,11 +412,11 @@
             switch (fieldModel.matchType()) {
                 case EXACT:
                     return new PiExactFieldMatch(fieldMatch.fieldId(),
-                                                 fit(((PiExactFieldMatch) fieldMatch).value(), modelBitWidth));
+                                                 ((PiExactFieldMatch) fieldMatch).value().fit(modelBitWidth));
                 case TERNARY:
                     return new PiTernaryFieldMatch(fieldMatch.fieldId(),
-                                                   fit(((PiTernaryFieldMatch) fieldMatch).value(), modelBitWidth),
-                                                   fit(((PiTernaryFieldMatch) fieldMatch).mask(), modelBitWidth));
+                                                   ((PiTernaryFieldMatch) fieldMatch).value().fit(modelBitWidth),
+                                                   ((PiTernaryFieldMatch) fieldMatch).mask().fit(modelBitWidth));
                 case LPM:
                     PiLpmFieldMatch lpmfield = (PiLpmFieldMatch) fieldMatch;
                     if (lpmfield.prefixLength() > modelBitWidth) {
@@ -426,12 +425,12 @@
                                 fieldMatch.fieldId(), lpmfield.prefixLength(), modelBitWidth));
                     }
                     return new PiLpmFieldMatch(fieldMatch.fieldId(),
-                                               fit(lpmfield.value(), modelBitWidth),
+                                               lpmfield.value().fit(modelBitWidth),
                                                lpmfield.prefixLength());
                 case RANGE:
                     return new PiRangeFieldMatch(fieldMatch.fieldId(),
-                                                 fit(((PiRangeFieldMatch) fieldMatch).lowValue(), modelBitWidth),
-                                                 fit(((PiRangeFieldMatch) fieldMatch).highValue(), modelBitWidth));
+                                                 ((PiRangeFieldMatch) fieldMatch).lowValue().fit(modelBitWidth),
+                                                 ((PiRangeFieldMatch) fieldMatch).highValue().fit(modelBitWidth));
                 case VALID:
                     return fieldMatch;
                 default:
diff --git a/core/net/src/test/java/org/onosproject/net/pi/impl/PiTranslatorServiceTest.java b/core/net/src/test/java/org/onosproject/net/pi/impl/PiTranslatorServiceTest.java
index 1d0caee..9af6745 100644
--- a/core/net/src/test/java/org/onosproject/net/pi/impl/PiTranslatorServiceTest.java
+++ b/core/net/src/test/java/org/onosproject/net/pi/impl/PiTranslatorServiceTest.java
@@ -65,7 +65,6 @@
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.onlab.util.ImmutableByteSequence.copyFrom;
-import static org.onlab.util.ImmutableByteSequence.fit;
 import static org.onosproject.net.group.GroupDescription.Type.SELECT;
 import static org.onosproject.pipelines.basic.BasicConstants.ACT_PRF_WCMP_SELECTOR_ID;
 import static org.onosproject.pipelines.basic.BasicConstants.ACT_PRM_PORT_ID;
@@ -237,7 +236,7 @@
 
     private static PiActionGroupMember outputMember(int portNum)
             throws ImmutableByteSequence.ByteSequenceTrimException {
-        PiActionParam param = new PiActionParam(ACT_PRM_PORT_ID, fit(copyFrom(portNum), PORT_BITWIDTH));
+        PiActionParam param = new PiActionParam(ACT_PRM_PORT_ID, copyFrom(portNum).fit(PORT_BITWIDTH));
         PiAction piAction = PiAction.builder()
                 .withId(ACT_SET_EGRESS_PORT_ID)
                 .withParameter(param).build();