Evaluate this StridedInterval to obtain a list of concrete integers.

        :param n: Upper bound for the number of concrete integers
        :param signed: Treat this StridedInterval as signed or unsigned
        :return: A list of at most `n` concrete integers

def eval(self, n, signed=False):
        """
        Evaluate this StridedInterval to obtain a list of concrete integers.

        :param n: Upper bound for the number of concrete integers
        :param signed: Treat this StridedInterval as signed or unsigned
        :return: A list of at most `n` concrete integers
        """

        if self.is_empty:
            # no value is available
            return [ ]

        if self._reversed:
            return self._reverse().eval(n, signed=signed)

        results = [ ]

        if self.stride == 0 and n > 0:
            results.append(self.lower_bound)
        else:
            if signed:
                # View it as a signed integer
                bounds = self._signed_bounds()

            else:
                # View it as an unsigned integer
                bounds = self._unsigned_bounds()

            for lb, ub in bounds:
                while len(results) < n and lb <= ub:
                    results.append(lb)
                    lb += self.stride # It will not overflow

        return results