Created
April 15, 2022 15:23
-
-
Save TheSithPadawan/a308ab51ae6631444fc0dd2a5e8da654 to your computer and use it in GitHub Desktop.
CFLT onsite prep -- variadic function
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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