def operate_on_full_ip(self, operation, *alpha_masks):
        """In-place equivalent of operate_on_full().

        That is, works just like operate_on_full(), but
        instead of returning a new mask, the full alpha
        values replace the full alpha values of this
        instance, and the unit alpha values are updated by
        converting such values as well.

        Parameters
        ==========
        Same parameters as operate_on_full().
        """
        ### grab full alpha values by operating on full
        ### alpha values from this mask along with values
        ### from the given one(s)

        full_alpha_values = map_alpha_at_same_positions(
            operation, *(mask.full_alpha_values for mask in (self, *alpha_masks))
        )

        ### obtain size of full alpha values
        size = size_from_alpha_values(full_alpha_values)

        ### if the size is different, it means the width
        ### or height of a given mask is smaller that
        ### the width or height of this one, which isn't
        ### allowed, so we raise an error explaining the
        ### problem

        if size != self.size:

            raise ValueError(
                "the width and height of the given"
                " mask(s) must not be smaller that the"
                " width and height of this one"
            )

        ### store full alpha values
        self.full_alpha_values = full_alpha_values

        ### store unit alpha values obtained by converting
        ### the full values
        self.unit_alpha_values = unit_from_full_alpha_values(full_alpha_values)
In-place equivalent of operate_on_full().

        That is, works just like operate_on_full(), but
        instead of returning a new mask, the full alpha
        values replace the full alpha values of this
        instance, and the unit alpha values are updated by
        converting such values as well.

        Parameters
        ==========
        Same parameters as operate_on_full().
        
nodezator/alphamask/masksop.py