Skip to content

Instantly share code, notes, and snippets.

@TheSithPadawan
Created April 15, 2022 15:23
Show Gist options
  • Save TheSithPadawan/a308ab51ae6631444fc0dd2a5e8da654 to your computer and use it in GitHub Desktop.
Save TheSithPadawan/a308ab51ae6631444fc0dd2a5e8da654 to your computer and use it in GitHub Desktop.
CFLT onsite prep -- variadic function
# variadic function call
"""
Note:
If a function is marked as isVariadic=true, then the last argument can occur one or more number of times.
Example:
FuncA: [String, Integer, Integer]; isVariadic = false
FuncB: [String, Integer]; isVariadic = true
FuncC: [Integer]; isVariadic = true
FuncD: [Integer, Integer]; isVariadic = true
FuncE: [Integer, Integer, Integer]; isVariadic = false
FuncF: [String]; isVariadic = false
FuncG: [Integer]; isVariadic = false
findMatches({String}) -> [FuncF]
findMatches({Integer}) -> [FuncC, FuncG]
findMatches({Integer, Integer, Integer, Integer}) -> [FuncC, FuncD]
findMatches({Integer, Integer, Integer}) -> [FuncC, FuncD, FuncE]
findMatches({String, Integer, Integer, Integer}) -> [FuncB]
findMatches({String, Integer, Integer}) -> [FuncA, FuncB]
algo
variadic_types = <rep, function>
nonvariadic_types = <rep, function>
check for match in non variadic types: direct convert
check for match in variadic type (int, int, int, int) -> reduced to (int)
"""
from collections import defaultdict
class Function:
def __init__ (self, name, argtypes, isvariadic):
self.name = name
self.argtypes = argtypes
self.isvariadic = isvariadic
def __repr__ (self):
return self.name
class FunctionLibrary:
def register(self, functionset):# k functions, each avg to n overall kn
self.variadic_lib = defaultdict(list)
self.nonvariadic_lib = defaultdict(list)
for func in functionset:
if func.isvariadic:
self.variadic_lib[tuple(func.argtypes)].append(func)
else:
self.nonvariadic_lib[tuple(func.argtypes)].append(func)
def findMatches(self, argtypes): # k args ~ k ^2
# input: list of args, output list of functions
search_key = tuple(argtypes)
result = []
result += self.nonvariadic_lib[search_key]
result += self.variadic_lib[search_key]
# check for non variadic
i = 0
for i in range(len(argtypes) - 2, -1, -1):
if argtypes[i] != argtypes[i+1]:
break
reduced_key = tuple(argtypes[:i+1])
result += self.variadic_lib[reduced_key]
return result
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment