File indexing completed on 2025-10-31 09:10:24
0001 
0002 
0003 
0004 
0005 
0006 
0007 #pragma once
0008 
0009 #include "corecel/Config.hh"
0010 
0011 #include "corecel/io/Label.hh"
0012 #include "orange/transform/VariantTransform.hh"
0013 
0014 #include "../CsgTypes.hh"
0015 
0016 namespace celeritas
0017 {
0018 namespace orangeinp
0019 {
0020 namespace detail
0021 {
0022 
0023 class CsgUnitBuilder;
0024 struct BoundingZone;
0025 class PopVBTransformOnDestruct;
0026 
0027 
0028 
0029 
0030 
0031 
0032 
0033 
0034 
0035 
0036 
0037 
0038 
0039 
0040 class VolumeBuilder
0041 {
0042   public:
0043     
0044     
0045     using Metadata = Label;
0046     using Tol = Tolerance<>;
0047     
0048 
0049   public:
0050     
0051     explicit VolumeBuilder(CsgUnitBuilder* ub);
0052 
0053     
0054 
0055     
0056     Tol const& tol() const;
0057 
0058     
0059     
0060     CsgUnitBuilder const& unit_builder() const { return *ub_; }
0061     CsgUnitBuilder& unit_builder() { return *ub_; }
0062     
0063 
0064     
0065     VariantTransform const& local_transform() const;
0066 
0067     
0068 
0069     
0070     NodeId insert_region(Metadata&& md, Joined&& j);
0071 
0072     
0073     NodeId insert_region(Metadata&& md, Joined&& j, BoundingZone&& bz);
0074 
0075     
0076     NodeId insert_region(Metadata&& md, Negated&& n);
0077 
0078     
0079     [[nodiscard]] PopVBTransformOnDestruct
0080     make_scoped_transform(VariantTransform const& t);
0081 
0082   private:
0083     
0084 
0085     CsgUnitBuilder* ub_;
0086     std::vector<TransformId> transforms_;
0087 
0088     
0089 
0090     
0091     void push_transform(VariantTransform&& vt);
0092 
0093     
0094     void pop_transform();
0095 
0096     
0097 
0098     friend class PopVBTransformOnDestruct;
0099 };
0100 
0101 
0102 
0103 class PopVBTransformOnDestruct
0104 {
0105   private:
0106     friend class VolumeBuilder;
0107 
0108     
0109     explicit PopVBTransformOnDestruct(VolumeBuilder* vb);
0110 
0111   public:
0112     
0113     PopVBTransformOnDestruct(PopVBTransformOnDestruct&& other) noexcept
0114         : vb_(std::exchange(other.vb_, nullptr))
0115     {
0116     }
0117 
0118     
0119     PopVBTransformOnDestruct&
0120     operator=(PopVBTransformOnDestruct&& other) noexcept
0121     {
0122         vb_ = std::exchange(other.vb_, nullptr);
0123         return *this;
0124     }
0125 
0126     PopVBTransformOnDestruct(PopVBTransformOnDestruct const&) = default;
0127     PopVBTransformOnDestruct& operator=(PopVBTransformOnDestruct const&)
0128         = default;
0129 
0130     
0131     ~PopVBTransformOnDestruct() noexcept(!CELERITAS_DEBUG)
0132     {
0133         if (vb_)
0134         {
0135             vb_->pop_transform();
0136         }
0137     }
0138 
0139   private:
0140     VolumeBuilder* vb_{nullptr};
0141 };
0142 
0143 
0144 }  
0145 }  
0146 }