#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace fesa { class DomainBuilder; class Domain final { public: Domain(const Domain&) = default; Domain(Domain&&) noexcept = default; Domain& operator=(const Domain&) = default; Domain& operator=(Domain&&) noexcept = default; [[nodiscard]] std::span nodes() const noexcept { return nodes_; } [[nodiscard]] std::span beam_elements() const noexcept { return beam_elements_; } [[nodiscard]] std::span materials() const noexcept { return materials_; } [[nodiscard]] std::span sections() const noexcept { return sections_; } [[nodiscard]] std::span node_sets() const noexcept { return node_sets_; } [[nodiscard]] std::span element_sets() const noexcept { return element_sets_; } [[nodiscard]] const StepDefinition& step() const noexcept { return step_; } [[nodiscard]] const Node& node(NodeId id) const; [[nodiscard]] const Node& node(const EntityOrigin& origin) const; private: friend class DomainBuilder; using OriginKey = std::pair; Domain( std::vector nodes, std::vector beam_elements, std::vector materials, std::vector sections, std::vector node_sets, std::vector element_sets, StepDefinition step); [[nodiscard]] static OriginKey origin_key(const EntityOrigin& origin); std::vector nodes_; std::vector beam_elements_; std::vector materials_; std::vector sections_; std::vector node_sets_; std::vector element_sets_; StepDefinition step_; std::unordered_map node_indices_; std::map node_origin_indices_; std::unordered_map beam_element_indices_; std::map beam_element_origin_indices_; std::unordered_map material_indices_; std::unordered_map section_indices_; }; } // namespace fesa