|
|
|||
File indexing completed on 2026-09-23 09:16:47
0001 // Created by: Peter KURNEV 0002 // Copyright (c) 2010-2014 OPEN CASCADE SAS 0003 // Copyright (c) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE 0004 // Copyright (c) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT, 0005 // EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 0006 // 0007 // This file is part of Open CASCADE Technology software library. 0008 // 0009 // This library is free software; you can redistribute it and/or modify it under 0010 // the terms of the GNU Lesser General Public License version 2.1 as published 0011 // by the Free Software Foundation, with special exception defined in the file 0012 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT 0013 // distribution for complete text of the license and disclaimer of any warranty. 0014 // 0015 // Alternatively, this file may be used under the terms of Open CASCADE 0016 // commercial license or contractual agreement. 0017 0018 #ifndef _BOPAlgo_Builder_HeaderFile 0019 #define _BOPAlgo_Builder_HeaderFile 0020 0021 #include <Standard.hxx> 0022 #include <Standard_DefineAlloc.hxx> 0023 #include <Standard_Handle.hxx> 0024 0025 #include <BOPAlgo_PPaveFiller.hxx> 0026 #include <BOPAlgo_BuilderShape.hxx> 0027 #include <BOPAlgo_GlueEnum.hxx> 0028 #include <BOPAlgo_Operation.hxx> 0029 #include <BOPDS_PDS.hxx> 0030 #include <NCollection_BaseAllocator.hxx> 0031 #include <Standard_Integer.hxx> 0032 #include <Standard_Real.hxx> 0033 #include <TopoDS_Shape.hxx> 0034 #include <NCollection_List.hxx> 0035 #include <TopTools_ShapeMapHasher.hxx> 0036 #include <NCollection_DataMap.hxx> 0037 #include <NCollection_Map.hxx> 0038 #include <TopAbs_ShapeEnum.hxx> 0039 class IntTools_Context; 0040 class TopoDS_Shape; 0041 0042 //! 0043 //! The class is a General Fuse algorithm - base algorithm for the 0044 //! algorithms in the Boolean Component. Its main purpose is to build 0045 //! the split parts of the argument shapes from which the result of 0046 //! the operations is combined. 0047 //! The result of the General Fuse algorithm itself is a compound 0048 //! containing all split parts of the arguments. 0049 //! 0050 //! Additionally to the options of the base classes, the algorithm has 0051 //! the following options: 0052 //! - *Safe processing mode* - allows to avoid modification of the input 0053 //! shapes during the operation (by default it is off); 0054 //! - *Gluing options* - allows to speed up the calculation of the intersections 0055 //! on the special cases, in which some sub-shapes are coinciding. 0056 //! - *Disabling the check for inverted solids* - Disables/Enables the check of the input solids 0057 //! for inverted status (holes in the space). The default value is TRUE, 0058 //! i.e. the check is performed. Setting this flag to FALSE for inverted 0059 //! solids, most likely will lead to incorrect results. 0060 //! 0061 //! The algorithm returns the following warnings: 0062 //! - *BOPAlgo_AlertUnableToOrientTheShape* - in case the check on the orientation of the split 0063 //! shape 0064 //! to match the orientation of the original shape has 0065 //! failed. 0066 //! 0067 //! The algorithm returns the following Error statuses: 0068 //! - *BOPAlgo_AlertTooFewArguments* - in case there are no enough arguments to perform the 0069 //! operation; 0070 //! - *BOPAlgo_AlertNoFiller* - in case the intersection tool has not been created; 0071 //! - *BOPAlgo_AlertIntersectionFailed* - in case the intersection of the arguments has failed; 0072 //! - *BOPAlgo_AlertBuilderFailed* - in case building splits of arguments has failed with some 0073 //! unexpected error. 0074 //! 0075 class BOPAlgo_Builder : public BOPAlgo_BuilderShape 0076 { 0077 public: 0078 DEFINE_STANDARD_ALLOC 0079 0080 //! Empty constructor. 0081 Standard_EXPORT BOPAlgo_Builder(); 0082 Standard_EXPORT ~BOPAlgo_Builder() override; 0083 0084 Standard_EXPORT BOPAlgo_Builder(const occ::handle<NCollection_BaseAllocator>& theAllocator); 0085 0086 //! Clears the content of the algorithm. 0087 Standard_EXPORT void Clear() override; 0088 0089 //! Returns the PaveFiller, algorithm for sub-shapes intersection. 0090 BOPAlgo_PPaveFiller PPaveFiller() { return myPaveFiller; } 0091 0092 //! Returns the Data Structure, holder of intersection information. 0093 BOPDS_PDS PDS() { return myDS; } 0094 0095 //! Returns the Context, tool for cashing heavy algorithms. 0096 occ::handle<IntTools_Context> Context() const { return myContext; } 0097 0098 public: //! @name Arguments 0099 //! Adds the argument to the operation. 0100 Standard_EXPORT virtual void AddArgument(const TopoDS_Shape& theShape); 0101 0102 //! Sets the list of arguments for the operation. 0103 Standard_EXPORT virtual void SetArguments(const NCollection_List<TopoDS_Shape>& theLS); 0104 0105 //! Returns the list of arguments. 0106 const NCollection_List<TopoDS_Shape>& Arguments() const { return myArguments; } 0107 0108 public: //! @name Options 0109 //! Sets the flag that defines the mode of treatment. 0110 //! In non-destructive mode the argument shapes are not modified. Instead 0111 //! a copy of a sub-shape is created in the result if it is needed to be updated. 0112 //! This flag is taken into account if internal PaveFiller is used only. 0113 //! In the case of calling PerformWithFiller the corresponding flag of that PaveFiller 0114 //! is in force. 0115 void SetNonDestructive(const bool theFlag) { myNonDestructive = theFlag; } 0116 0117 //! Returns the flag that defines the mode of treatment. 0118 //! In non-destructive mode the argument shapes are not modified. Instead 0119 //! a copy of a sub-shape is created in the result if it is needed to be updated. 0120 bool NonDestructive() const { return myNonDestructive; } 0121 0122 //! Sets the glue option for the algorithm 0123 void SetGlue(const BOPAlgo_GlueEnum theGlue) { myGlue = theGlue; } 0124 0125 //! Returns the glue option of the algorithm 0126 BOPAlgo_GlueEnum Glue() const { return myGlue; } 0127 0128 //! Enables/Disables the check of the input solids for inverted status 0129 void SetCheckInverted(const bool theCheck) { myCheckInverted = theCheck; } 0130 0131 //! Returns the flag defining whether the check for input solids on inverted status 0132 //! should be performed or not. 0133 bool CheckInverted() const { return myCheckInverted; } 0134 0135 public: //! @name Performing the operation 0136 //! Performs the operation. 0137 //! The intersection will be performed also. 0138 Standard_EXPORT void Perform( 0139 const Message_ProgressRange& theRange = Message_ProgressRange()) override; 0140 0141 //! Performs the operation with the prepared filler. 0142 //! The intersection will not be performed in this case. 0143 Standard_EXPORT virtual void PerformWithFiller( 0144 const BOPAlgo_PaveFiller& theFiller, 0145 const Message_ProgressRange& theRange = Message_ProgressRange()); 0146 0147 public: //! @name BOPs on open solids 0148 //! Builds the result shape according to the given states for the objects 0149 //! and tools. These states can be unambiguously converted into the Boolean operation type. 0150 //! Thus, it performs the Boolean operation on the given groups of shapes. 0151 //! 0152 //! The result is built basing on the result of Builder operation (GF or any other). 0153 //! The only condition for the Builder is that the splits of faces should be created 0154 //! and classified relatively solids. 0155 //! 0156 //! The method uses classification approach for choosing the faces which will 0157 //! participate in building the result shape: 0158 //! - All faces from each group having the given state for the opposite group 0159 //! will be taken into result. 0160 //! 0161 //! Such approach shows better results (in comparison with BOPAlgo_BuilderSolid approach) 0162 //! when working with open solids. However, the result may not be always 0163 //! correct on such data (at least, not as expected) as the correct classification 0164 //! of the faces relatively open solids is not always possible and may vary 0165 //! depending on the chosen classification point on the face. 0166 //! 0167 //! History is not created for the solids in this method. 0168 //! 0169 //! To avoid pollution of the report of Builder algorithm, there is a possibility to pass 0170 //! the different report to collect the alerts of the method only. But, if the new report 0171 //! is not given, the Builder report will be used. 0172 //! So, even if Builder passed without any errors, but some error has been stored into its report 0173 //! in this method, for the following calls the Builder report must be cleared. 0174 //! 0175 //! The method may set the following errors: 0176 //! - BOPAlgo_AlertBuilderFailed - Building operation has not been performed yet or failed; 0177 //! - BOPAlgo_AlertBOPNotSet - invalid BOP type is given (COMMON/FUSE/CUT/CUT21 are supported); 0178 //! - BOPAlgo_AlertTooFewArguments - arguments are not given; 0179 //! - BOPAlgo_AlertUnknownShape - the shape is unknown for the operation. 0180 //! 0181 //! Parameters: 0182 //! @param theObjects - The group of Objects for BOP; 0183 //! @param theObjState - State for objects faces to pass into result; 0184 //! @param theTools - The group of Tools for BOP; 0185 //! @param theToolsState - State for tools faces to pass into result; 0186 //! @param theReport - The alternative report to avoid pollution of the main one. 0187 Standard_EXPORT virtual void BuildBOP(const NCollection_List<TopoDS_Shape>& theObjects, 0188 const TopAbs_State theObjState, 0189 const NCollection_List<TopoDS_Shape>& theTools, 0190 const TopAbs_State theToolsState, 0191 const Message_ProgressRange& theRange, 0192 occ::handle<Message_Report> theReport = nullptr); 0193 0194 //! Builds the result of Boolean operation of given type 0195 //! basing on the result of Builder operation (GF or any other). 0196 //! 0197 //! The method converts the given type of operation into the states 0198 //! for the objects and tools required for their face to pass into result 0199 //! and performs the call to the same method, but with states instead 0200 //! of operation type. 0201 //! 0202 //! The conversion looks as follows: 0203 //! - COMMON is built from the faces of objects located IN any of the tools 0204 //! and vice versa. 0205 //! - FUSE is built from the faces OUT of all given shapes; 0206 //! - CUT is built from the faces of the objects OUT of the tools and 0207 //! faces of the tools located IN solids of the objects. 0208 //! 0209 //! @param theObjects - The group of Objects for BOP; 0210 //! @param theTools - The group of Tools for BOP; 0211 //! @param theOperation - The BOP type; 0212 //! @param theRange - The parameter to progressIndicator 0213 //! @param theReport - The alternative report to avoid pollution of the global one. 0214 void BuildBOP(const NCollection_List<TopoDS_Shape>& theObjects, 0215 const NCollection_List<TopoDS_Shape>& theTools, 0216 const BOPAlgo_Operation theOperation, 0217 const Message_ProgressRange& theRange, 0218 occ::handle<Message_Report> theReport = nullptr) 0219 { 0220 TopAbs_State anObjState, aToolsState; 0221 switch (theOperation) 0222 { 0223 case BOPAlgo_COMMON: { 0224 anObjState = TopAbs_IN; 0225 aToolsState = TopAbs_IN; 0226 break; 0227 } 0228 case BOPAlgo_FUSE: { 0229 anObjState = TopAbs_OUT; 0230 aToolsState = TopAbs_OUT; 0231 break; 0232 } 0233 case BOPAlgo_CUT: { 0234 anObjState = TopAbs_OUT; 0235 aToolsState = TopAbs_IN; 0236 break; 0237 } 0238 case BOPAlgo_CUT21: { 0239 anObjState = TopAbs_IN; 0240 aToolsState = TopAbs_OUT; 0241 break; 0242 } 0243 default: { 0244 anObjState = TopAbs_UNKNOWN; 0245 aToolsState = TopAbs_UNKNOWN; 0246 break; 0247 } 0248 } 0249 BuildBOP(theObjects, anObjState, theTools, aToolsState, theRange, theReport); 0250 } 0251 0252 protected: //! @name History methods 0253 //! Prepare information for history support. 0254 Standard_EXPORT void PrepareHistory(const Message_ProgressRange& theRange); 0255 0256 //! Prepare history information for the input shapes taking into account possible 0257 //! operation-specific modifications. 0258 //! For instance, in the CellsBuilder operation, additionally to splitting input shapes 0259 //! the splits of the shapes (or the shapes themselves) may be unified during removal of internal 0260 //! boundaries. In this case each split should be linked to the unified shape. 0261 //! 0262 //! To have correct history information, the method should be redefined in each operation 0263 //! where such additional modification is possible. The input shape <theS> should be the one from 0264 //! arguments, and the returning list should contain all final elements to which the input shape 0265 //! has evolved, including those not contained in the result shape. 0266 //! 0267 //! The method returns pointer to the list of modified elements. 0268 //! NULL pointer means that the shape has not been modified at all. 0269 //! 0270 //! The General Fuse operation does not perform any other modification than splitting the input 0271 //! shapes basing on their intersection information. This information is contained in myImages 0272 //! map. Thus, here the method returns only splits (if any) contained in this map. 0273 Standard_EXPORT virtual const NCollection_List<TopoDS_Shape>* LocModified( 0274 const TopoDS_Shape& theS); 0275 0276 //! Returns the list of shapes generated from the shape theS. 0277 //! Similarly to *LocModified* must be redefined for specific operations, 0278 //! obtaining Generated elements differently. 0279 Standard_EXPORT virtual const NCollection_List<TopoDS_Shape>& LocGenerated( 0280 const TopoDS_Shape& theS); 0281 0282 public: //! @name Images/Origins 0283 //! Returns the map of images. 0284 const NCollection_DataMap<TopoDS_Shape, NCollection_List<TopoDS_Shape>, TopTools_ShapeMapHasher>& 0285 Images() const 0286 { 0287 return myImages; 0288 } 0289 0290 //! Returns the map of origins. 0291 const NCollection_DataMap<TopoDS_Shape, NCollection_List<TopoDS_Shape>, TopTools_ShapeMapHasher>& 0292 Origins() const 0293 { 0294 return myOrigins; 0295 } 0296 0297 //! Returns the map of Same Domain (SD) shapes - coinciding shapes 0298 //! from different arguments. 0299 const NCollection_DataMap<TopoDS_Shape, TopoDS_Shape, TopTools_ShapeMapHasher>& ShapesSD() const 0300 { 0301 return myShapesSD; 0302 } 0303 0304 protected: //! @name Analyze progress of the operation 0305 //! List of operations to be supported by the Progress Indicator 0306 enum BOPAlgo_PIOperation 0307 { 0308 PIOperation_TreatVertices = 0, 0309 PIOperation_TreatEdges, 0310 PIOperation_TreatWires, 0311 PIOperation_TreatFaces, 0312 PIOperation_TreatShells, 0313 PIOperation_TreatSolids, 0314 PIOperation_TreatCompsolids, 0315 PIOperation_TreatCompounds, 0316 PIOperation_FillHistory, 0317 PIOperation_PostTreat, 0318 PIOperation_Last 0319 }; 0320 0321 //! Auxiliary structure to get information about number of shapes 0322 //! of each type participated in operation. 0323 class NbShapes 0324 { 0325 public: 0326 NbShapes() 0327 { 0328 for (int i = 0; i < 8; ++i) 0329 { 0330 myNbShapesArr[i] = 0; 0331 } 0332 } 0333 0334 int NbVertices() const { return myNbShapesArr[0]; } 0335 0336 int NbEdges() const { return myNbShapesArr[1]; } 0337 0338 int NbWires() const { return myNbShapesArr[2]; } 0339 0340 int NbFaces() const { return myNbShapesArr[3]; } 0341 0342 int NbShells() const { return myNbShapesArr[4]; } 0343 0344 int NbSolids() const { return myNbShapesArr[5]; } 0345 0346 int NbCompsolids() const { return myNbShapesArr[6]; } 0347 0348 int NbCompounds() const { return myNbShapesArr[7]; } 0349 0350 int& NbVertices() { return myNbShapesArr[0]; } 0351 0352 int& NbEdges() { return myNbShapesArr[1]; } 0353 0354 int& NbWires() { return myNbShapesArr[2]; } 0355 0356 int& NbFaces() { return myNbShapesArr[3]; } 0357 0358 int& NbShells() { return myNbShapesArr[4]; } 0359 0360 int& NbSolids() { return myNbShapesArr[5]; } 0361 0362 int& NbCompsolids() { return myNbShapesArr[6]; } 0363 0364 int& NbCompounds() { return myNbShapesArr[7]; } 0365 0366 private: 0367 int myNbShapesArr[8]; 0368 }; 0369 0370 protected: 0371 //! Compute number of shapes of certain type participating in operation 0372 Standard_EXPORT NbShapes getNbShapes() const; 0373 0374 //! Filling steps for constant operations 0375 Standard_EXPORT void fillPIConstants(const double theWhole, 0376 BOPAlgo_PISteps& theSteps) const override; 0377 0378 //! Filling steps for all other operations 0379 Standard_EXPORT void fillPISteps(BOPAlgo_PISteps& theSteps) const override; 0380 0381 protected: //! @name Methods for building the result 0382 //! Performs the building of the result. 0383 //! The method calls the PerformInternal1() method surrounded by a try-catch block. 0384 Standard_EXPORT virtual void PerformInternal(const BOPAlgo_PaveFiller& thePF, 0385 const Message_ProgressRange& theRange); 0386 0387 //! Performs the building of the result. 0388 //! To build the result of any other operation 0389 //! it will be necessary to override this method. 0390 Standard_EXPORT virtual void PerformInternal1(const BOPAlgo_PaveFiller& thePF, 0391 const Message_ProgressRange& theRange); 0392 0393 //! Builds the result of operation. 0394 //! The method is called for each of the arguments type and 0395 //! adds into the result the splits of the arguments of that type. 0396 Standard_EXPORT virtual void BuildResult(const TopAbs_ShapeEnum theType); 0397 0398 protected: //! @name Checking input arguments 0399 //! Checks the input data. 0400 Standard_EXPORT void CheckData() override; 0401 0402 //! Checks if the intersection algorithm has Errors/Warnings. 0403 Standard_EXPORT void CheckFiller(); 0404 0405 //! Prepares the result shape by making it empty compound. 0406 Standard_EXPORT virtual void Prepare(); 0407 0408 protected: //! @name Fill Images of VERTICES 0409 //! Fills the images of vertices. 0410 Standard_EXPORT void FillImagesVertices(const Message_ProgressRange& theRange); 0411 0412 protected: //! @name Fill Images of EDGES 0413 //! Fills the images of edges. 0414 Standard_EXPORT void FillImagesEdges(const Message_ProgressRange& theRange); 0415 0416 protected: //! @name Fill Images of CONTAINERS 0417 //! Fills the images of containers (WIRES/SHELLS/COMPSOLID). 0418 Standard_EXPORT void FillImagesContainers(const TopAbs_ShapeEnum theType, 0419 const Message_ProgressRange& theRange); 0420 0421 //! Builds the image of the given container using the splits 0422 //! of its sub-shapes. 0423 Standard_EXPORT void FillImagesContainer(const TopoDS_Shape& theS, 0424 const TopAbs_ShapeEnum theType); 0425 0426 protected: //! @name Fill Images of FACES 0427 //! Fills the images of faces. 0428 //! The method consists of three steps: 0429 //! 1. Build the splits of faces; 0430 //! 2. Find SD faces; 0431 //! 3. Add internal vertices (if any) to faces. 0432 Standard_EXPORT void FillImagesFaces(const Message_ProgressRange& theRange); 0433 0434 //! Builds the splits of faces using the information from the 0435 //! intersection stage stored in Data Structure. 0436 Standard_EXPORT virtual void BuildSplitFaces(const Message_ProgressRange& theRange); 0437 0438 //! Looks for the same domain faces among the splits of the faces. 0439 //! Updates the map of images with SD faces. 0440 Standard_EXPORT void FillSameDomainFaces(const Message_ProgressRange& theRange); 0441 0442 //! Classifies the alone vertices on faces relatively its splits 0443 //! and adds them as INTERNAL into the splits. 0444 Standard_EXPORT void FillInternalVertices(const Message_ProgressRange& theRange); 0445 0446 protected: //! @name Fill Images of SOLIDS 0447 //! Fills the images of solids. 0448 //! The method consists of four steps: 0449 //! 1. Build the draft solid - just rebuild the solid using the splits of faces; 0450 //! 2. Find faces from other arguments located inside the solids; 0451 //! 3. Build splits of solid using the inside faces; 0452 //! 4. Fill internal shapes for the splits (Wires and vertices). 0453 Standard_EXPORT void FillImagesSolids(const Message_ProgressRange& theRange); 0454 0455 //! Builds the draft solid by rebuilding the shells of the solid 0456 //! with the splits of faces. 0457 Standard_EXPORT void BuildDraftSolid(const TopoDS_Shape& theSolid, 0458 TopoDS_Shape& theDraftSolid, 0459 NCollection_List<TopoDS_Shape>& theLIF); 0460 0461 //! Finds faces located inside each solid. 0462 Standard_EXPORT virtual void FillIn3DParts( 0463 NCollection_DataMap<TopoDS_Shape, TopoDS_Shape, TopTools_ShapeMapHasher>& theDraftSolids, 0464 const Message_ProgressRange& theRange); 0465 0466 //! Builds the splits of the solids using their draft versions 0467 //! and faces located inside. 0468 Standard_EXPORT void BuildSplitSolids( 0469 NCollection_DataMap<TopoDS_Shape, TopoDS_Shape, TopTools_ShapeMapHasher>& theDraftSolids, 0470 const Message_ProgressRange& theRange); 0471 0472 //! Classifies the vertices and edges from the arguments relatively 0473 //! splits of solids and makes them INTERNAL for solids. 0474 Standard_EXPORT void FillInternalShapes(const Message_ProgressRange& theRange); 0475 0476 protected: //! @name Fill Images of COMPOUNDS 0477 //! Fills the images of compounds. 0478 Standard_EXPORT void FillImagesCompounds(const Message_ProgressRange& theRange); 0479 0480 //! Builds the image of the given compound. 0481 Standard_EXPORT void FillImagesCompound( 0482 const TopoDS_Shape& theS, 0483 NCollection_Map<TopoDS_Shape, TopTools_ShapeMapHasher>& theMF); 0484 0485 protected: //! @name Post treatment 0486 //! Post treatment of the result of the operation. 0487 //! The method checks validity of the sub-shapes of the result 0488 //! and updates the tolerances to make them valid. 0489 Standard_EXPORT virtual void PostTreat(const Message_ProgressRange& theRange); 0490 0491 protected: //! @name Fields 0492 NCollection_List<TopoDS_Shape> myArguments; //!< Arguments of the operation 0493 // clang-format off 0494 NCollection_Map<TopoDS_Shape, TopTools_ShapeMapHasher> myMapFence; //!< Fence map providing the uniqueness of the shapes in the list of arguments 0495 BOPAlgo_PPaveFiller myPaveFiller; //!< Pave Filler - algorithm for sub-shapes intersection 0496 BOPDS_PDS myDS; //!< Data Structure - holder of intersection information 0497 occ::handle<IntTools_Context> myContext; //!< Context - tool for cashing heavy algorithms such as Projectors and Classifiers 0498 int myEntryPoint; //!< EntryPoint - controls the deletion of the PaveFiller, which could live longer than the Builder 0499 NCollection_DataMap<TopoDS_Shape, NCollection_List<TopoDS_Shape>, TopTools_ShapeMapHasher> myImages; //!< Images - map of Images of the sub-shapes of arguments 0500 NCollection_DataMap<TopoDS_Shape, TopoDS_Shape, TopTools_ShapeMapHasher> myShapesSD; //!< ShapesSD - map of SD Shapes 0501 NCollection_DataMap<TopoDS_Shape, NCollection_List<TopoDS_Shape>, TopTools_ShapeMapHasher> myOrigins; //!< Origins - map of Origins, back map of Images 0502 NCollection_DataMap<TopoDS_Shape, NCollection_List<TopoDS_Shape>, TopTools_ShapeMapHasher> myInParts; //!< InParts - map of own and acquired IN faces of the arguments solids 0503 bool myNonDestructive; //!< Safe processing option allows avoiding modification of the input shapes 0504 BOPAlgo_GlueEnum myGlue; //!< Gluing option allows speeding up the intersection of the input shapes 0505 bool myCheckInverted; //!< Check inverted option allows disabling the check of input solids on inverted status 0506 // clang-format on 0507 }; 0508 0509 #endif // _BOPAlgo_Builder_HeaderFile
| [ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
|
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |
|