Source code for ifgen.struct.methods.fields.common
"""
Common utilities for generating bit-field related struct methods.
"""
# built-in
from typing import Any, Optional
BitField = dict[str, Any]
[docs]
def bit_mask_literal(width: int) -> str:
"""Get a bit-mask literal."""
if width % 4 == 0:
return "0x" + ("f" * (width // 4)) + "u"
return "0b" + ("1" * width) + "u"
[docs]
def possible_array_arg(parent: dict[str, Any]) -> str:
"""Determine if a method needs an array-index argument."""
array_length: Optional[int] = parent.get("array_length")
inner = ""
if array_length:
inner = "std::size_t index"
return inner
STANDARD_INTS = [
("uint8_t", 8),
("uint16_t", 16),
("uint32_t", 32),
("uint64_t", 64),
]
[docs]
def bit_field_underlying(field: dict[str, Any]) -> str:
"""Get the underlying type for a bit field."""
kind = field.get("type")
# Automatically determine a sane primitive-integer type to use if one isn't
# specified.
if kind is None:
width = field["width"]
if width == 1:
kind = "bool"
else:
for candidate, bit_width in STANDARD_INTS:
if field["width"] <= bit_width:
kind = candidate
break
assert kind is not None, kind
return kind
[docs]
def bit_field_method_slug(
field: dict[str, Any], member: str = "", alias: str = None
) -> str:
"""Get a method slug for a struct's bit-field method."""
name = str(field["name"]) if not alias else alias
if member and member != name:
name += "_" + member
return name