#ifndef FESA_IO_ABAQUS_DOMAIN_MAPPING_CONTEXT_H_ #define FESA_IO_ABAQUS_DOMAIN_MAPPING_CONTEXT_H_ #include #include #include "fesa/core/status.h" #include "fesa/io/abaqus/input_syntax.h" #include "fesa/model/domain.h" namespace fesa::abaqus_internal { class DomainBuilder; class MaterialPropertyMapper; class SurfaceDefinitionMapper; class StepDefinitionMapper; class TopologyMapper; /// @brief Summarizes syntax-derived candidates before Domain ownership begins. struct DomainMappingCandidateSummary { std::size_t part_count; std::size_t node_count; std::size_t element_count; std::size_t instance_count; std::size_t node_set_count; std::size_t element_set_count; std::size_t material_count; std::size_t beam_section_count; std::size_t shell_section_count; std::size_t model_boundary_count; std::size_t step_boundary_count; std::size_t step_load_count; bool has_static_step; }; /// @brief Owns uncommitted Abaqus mapping candidates shared by private stages. /// @note The ParsedInput reference must outlive this context and all stages. class DomainMappingContext { public: /// @brief Starts an empty mapping candidate for one parsed input. explicit DomainMappingContext(const ParsedInput& input); ~DomainMappingContext(); DomainMappingContext(const DomainMappingContext&) = delete; DomainMappingContext& operator=(const DomainMappingContext&) = delete; DomainMappingContext(DomainMappingContext&&) = delete; DomainMappingContext& operator=(DomainMappingContext&&) = delete; /// @brief Reports stable raw candidate counts for component verification. DomainMappingCandidateSummary CandidateSummary() const noexcept; private: class Impl; friend class DomainBuilder; friend class MaterialPropertyMapper; friend class SurfaceDefinitionMapper; friend class StepDefinitionMapper; friend class TopologyMapper; /// @brief Parses syntax into uncommitted topology and semantic candidates. Status ParseSyntax(); /// @brief Validates and projects material and property candidates. Status FinalizeMaterialProperties(); /// @brief Expands identity instances and stable topology candidates. Status FinalizeTopology(); /// @brief Resolves assembly-level element surfaces after topology expansion. Status FinalizeElementSurfaces(); /// @brief Resolves the sole static step against finalized source targets. Status FinalizeStep(); /// @brief Atomically transfers a complete candidate into Domain ownership. Result Commit(); std::unique_ptr impl_; }; } // namespace fesa::abaqus_internal #endif // FESA_IO_ABAQUS_DOMAIN_MAPPING_CONTEXT_H_