0026377: Passing Handle objects as arguments to functions as non-const reference...
[occt.git] / src / IFSelect / IFSelect_PacketList.cxx
1 // Created on: 1994-09-02
2 // Created by: Christian CAILLET
3 // Copyright (c) 1994-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <IFSelect_PacketList.hxx>
19 #include <Interface_EntityIterator.hxx>
20 #include <Interface_InterfaceError.hxx>
21 #include <Interface_InterfaceModel.hxx>
22 #include <Standard_Transient.hxx>
23 #include <Standard_Type.hxx>
24 #include <TColStd_HSequenceOfInteger.hxx>
25
26 IMPLEMENT_STANDARD_RTTIEXT(IFSelect_PacketList,MMgt_TShared)
27
28 IFSelect_PacketList::IFSelect_PacketList
29   (const Handle(Interface_InterfaceModel)& model)
30     : thedupls (0,model->NbEntities()) , 
31       thepacks (100) ,
32       theflags (0,model->NbEntities()) ,
33       thename  ("Packets")
34 {
35   themodel = model;  thelast = 0;  thebegin = Standard_False;  // begin-begin
36   thedupls.Init(0);  theflags.Init(0);
37 }
38
39     void  IFSelect_PacketList::SetName (const Standard_CString name)
40       {  thename.Clear();  thename.AssignCat (name);  }
41
42     Standard_CString  IFSelect_PacketList::Name () const
43       {  return thename.ToCString();  }
44
45     Handle(Interface_InterfaceModel)  IFSelect_PacketList::Model () const
46       {  return themodel;  }
47
48     void  IFSelect_PacketList::AddPacket ()
49 {
50   Standard_Integer nbl = thepacks.NbEntities();
51   Standard_Integer nbe = theflags.Upper();
52   for (Standard_Integer i = 1; i <= nbe; i ++) theflags.SetValue(i,0);
53
54   if (thelast >= nbl) thepacks.SetNbEntities (nbl*2);
55
56   if (!thebegin) thelast ++;
57   thepacks.SetNumber (thelast);
58   thebegin = Standard_False;
59 }
60
61
62     void  IFSelect_PacketList::Add
63   (const Handle(Standard_Transient)& ent)
64 {
65   Standard_Integer num = themodel->Number(ent);
66   if (num == 0) Interface_InterfaceError::Raise
67     ("PacketList:Add, Entity not in Model");
68   if (thelast == 0) Interface_InterfaceError::Raise
69     ("PacketList:Add, no Packet yet added");
70   if (theflags(num) != 0) return;
71   theflags(num) = 1;
72   thedupls(num) ++;
73   thepacks.Add(num);
74   thebegin = Standard_False;
75 }
76
77     void  IFSelect_PacketList::AddList
78   (const Handle(TColStd_HSequenceOfTransient)& list)
79 {
80   if (list.IsNull()) return;
81   Standard_Integer i , nb = list->Length();
82   thepacks.Reservate (nb+1);
83   for (i = 1; i <= nb; i ++) Add (list->Value(i));
84 }
85
86
87     Standard_Integer  IFSelect_PacketList::NbPackets () const
88       {  return (thebegin ? thelast-1 : thelast);  }
89
90     Standard_Integer  IFSelect_PacketList::NbEntities
91   (const Standard_Integer numpack) const
92 {
93   if (numpack <= 0 || numpack > NbPackets()) return 0;
94   Interface_IntList lisi(thepacks,Standard_False);  lisi.SetNumber (numpack);
95   return lisi.Length();
96 }
97
98     Interface_EntityIterator  IFSelect_PacketList::Entities
99   (const Standard_Integer numpack) const
100 {
101   Interface_EntityIterator list;
102   if (numpack <= 0 || numpack > NbPackets()) return list;
103   Interface_IntList lisi(thepacks,Standard_False);  lisi.SetNumber (numpack);
104   Standard_Integer i , nb = lisi.Length();
105   for (i = 1; i <= nb; i ++)
106     list.AddItem(themodel->Value(lisi.Value(i)));
107   return list;
108 }
109
110     Standard_Integer  IFSelect_PacketList::HighestDuplicationCount () const
111 {
112   Standard_Integer i , nb = themodel->NbEntities();
113   Standard_Integer high = 0;
114   for (i = 1; i <= nb; i ++) {
115     Standard_Integer j = thedupls.Value(i);
116     if (j > high) high = j;
117   }
118   return high;
119 }
120
121     Standard_Integer  IFSelect_PacketList::NbDuplicated
122   (const Standard_Integer newcount, const Standard_Boolean andmore) const
123 {
124   Standard_Integer i, nb = themodel->NbEntities();
125   Standard_Integer nbdu = 0;
126
127   for (i = 1; i <= nb; i ++) {
128     Standard_Integer j = thedupls.Value(i);
129     if (j == newcount || (j > newcount && andmore)) nbdu ++;
130   }
131   return nbdu;
132 }
133
134     Interface_EntityIterator  IFSelect_PacketList::Duplicated
135   (const Standard_Integer newcount, const Standard_Boolean andmore) const
136 {
137   Standard_Integer nb = themodel->NbEntities();
138   Interface_EntityIterator list;
139
140   Standard_Integer i;
141   for (i = 1; i <= nb; i ++) {
142     Standard_Integer j = thedupls.Value(i);
143     if (j == newcount || (j > newcount && andmore)) list.AddItem(themodel->Value(i));
144   }
145   return list;
146 }