// File generated by CPPExt (Value)
//
//                     Copyright (C) 1991 - 2000 by  
//                      Matra Datavision SA.  All rights reserved.
//  
//                     Copyright (C) 2001 - 2004 by
//                     Open CASCADE SA.  All rights reserved.
// 
// This file is part of the Open CASCADE Technology software.
//
// This software may be distributed and/or modified under the terms and
// conditions of the Open CASCADE Public License as defined by Open CASCADE SA
// and appearing in the file LICENSE included in the packaging of this file.
//  
// This software is distributed on an "AS IS" basis, without warranty of any
// kind, and Open CASCADE SA hereby disclaims all such warranties,
// including without limitation, any warranties of merchantability, fitness
// for a particular purpose or non-infringement. Please see the License for
// the specific terms and conditions governing rights and limitations under the
// License.

#ifndef _BooleanOperations_ShapesDataStructure_HeaderFile
#define _BooleanOperations_ShapesDataStructure_HeaderFile

#ifndef _BooleanOperations_PShapeAndInterferences_HeaderFile
#include <BooleanOperations_PShapeAndInterferences.hxx>
#endif
#ifndef _Standard_Integer_HeaderFile
#include <Standard_Integer.hxx>
#endif
#ifndef _TopoDS_Shape_HeaderFile
#include <TopoDS_Shape.hxx>
#endif
#ifndef _BooleanOperations_IndexedDataMapOfShapeInteger_HeaderFile
#include <BooleanOperations_IndexedDataMapOfShapeInteger.hxx>
#endif
#ifndef _BOPTColStd_CArray1OfInteger_HeaderFile
#include <BOPTColStd_CArray1OfInteger.hxx>
#endif
#ifndef _Standard_OStream_HeaderFile
#include <Standard_OStream.hxx>
#endif
#ifndef _TopAbs_ShapeEnum_HeaderFile
#include <TopAbs_ShapeEnum.hxx>
#endif
#ifndef _BooleanOperations_StateOfShape_HeaderFile
#include <BooleanOperations_StateOfShape.hxx>
#endif
#ifndef _Standard_Address_HeaderFile
#include <Standard_Address.hxx>
#endif
#ifndef _Standard_Boolean_HeaderFile
#include <Standard_Boolean.hxx>
#endif
#ifndef _TopAbs_Orientation_HeaderFile
#include <TopAbs_Orientation.hxx>
#endif
class BooleanOperations_Explorer;
class BooleanOperations_OnceExplorer;
class TopoDS_Shape;
class BooleanOperations_AncestorsSeqAndSuccessorsSeq;
class BooleanOperations_IndexedDataMapOfShapeAncestorsSuccessors;
class Bnd_Box;
class BooleanOperations_ShapeAndInterferences;
class BooleanOperations_IndexedDataMapOfShapeInteger;


#ifndef _Standard_HeaderFile
#include <Standard.hxx>
#endif
#ifndef _Standard_Macro_HeaderFile
#include <Standard_Macro.hxx>
#endif


class BooleanOperations_ShapesDataStructure  {

public:

    void* operator new(size_t,void* anAddress) 
      {
        return anAddress;
      }
    void* operator new(size_t size) 
      { 
        return Standard::Allocate(size); 
      }
    void  operator delete(void *anAddress) 
      { 
        if (anAddress) Standard::Free((Standard_Address&)anAddress); 
      }
 // Methods PUBLIC
 // 


Standard_EXPORT BooleanOperations_ShapesDataStructure();
Standard_EXPORT virtual ~BooleanOperations_ShapesDataStructure();


Standard_EXPORT BooleanOperations_ShapesDataStructure(const TopoDS_Shape& Object,const TopoDS_Shape& Tool);

//! fill  a line of the  data structure, the shift is used <br>
//!          for the numbers of the shapes of the Tool. <br>
Standard_EXPORT   void InsertShapeAndAncestorsSuccessors(const TopoDS_Shape& S,const BooleanOperations_AncestorsSeqAndSuccessorsSeq& AncSuc,const Standard_Integer shift = 0) ;

//! to find the   data  structure we first decompose  the <br>
//!          Object and Tool in the indexed data map of shapes. <br>
Standard_EXPORT   void FillIndexedMapOfShapesAncestorsAndSuccessors(const TopoDS_Shape& Sha,BooleanOperations_IndexedDataMapOfShapeAncestorsSuccessors& IndDatMap) const;

//! to  find all the subshapes  of  Sha and  store them in <br>
//!          IndDatMap if they had not been already taken into account. <br>
Standard_EXPORT   void FindSubshapes(const TopoDS_Shape& Sha,Standard_Integer& TotalNumberOfShapes,BooleanOperations_IndexedDataMapOfShapeAncestorsSuccessors& IndDatMap) const;

//!  dump the content of the fields. <br>
Standard_EXPORT   void Dump(Standard_OStream& S) const;

//!  dump the types of the shapes. <br>
Standard_EXPORT   void LightDump(Standard_OStream& S) const;


Standard_EXPORT  const TopoDS_Shape& GetShape(const Standard_Integer index) const;


Standard_EXPORT  const TopoDS_Shape& Shape(const Standard_Integer anIndex) const;


Standard_EXPORT   TopAbs_ShapeEnum GetShapeType(const Standard_Integer index) const;


Standard_EXPORT  const Bnd_Box& GetBoundingBox(const Standard_Integer index) const;


Standard_EXPORT   BooleanOperations_StateOfShape GetState(const Standard_Integer index) const;


Standard_EXPORT   void SetState(const Standard_Integer index,const BooleanOperations_StateOfShape theState) ;


Standard_EXPORT   Standard_Integer GetAncestor(const Standard_Integer index,const Standard_Integer ancestorNumber) const;


Standard_EXPORT   Standard_Integer GetSuccessor(const Standard_Integer index,const Standard_Integer successorNumber) const;


Standard_EXPORT   void GetAncestors(const Standard_Integer index,Standard_Address& theArrayOfAncestors,Standard_Integer& AncestorsSize) const;


Standard_EXPORT   void GetSuccessors(const Standard_Integer index,Standard_Address& theArrayOfSuccessors,Standard_Integer& SuccessorsSize) const;


Standard_EXPORT   Standard_Integer NumberOfAncestors(const Standard_Integer index) const;


Standard_EXPORT   Standard_Integer NumberOfSuccessors(const Standard_Integer index) const;


Standard_EXPORT   Standard_Integer NumberOfShapesOfTheTool() const;


Standard_EXPORT   Standard_Integer NumberOfShapesOfTheObject() const;


Standard_EXPORT   Standard_Integer NumberOfSourceShapes() const;


Standard_EXPORT   Standard_Boolean IsNewShape(const Standard_Integer index) const;


Standard_EXPORT   Standard_Integer NumberOfInsertedShapes() const;


Standard_EXPORT   Standard_Integer NumberOfNewShapes() const;


Standard_EXPORT  const BooleanOperations_ShapeAndInterferences& Line(const Standard_Integer index) const;


Standard_EXPORT  const BooleanOperations_IndexedDataMapOfShapeInteger& ShapeIndexMap(const Standard_Integer iRank) const;


Standard_EXPORT virtual  Standard_Integer ShapeIndex(const TopoDS_Shape& aS,const Standard_Integer iRank) const;


Standard_EXPORT  const TopoDS_Shape& Object() const;


Standard_EXPORT  const TopoDS_Shape& Tool() const;


Standard_EXPORT   void ObjectRange(Standard_Integer& iFirst,Standard_Integer& iLast) const;


Standard_EXPORT   void ToolRange(Standard_Integer& iFirst,Standard_Integer& iLast) const;


Standard_EXPORT virtual  Standard_Integer Rank(const Standard_Integer anIndex) const;

//! for given index "anIndex" of an edge in DS get <br>
//!         reference index of an edge <br>
Standard_EXPORT   Standard_Integer RefEdge(const Standard_Integer anIndex) const;

//! returns number of edges from source shapes <br>
Standard_EXPORT   Standard_Integer NbEdges() const;


Standard_EXPORT   TopAbs_Orientation GetOrientation(const Standard_Integer index,const Standard_Integer successorNumber) const;


Standard_EXPORT   void GetOrientations(const Standard_Integer index,Standard_Address& theArrayOfOrientations,Standard_Integer& OrientationsSize) const;


friend class BooleanOperations_Explorer;
friend class BooleanOperations_OnceExplorer;



protected:

 // Methods PROTECTED
 // 


Standard_EXPORT   void Destroy() ;


 // Fields PROTECTED
 //
BooleanOperations_PShapeAndInterferences myListOfShapeAndInterferences;
Standard_Integer myNumberOfShapesOfTheObject;
Standard_Integer myNumberOfShapesOfTheTool;
Standard_Integer myNumberOfInsertedShapes;
Standard_Integer myLength;
TopoDS_Shape myObject;
TopoDS_Shape myTool;
BooleanOperations_IndexedDataMapOfShapeInteger myShapeIndexMapObj;
BooleanOperations_IndexedDataMapOfShapeInteger myShapeIndexMapTool;
BOPTColStd_CArray1OfInteger myRefEdges;
Standard_Integer myNbEdges;


private: 

 // Methods PRIVATE
 // 


Standard_EXPORT   void ReInit() ;


 // Fields PRIVATE
 //


};





// other Inline functions and methods (like "C++: function call" methods)
//


#endif
