root/gaphor/tags/gaphor-0.3.0/gaphor/UML/collection.py

Revision 261, 4.5 kB (checked in by arjanmol, 5 years ago)

*** empty log message ***

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 # vim:sw=4
2
3 import inspect
4
5 class CollectionError(Exception):
6     pass
7
8 class collection(object):
9
10     def __init__(self, property, object, type):
11         self.property = property
12         self.object = object
13         self.type = type
14         self.items = []
15
16     def __len__(self):
17         return len(self.items)
18
19     def __setitem__(self, key, value):
20         raise CollectionError, 'items should not be overwritten.'
21
22     def __delitem__(self, key):
23         self.remove(key)
24
25     def __getitem__(self, key):
26         return self.items.__getitem__(key)
27
28     def __getslice__(self, i, j):
29         return self.items.__getslice__(i, j)
30
31     def __setslice__(self, i, j, s):
32         raise CollectionError, 'items should not be overwritten.'
33
34     def __delslice__(self, i, j):
35         raise CollectionError, 'items should not be deleted this way.'
36
37     def __contains__(self, obj):
38         return self.items.__contains__(obj)
39
40     def __iter__(self):
41         return iter(self.items)
42
43     def __str__(self):
44         return str(self.items)
45
46     __repr__ = __str__
47
48     def __nonzero__(self):
49         return self.items!=[]
50
51     def append(self, value):
52         if isinstance(value, self.type):
53             self.property._set(self.object, value)
54         else:
55             raise CollectionError, 'Object is not of type %s' % self.type.__name__
56
57     def remove(self, value):
58         if value in self.items:
59             self.property.__delete__(self.object, value)
60         else:
61             raise AttributeError, '%s not in collection' % value
62
63     def index(self, key):
64         """Given an object, return the position of that object in the
65         collection."""
66         return self.items.index(key)
67    
68     # OCL members (from SMW by Ivan Porres, http://www.abo.fi/~iporres/smw)
69
70     def size(self):
71         return len(self.items)
72
73     def includes(self,o):
74         return o in self.items
75
76     def excludes(self,o):
77         return not self.includes(o)
78
79     def count(self,o):
80         c=0
81         for x in self.items:
82             if x==o:
83                 c=c+1
84         return c
85
86     def includesAll(self,c):
87         for o in c:
88             if o not in self.items:
89                 return 0
90         return 1
91
92     def excludesAll(self,c):
93         for o in c:
94             if o in self.items:
95                 return 0
96         return 1
97
98     def select(self,f):
99         result=list()
100         for v in self.items:
101             if f(v):
102                 result.append(v)
103         return result
104
105     def reject(self,f):
106         result=list()
107         for v in self.items:
108             if not f(v):
109                 result.append(v)
110         return result
111
112     def collect(self,f):
113         result=list()
114         for v in self.items:
115             result.append(f(v))
116         return result
117
118     def isEmpty(self):
119         return len(self.items)==0
120
121     def nonEmpty(self):
122         return not self.isEmpty()
123    
124     def sum(self):
125         r=0
126         for o in self.items:
127             r=r+o
128         return o
129    
130     def forAll(self,f):
131         if not self.items or not inspect.getargspec(f)[0]:
132             return 1
133
134         nargs=len(inspect.getargspec(f)[0])
135         if inspect.getargspec(f)[3]:
136             nargs=nargs-len(inspect.getargspec(f)[3])
137            
138         assert(nargs>0)
139         nitems=len(self.items)
140         index=[0]*nargs
141        
142         while 1:
143             args=[]
144             for x in index:
145                 args.append(self.items[x])
146             if not apply(f,args):
147                 return 0
148             c=len(index)-1
149             index[c]=index[c]+1
150             while index[c]==nitems:
151                 index[c]=0
152                 c=c-1
153                 if c<0:
154                     return 1
155                 else:
156                     index[c]=index[c]+1
157                 if index[c]==nitems-1:
158                     c=c-1
159
160     def exist(self,f):
161         if not self.items or not inspect.getargspec(f)[0]:
162             return 0
163
164         nargs=len(inspect.getargspec(f)[0])
165         if inspect.getargspec(f)[3]:
166             nargs=nargs-len(inspect.getargspec(f)[3])
167            
168         assert(nargs>0)
169         nitems=len(self.items)
170         index=[0]*nargs
171         while 1:
172             args=[]
173             for x in index:
174                 args.append(self.items[x])
175             if apply(f,args):
176                 return 1
177             c=len(index)-1
178             index[c]=index[c]+1
179             while index[c]==nitems:
180                 index[c]=0
181                 c=c-1
182                 if c<0:
183                     return 0
184                 else:
185                     index[c]=index[c]+1
186                 if index[c]==nitems-1:
187                     c=c-1
Note: See TracBrowser for help on using the browser.