File indexing completed on 2025-09-17 09:07:48
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 }