# 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.
: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
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.
: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(
: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)