CSIT-1110: Prepare for migrating the new detection
[csit.git] / resources / tools / presentation / new / jumpavg / BitCountingGroupList.py
index 7da0656..1f69c06 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+"""Module holding BitCountingGroupList class."""
+
 from BitCountingGroup import BitCountingGroup
 from BitCountingMetadataFactory import BitCountingMetadataFactory
 
 
-class BitCountingGroupList(object):
+class BitCountingGroupList(list):
+    """List of BitCountingGroup which tracks overall bit count.
+
+    This is useful, as bit count of a subsequent group
+    depends on average of the previous group.
+    Having the logic encapsulated here spares the caller
+    the effort to pass averages around.
+
+    Method with_value_added_to_last_group() delegates to BitCountingGroup,
+    with_group_appended() adds new group with recalculated bits.
+
+    TODO: last_group.metadata_factory.max_value in with_group_appended()
+    is ugly, find a more natural class design.
+    """
 
     def __init__(self, group_list=[], bits=None):
         """Create a group list from given list of groups.
@@ -25,7 +40,7 @@ class BitCountingGroupList(object):
         :type group_list: list of BitCountingGroup
         :type bits: float or None
         """
-        self.group_list = group_list
+        super(BitCountingGroupList, self).__init__(group_list)
         if bits is not None:
             self.bits = bits
             return
@@ -34,16 +49,6 @@ class BitCountingGroupList(object):
             bits += group.metadata.bits
         self.bits = bits
 
-    def __getitem__(self, index):
-        """Return group at the index. This makes self iterable.
-
-        :param index: The position in the array of groups.
-        :type index: int
-        :returns: Group at the position.
-        :rtype: BitCountingGroup
-        """
-        return self.group_list[index]
-
     def with_group_appended(self, group):
         """Create and return new group list with given group more than self.
 
@@ -54,7 +59,7 @@ class BitCountingGroupList(object):
         :returns: New group list with added group.
         :rtype: BitCountingGroupList
         """
-        group_list = list(self.group_list)
+        group_list = list(self)
         if group_list:
             last_group = group_list[-1]
             factory = BitCountingMetadataFactory(
@@ -73,10 +78,10 @@ class BitCountingGroupList(object):
         :returns: New group list with the last group updated.
         :rtype: BitCountingGroupList
         """
-        last_group = self.group_list[-1]
+        group_list = list(self)
+        last_group = group_list[-1]
         bits_before = last_group.metadata.bits
         last_group = last_group.with_run_added(value)
-        group_list = list(self.group_list)
         group_list[-1] = last_group
         bits = self.bits - bits_before + last_group.metadata.bits
         return BitCountingGroupList(group_list, bits)