Cleaner implementation of Domain.__and__()
[linpy.git] / linpy / domains.py
index 31b5c3f..da0ea97 100644 (file)
@@ -278,6 +278,10 @@ class Domain(GeometricObject):
         Project out the sequence of symbols given in arguments, and return the
         resulting domain.
         """
+        symbols = list(symbols)
+        for symbol in symbols:
+            if not isinstance(symbol, Symbol):
+                raise TypeError('symbols must be Symbol instances')
         islset = self._toislset(self.polyhedra, self.symbols)
         n = 0
         for index, symbol in reversed(list(enumerate(self.symbols))):
@@ -316,17 +320,19 @@ class Domain(GeometricObject):
         Return the intersection of two or more domains as a new domain. As an
         alternative, function And() can be used.
         """
-        if len(others) == 0:
-            return self
-        symbols = self._xsymbols((self,) + others)
-        islset1 = self._toislset(self.polyhedra, symbols)
+        result = self
         for other in others:
-            islset2 = other._toislset(other.polyhedra, symbols)
-            islset1 = libisl.isl_set_intersect(islset1, islset2)
-        return self._fromislset(islset1, symbols)
+            result &= other
+        return result
 
     def __and__(self, other):
-        return self.intersection(other)
+        if isinstance(other, Domain):
+            symbols = self._xsymbols([self, other])
+            islset1 = self._toislset(self.polyhedra, symbols)
+            islset2 = other._toislset(other.polyhedra, symbols)
+            islset = libisl.isl_set_intersect(islset1, islset2)
+            return self._fromislset(islset, symbols)
+        return NotImplemented
     __and__.__doc__ = intersection.__doc__
 
     def union(self, *others):