root/gaphor/tags/gaphor-0.2.0/uml2/collection.py

Revision 192, 4.4 kB (checked in by arjanmol, 6 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     def __nonzero__(self):
47         return self.items!=[]
48
49     def append(self, value):
50         if isinstance(value, self.type):
51             self.property._set(self.object, value)
52         else:
53             raise CollectionError, 'Object is not of type %s' % self.type.__name__
54
55     def remove(self, value):
56         if value in self.items:
57             self.property.__delete__(self.object, value)
58         else:
59             raise AttributeError, '%s not in collection' % value
60
61     def index(self, key):
62         """Given an object, return the position of that object in the
63         collection."""
64         return self.items.index(key)
65    
66     # OCL members (from SMW by Ivan Porres, http://www.abo.fi/~iporres/smw)
67
68     def size(self):
69         return len(self.items)
70
71     def includes(self,o):
72         return o in self.items
73
74     def excludes(self,o):
75         return not self.includes(o)
76
77     def count(self,o):
78         c=0
79         for x in self.items:
80             if x==o:
81                 c=c+1
82         return c
83
84     def includesAll(self,c):
85         for o in c:
86             if o not in self.items:
87                 return 0
88         return 1
89
90     def excludesAll(self,c):
91         for o in c:
92             if o in self.items:
93                 return 0
94         return 1
95
96     def select(self,f):
97         result=list()
98         for v in self.items:
99             if f(v):
100                 result.append(v)
101         return result
102
103     def reject(self,f):
104         result=list()
105         for v in self.items:
106             if not f(v):
107                 result.append(v)
108         return result
109
110     def collect(self,f):
111         result=list()
112         for v in self.items:
113             result.append(f(v))
114         return result
115
116     def isEmpty(self):
117         return len(self.items)==0
118
119     def nonEmpty(self):
120         return not self.isEmpty()
121    
122     def sum(self):
123         r=0
124         for o in self.items:
125             r=r+o
126         return o
127    
128     def forAll(self,f):
129         if not self.items or not inspect.getargspec(f)[0]:
130             return 1
131
132         nargs=len(inspect.getargspec(f)[0])
133         if inspect.getargspec(f)[3]:
134             nargs=nargs-len(inspect.getargspec(f)[3])
135            
136         assert(nargs>0)
137         nitems=len(self.items)
138         index=[0]*nargs
139        
140         while 1:
141             args=[]
142             for x in index:
143                 args.append(self.items[x])
144             if not apply(f,args):
145                 return 0
146             c=len(index)-1
147             index[c]=index[c]+1
148             while index[c]==nitems:
149                 index[c]=0
150                 c=c-1
151                 if c<0:
152                     return 1
153                 else:
154                     index[c]=index[c]+1
155                 if index[c]==nitems-1:
156                     c=c-1
157
158     def exist(self,f):
159         if not self.items or not inspect.getargspec(f)[0]:
160             return 0
161
162         nargs=len(inspect.getargspec(f)[0])
163         if inspect.getargspec(f)[3]:
164             nargs=nargs-len(inspect.getargspec(f)[3])
165            
166         assert(nargs>0)
167         nitems=len(self.items)
168         index=[0]*nargs
169         while 1:
170             args=[]
171             for x in index:
172                 args.append(self.items[x])
173             if apply(f,args):
174                 return 1
175             c=len(index)-1
176             index[c]=index[c]+1
177             while index[c]==nitems:
178                 index[c]=0
179                 c=c-1
180                 if c<0:
181                     return 0
182                 else:
183                     index[c]=index[c]+1
184                 if index[c]==nitems-1:
185                     c=c-1
Note: See TracBrowser for help on using the browser.