"""
buffer-specific builder utilities for code generation.
"""
__all__ = [
"create_builder_method_wrapper_with_buffer_builder",
"attach_builder_methods_with_buffer_builder",
"setup_unified_builder_with_buffer_builder",
]
def create_builder_method_wrapper_with_buffer_builder(main_builder, delegate_builder, method_name):
"""
Create a wrapper that delegates a method call to another builder while
synchronizing insertion points and locations.
"""
delegate_method = getattr(delegate_builder, method_name)
def wrapper(*args, **kwargs):
saved_ip = main_builder.get_insertion_point()
saved_loc = main_builder.get_loc()
delegate_builder.restore_insertion_point(saved_ip)
if saved_loc:
delegate_builder.set_loc(saved_loc)
result = delegate_method(*args, **kwargs)
main_builder.restore_insertion_point(saved_ip)
if saved_loc:
main_builder.set_loc(saved_loc)
return result
wrapper.__name__ = method_name
wrapper.__doc__ = getattr(delegate_method, '__doc__', None)
return wrapper
def attach_builder_methods_with_buffer_builder(main_builder, delegate_builder, method_names):
"""Attach multiple methods from a delegate builder to the main builder."""
for method_name in method_names:
wrapper = create_builder_method_wrapper_with_buffer_builder(main_builder, delegate_builder, method_name)
setattr(main_builder, method_name, wrapper)
def setup_unified_builder_with_buffer_builder(main_builder, buffer_builder):
"""Set up a unified builder interface by attaching methods from specialized builders."""
main_builder._buffer_builder = buffer_builder
buffer_methods = [
'get_null_attr',
'get_str_array_attr',
'alloc',
'to_buffer',
'to_tensor',
'subview',
]
attach_builder_methods_with_buffer_builder(main_builder, buffer_builder, buffer_methods)