Source code for fgen.wrapping_strategies

"""
Wrapping strategies

Different Fortran types need different strategies for wrapping.
We capture these here.
"""
from __future__ import annotations

from fgen.fortran_parsing import FortranDataType
from fgen.wrapping_strategies.array_deferred_size import (
    WrappingStrategyArrayDeferredSize,
)
from fgen.wrapping_strategies.array_derived_type import (
    WrappingStrategyArrayDerivedType,
)
from fgen.wrapping_strategies.array_derived_type_deferred_size import (
    WrappingStrategyArrayDerivedTypeDeferredSize,
)
from fgen.wrapping_strategies.character import (
    WrappingStrategyCharacter,
)
from fgen.wrapping_strategies.character_deferred_size import (
    WrappingStrategyCharacterDeferredSize,
)
from fgen.wrapping_strategies.default import WrappingStrategyDefault
from fgen.wrapping_strategies.derived_type import (
    WrappingStrategyDerivedType,
)
from fgen.wrapping_strategies.enum import WrappingStrategyEnum
from fgen.wrapping_strategies.interface import WrappingStrategyLike
from fgen.wrapping_strategies.logical import (
    WrappingStrategyLogical,
)
from fgen.wrapping_strategies.passing_to_fortran_steps import (
    PassingToFortranSteps,
)


[docs]def get_wrapping_strategy( fortran_data_type: FortranDataType, ) -> WrappingStrategyLike: """ Get wrapping strategy for a given :obj:`FortranDataType` Parameters ---------- fortran_data_type :obj:`FortranDataType` for which to get the wrapping strategy Returns ------- Wrapping strategy object """ if fortran_data_type.is_array: return get_array_wrapping_strategy(fortran_data_type) if fortran_data_type.is_character: return get_character_wrapping_strategy(fortran_data_type) if fortran_data_type.is_derived_type: return WrappingStrategyDerivedType() if fortran_data_type.is_enum: return WrappingStrategyEnum() if fortran_data_type.is_logical: return WrappingStrategyLogical() return WrappingStrategyDefault()
[docs]def get_character_wrapping_strategy(fdt: FortranDataType) -> WrappingStrategyLike: """ Get wrapping strategy, given we know the Fortran data type is a character Parameters ---------- fdt Fortran data type Returns ------- Wrapping strategy """ if fdt.has_deferred_size: return WrappingStrategyCharacterDeferredSize() return WrappingStrategyCharacter()
[docs]def get_array_wrapping_strategy(fdt: FortranDataType) -> WrappingStrategyLike: """ Get wrapping strategy, given we know the data type is an array Parameters ---------- fdt Fortran data type Returns ------- Wrapping strategy """ if fdt.is_array_of_derived_type: if fdt.has_deferred_size: res: WrappingStrategyLike = WrappingStrategyArrayDerivedTypeDeferredSize() else: res = WrappingStrategyArrayDerivedType() elif fdt.has_deferred_size: res = WrappingStrategyArrayDeferredSize() else: res = WrappingStrategyDefault() return res
__all__ = [ "PassingToFortranSteps", "WrappingStrategyArrayDeferredSize", "WrappingStrategyCharacter", "WrappingStrategyCharacterDeferredSize", "WrappingStrategyDefault", "WrappingStrategyDerivedType", "WrappingStrategyLike", "WrappingStrategyLogical", "get_wrapping_strategy", ]