|
|
|||
File indexing completed on 2025-11-18 09:52:20
0001 //------------------------------- -*- C++ -*- -------------------------------// 0002 // Copyright Celeritas contributors: see top-level COPYRIGHT file for details 0003 // SPDX-License-Identifier: (Apache-2.0 OR MIT) 0004 //---------------------------------------------------------------------------// 0005 //! \file orange/orangeinp/Shape.hh 0006 //---------------------------------------------------------------------------// 0007 #pragma once 0008 0009 #include <type_traits> 0010 0011 #include "IntersectRegion.hh" 0012 #include "ObjectInterface.hh" 0013 0014 namespace celeritas 0015 { 0016 namespace orangeinp 0017 { 0018 //---------------------------------------------------------------------------// 0019 /*! 0020 * A simple, intersect-only region of space. 0021 * 0022 * This is an abstract class that implements \c build for constructing a volume 0023 * by dispatching to a method \c build_interior that the daughters must 0024 * override using a intersect region. 0025 * 0026 * Use the implementation classes \c XShape where \c X is one of the 0027 * region types in IntersectRegion.hh : 0028 * - \c BoxShape 0029 * - \c ConeShape 0030 * - \c CylinderShape 0031 * - \c EllipsoidShape 0032 * - \c GenPrismShape 0033 * - \c ParallelepipedShape 0034 * - \c PrismShape 0035 * - \c SphereShape 0036 */ 0037 class ShapeBase : public ObjectInterface 0038 { 0039 public: 0040 // Construct a volume from this object 0041 NodeId build(VolumeBuilder&) const final; 0042 0043 // Write the shape to JSON 0044 void output(JsonPimpl*) const final; 0045 0046 //! Interior intersect region interface for construction and access 0047 virtual IntersectRegionInterface const& interior() const = 0; 0048 0049 ~ShapeBase() override = default; 0050 0051 protected: 0052 //!@{ 0053 //! Allow construction and assignment only through daughter classes 0054 ShapeBase() = default; 0055 CELER_DEFAULT_COPY_MOVE(ShapeBase); 0056 //!@} 0057 }; 0058 0059 //---------------------------------------------------------------------------// 0060 /*! 0061 * Shape that holds an intersect region and forwards construction args to it. 0062 * 0063 * Construct as: \code 0064 BoxShape s{"mybox", Real3{1, 2, 3}}; 0065 * \endcode 0066 * or \code 0067 * Shape s{"mybox", Box{{1, 2, 3}}}; 0068 * \endcode 0069 * 0070 * See IntersectRegion.hh for a list of the regions and their construction 0071 * arguments. 0072 */ 0073 template<class T> 0074 class Shape final : public ShapeBase 0075 { 0076 static_assert(std::is_base_of_v<IntersectRegionInterface, T>); 0077 0078 public: 0079 //! Construct with a label and arguments of the intersect region 0080 template<class... Ts> 0081 Shape(std::string&& label, Ts... region_args) 0082 : label_{std::move(label)}, region_{std::forward<Ts>(region_args)...} 0083 { 0084 CELER_EXPECT(!label_.empty()); 0085 } 0086 0087 //! Construct with a label and intersect region 0088 Shape(std::string&& label, T&& region) 0089 : label_{std::move(label)}, region_{std::move(region)} 0090 { 0091 CELER_EXPECT(!label_.empty()); 0092 } 0093 0094 //! Get the user-provided label 0095 std::string_view label() const final { return label_; } 0096 0097 //! Interior intersect region 0098 IntersectRegionInterface const& interior() const final { return region_; } 0099 0100 private: 0101 std::string label_; 0102 T region_; 0103 }; 0104 0105 //---------------------------------------------------------------------------// 0106 // DEDUCTION GUIDES 0107 //---------------------------------------------------------------------------// 0108 0109 template<class T> 0110 Shape(std::string&&, T&&) -> Shape<T>; 0111 0112 //---------------------------------------------------------------------------// 0113 // TYPE ALIASES 0114 //---------------------------------------------------------------------------// 0115 0116 using BoxShape = Shape<Box>; 0117 using ConeShape = Shape<Cone>; 0118 using CylinderShape = Shape<Cylinder>; 0119 using EllipsoidShape = Shape<Ellipsoid>; 0120 using GenPrismShape = Shape<GenPrism>; 0121 using InvoluteShape = Shape<Involute>; 0122 using ParallelepipedShape = Shape<Parallelepiped>; 0123 using PrismShape = Shape<Prism>; 0124 using SphereShape = Shape<Sphere>; 0125 0126 //---------------------------------------------------------------------------// 0127 // EXPLICIT INSTANTIATION 0128 //---------------------------------------------------------------------------// 0129 0130 extern template class Shape<Box>; 0131 extern template class Shape<Cone>; 0132 extern template class Shape<Cylinder>; 0133 extern template class Shape<Ellipsoid>; 0134 extern template class Shape<GenPrism>; 0135 extern template class Shape<Involute>; 0136 extern template class Shape<Parallelepiped>; 0137 extern template class Shape<Prism>; 0138 extern template class Shape<Sphere>; 0139 0140 //---------------------------------------------------------------------------// 0141 } // namespace orangeinp 0142 } // namespace celeritas
| [ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
|
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |
|