docs: def add(self, segment, overwrite=False):
          """Add segments by ascending address.
  
          """
  
          if self._list:
              if segment.minimum_address == self._current_segment.maximum_address:
                  # Fast insertion for adjacent segments.
                  self._current_segment.add_data(segment.minimum_address,
                                                segment.maximum_address,
                                                segment.data,
                                                overwrite)
              else:
                  # Linear insert.
                  for i, s in enumerate(self._list):
                      if segment.minimum_address <= s.maximum_address:
                          break
  
                  if segment.minimum_address > s.maximum_address:
                      # Non-overlapping, non-adjacent after.
                      self._list.append(segment)
                  elif segment.maximum_address < s.minimum_address:
                      # Non-overlapping, non-adjacent before.
                      self._list.insert(i, segment)
                  else:
                      # Adjacent or overlapping.
                      s.add_data(segment.minimum_address,
                                 segment.maximum_address,
                                 segment.data,
                                 overwrite)
                      segment = s
  
                  self._current_segment = segment
                  self._current_segment_index = i
  
              # Remove overwritten and merge adjacent segments.
              while self._current_segment is not self._list[-1]:
                  s = self._list[self._current_segment_index + 1]
  
                  if self._current_segment.maximum_address >= s.maximum_address:
                      # The whole segment is overwritten.
                      del self._list[self._current_segment_index + 1]
                  elif self._current_segment.maximum_address >= s.minimum_address:
                      # Adjacent or beginning of the segment overwritten.
                      self._current_segment.add_data(
                          self._current_segment.maximum_address,
                          s.maximum_address,
                          s.data[self._current_segment.maximum_address - s.minimum_address:],
                          overwrite=False)
                      del self._list[self._current_segment_index+1]
                      break
                  else:
                      # Segments are not overlapping, nor adjacent.
                      break
          else:
              self._list.append(segment)
              self._current_segment = segment
              self._current_segment_index = 0