Skip to content

Commit

Permalink
generic_utils: changed semantics of find to ap to std library
Browse files Browse the repository at this point in the history
std library functions take the predicate as first argument
  • Loading branch information
andi-bigswitch committed Aug 3, 2013
1 parent 6965722 commit 1f0d880
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 16 deletions.
16 changes: 13 additions & 3 deletions generic_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,12 +216,22 @@ def __repr__(self):
collections.OrderedDict.__repr__(self))


def find(iterable, func):
def find(func, iterable):
"""
find the first item in iterable for which func returns something true'ish.
@raise KeyError if no item in iterable fulfills the condition
@returns None if no item in iterable fulfills the condition
"""
for i in iterable:
if func(i):
return i
raise KeyError("Couldn't find value that matches: %s" % repr(func))
return None

def count(func, iteratable):
"""
count how the number of items in iterable for which func returns something true'ish.
"""
c = 0
for i in iterable:
if func(i):
c +=1
return c
43 changes: 30 additions & 13 deletions java_gen/java_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,10 @@ def enums(self):

@memoize
def enum_by_name(self, name):
try:
return find(self.enums, lambda e: e.name == name)
except KeyError:
res = find(lambda e: e.name == name, self.enums)
if not res:
raise KeyError("Could not find enum with name %s" % name)
return res

@property
@memoize
Expand Down Expand Up @@ -348,7 +348,11 @@ def inherited_from(self, version):

@property
def is_virtual(self):
return type_maps.class_is_virtual(self.c_name)
return self.ir_class.virtual # type_maps.class_is_virtual(self.c_name) or self.ir_class.virtual

@property
def discriminator(self):
return find(lambda m: isinstance(m, OFDiscriminatorMember), self.ir_class.members)

@property
def is_extension(self):
Expand All @@ -358,6 +362,16 @@ def is_extension(self):
def align(self):
return int(self.ir_class.params['align']) if 'align' in self.ir_class.params else 0

@property
@memoize
def superclass(self):
return find(lambda c: c.version == self.version and c.c_name == self.ir_class.superclass, model.all_classes)

@property
@memoize
def subclasses(self):
return [ c for c in model.all_classes if c.version == self.version and c.ir_class.superclass == self.c_name ]

#######################################################################
### Member
#######################################################################
Expand Down Expand Up @@ -580,23 +594,26 @@ def versions(self):

@memoize
def entry_by_name(self, name):
try:
return find(self.entries, lambda e: e.name == name)
except KeyError:
res = find(lambda e: e.name == name, self.entries)
if res:
return res
else:
raise KeyError("Enum %s: no entry with name %s" % (self.name, name))

@memoize
def entry_by_c_name(self, name):
try:
return find(self.entries, lambda e: e.c_name == name)
except KeyError:
res = find(lambda e: e.c_name == name, self.entries)
if res:
return res
else:
raise KeyError("Enum %s: no entry with c_name %s" % (self.name, name))

@memoize
def entry_by_version_value(self, version, value):
try:
return find(self.entries, lambda e: e.values[version] == value if version in e.values else False )
except KeyError:
res = find(lambda e: e.values[version] == value if version in e.values else False, self.entries)
if res:
return res
else:
raise KeyError("Enum %s: no entry with version %s, value %s" % (self.name, version, value))

# values: Map JavaVersion->Value
Expand Down

0 comments on commit 1f0d880

Please sign in to comment.