File indexing completed on 2026-09-28 09:19:35
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef _BRepGraph_LayerRegistry_HeaderFile
0015 #define _BRepGraph_LayerRegistry_HeaderFile
0016
0017 #include <BRepGraph.hxx>
0018 #include <BRepGraph_Layer.hxx>
0019 #include <BRepGraph_RefId.hxx>
0020 #include <NCollection_DataMap.hxx>
0021 #include <NCollection_FlatDataMap.hxx>
0022 #include <NCollection_LinearVector.hxx>
0023 #include <Standard_DefineAlloc.hxx>
0024 #include <Standard_GUID.hxx>
0025
0026 #include <functional>
0027 #include <mutex>
0028 #include <shared_mutex>
0029 #include <atomic>
0030
0031
0032
0033
0034
0035 class BRepGraph_LayerRegistry
0036 {
0037 public:
0038 DEFINE_STANDARD_ALLOC
0039
0040 Standard_EXPORT BRepGraph_LayerRegistry();
0041
0042 BRepGraph_LayerRegistry(const BRepGraph_LayerRegistry&) = delete;
0043 BRepGraph_LayerRegistry& operator=(const BRepGraph_LayerRegistry&) = delete;
0044
0045 Standard_EXPORT BRepGraph_LayerRegistry(BRepGraph_LayerRegistry&& theOther) noexcept;
0046 Standard_EXPORT BRepGraph_LayerRegistry& operator=(BRepGraph_LayerRegistry&& theOther) noexcept;
0047
0048
0049
0050 Standard_EXPORT uint32_t RegisterLayer(const occ::handle<BRepGraph_Layer>& theLayer);
0051
0052
0053 Standard_EXPORT void UnregisterLayer(const Standard_GUID& theGUID);
0054
0055
0056 [[nodiscard]] Standard_EXPORT occ::handle<BRepGraph_Layer> FindLayer(
0057 const Standard_GUID& theGUID) const;
0058
0059
0060 template <typename T>
0061 [[nodiscard]] occ::handle<T> FindLayer() const
0062 {
0063 return Find<T>();
0064 }
0065
0066
0067 template <typename T>
0068 [[nodiscard]] occ::handle<T> Find() const
0069 {
0070 return occ::down_cast<T>(FindLayer(T::GetID()));
0071 }
0072
0073
0074
0075 template <typename T>
0076 [[nodiscard]] occ::handle<T> Ensure()
0077 {
0078 return occ::down_cast<T>(
0079 ensureLayer(T::GetID(), []() -> occ::handle<BRepGraph_Layer> { return new T(); }));
0080 }
0081
0082
0083 [[nodiscard]] Standard_EXPORT bool FindSlot(const Standard_GUID& theGUID,
0084 uint32_t& theSlot) const;
0085
0086
0087 [[nodiscard]] Standard_EXPORT occ::handle<BRepGraph_Layer> Layer(uint32_t theSlot) const;
0088
0089
0090 [[nodiscard]] uint32_t NbLayers() const
0091 {
0092 std::shared_lock<std::shared_mutex> aLock(myMutex);
0093 return static_cast<uint32_t>(myLayers.Size());
0094 }
0095
0096
0097 [[nodiscard]] bool HasModificationSubscribers() const
0098 {
0099 return mySubscribedKindsMask.load(std::memory_order_acquire) != 0;
0100 }
0101
0102
0103 [[nodiscard]] int SubscribedKindsMask() const
0104 {
0105 return static_cast<int>(mySubscribedKindsMask.load(std::memory_order_acquire));
0106 }
0107
0108
0109 Standard_EXPORT void DispatchOnNodeRemoved(const BRepGraph_NodeId theNode) noexcept;
0110
0111
0112 Standard_EXPORT void DispatchOnItemRemoved(const BRepGraph_ItemId theItem) noexcept;
0113
0114
0115 Standard_EXPORT void DispatchOnNodeReplaced(const BRepGraph_NodeId theOldNode,
0116 const BRepGraph_NodeId theNewNode) noexcept;
0117
0118
0119 Standard_EXPORT void DispatchNodeModified(const BRepGraph_NodeId theNode) noexcept;
0120
0121
0122 Standard_EXPORT void DispatchItemModified(const BRepGraph_ItemId theItem) noexcept;
0123
0124
0125 Standard_EXPORT void DispatchNodesModified(
0126 const NCollection_Array1<BRepGraph_NodeId>& theModifiedNodes,
0127 const int theModifiedKindsMask) noexcept;
0128
0129
0130
0131
0132
0133
0134 Standard_EXPORT void CopyLayersTo(
0135 BRepGraph& theTargetGraph,
0136 const NCollection_FlatDataMap<BRepGraph_ItemId, BRepGraph_ItemId>& theItemRemap,
0137 const BRepGraph_CopyRemap::Mode theMode) const;
0138
0139
0140
0141
0142
0143
0144 Standard_EXPORT void CopyLayersTo(BRepGraph& theTargetGraph,
0145 BRepGraph_CopyRemap::MappingKind theMappingKind,
0146 BRepGraph_CopyRemap::Mode theMode) const;
0147
0148
0149 [[nodiscard]] bool HasRefModificationSubscribers() const
0150 {
0151 return mySubscribedRefKindsMask.load(std::memory_order_acquire) != 0;
0152 }
0153
0154
0155 [[nodiscard]] int SubscribedRefKindsMask() const
0156 {
0157 return static_cast<int>(mySubscribedRefKindsMask.load(std::memory_order_acquire));
0158 }
0159
0160
0161 Standard_EXPORT void DispatchOnRefRemoved(const BRepGraph_RefId theRef) noexcept;
0162
0163
0164 Standard_EXPORT void DispatchRefModified(const BRepGraph_RefId theRef) noexcept;
0165
0166
0167 Standard_EXPORT void DispatchRefsModified(
0168 const NCollection_Array1<BRepGraph_RefId>& theModifiedRefs,
0169 const int theModifiedRefKindsMask) noexcept;
0170
0171
0172 Standard_EXPORT void ClearAll() noexcept;
0173
0174
0175 Standard_EXPORT void InvalidateAll() noexcept;
0176
0177 private:
0178 friend class ::BRepGraph;
0179 friend struct ::BRepGraph_Data;
0180
0181
0182 Standard_EXPORT void Attach(BRepGraph* theGraph) noexcept;
0183
0184
0185 Standard_EXPORT void Detach() noexcept;
0186
0187 [[nodiscard]] Standard_EXPORT occ::handle<BRepGraph_Layer> findLayerLocked(
0188 const Standard_GUID& theGUID) const;
0189
0190
0191
0192
0193 [[nodiscard]] Standard_EXPORT occ::handle<BRepGraph_Layer> ensureLayer(
0194 const Standard_GUID& theGUID,
0195 const std::function<occ::handle<BRepGraph_Layer>()>& theFactory);
0196
0197 [[nodiscard]] Standard_EXPORT occ::handle<BRepGraph_Layer> layerAt(uint32_t theSlot) const;
0198
0199 Standard_EXPORT uint32_t registerLayerLocked(const occ::handle<BRepGraph_Layer>& theLayer);
0200
0201 Standard_EXPORT void recomputeSubscribedKindsMask();
0202 Standard_EXPORT void detachAllLocked() noexcept;
0203
0204 private:
0205 NCollection_LinearVector<occ::handle<BRepGraph_Layer>> myLayers;
0206 NCollection_DataMap<Standard_GUID, uint32_t> myGuidToSlot;
0207 std::atomic<uint32_t> mySubscribedKindsMask{0};
0208 std::atomic<uint32_t> mySubscribedRefKindsMask{0};
0209 BRepGraph* myGraph = nullptr;
0210 mutable std::shared_mutex myMutex;
0211 };
0212
0213 #endif