Increment OCCT version up to 7.4.0
[occt.git] / src / NCollection / NCollection_BaseMap.cxx
1 // Created on: 2002-04-18
2 // Created by: Alexander KARTOMIN (akm)
3 // Copyright (c) 2002-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 // Purpose:     Implementation of the BaseMap class
17
18 #include <NCollection_BaseMap.hxx>
19 #include <TCollection.hxx>
20
21 //=======================================================================
22 //function : BeginResize
23 //purpose  : 
24 //=======================================================================
25
26 Standard_Boolean  NCollection_BaseMap::BeginResize
27   (const Standard_Integer  NbBuckets,
28    Standard_Integer&       N,
29    NCollection_ListNode**& data1,
30    NCollection_ListNode**& data2) const 
31 {
32   // get next size for the buckets array
33   N = NextPrimeForMap(NbBuckets);
34   if (N <= myNbBuckets)
35   {
36     if (!myData1)
37       N = myNbBuckets;
38     else
39       return Standard_False;
40   }
41   data1 = (NCollection_ListNode **)
42     myAllocator->Allocate((N+1)*sizeof(NCollection_ListNode *));
43   memset(data1, 0, (N+1)*sizeof(NCollection_ListNode *));
44   if (isDouble) 
45   {
46     data2 = (NCollection_ListNode **)
47       myAllocator->Allocate((N+1)*sizeof(NCollection_ListNode *));
48     memset(data2, 0, (N+1)*sizeof(NCollection_ListNode *));
49   }
50   else
51     data2 = NULL;
52   return Standard_True;
53 }
54
55 //=======================================================================
56 //function : EndResize
57 //purpose  : 
58 //=======================================================================
59
60 void  NCollection_BaseMap::EndResize
61   (const Standard_Integer theNbBuckets,
62    const Standard_Integer N,
63    NCollection_ListNode** data1,
64    NCollection_ListNode** data2)
65 {
66   (void )theNbBuckets; // obsolete parameter
67   if (myData1) 
68     myAllocator->Free(myData1);
69   if (myData2) 
70     myAllocator->Free(myData2);
71   myNbBuckets = N;
72   myData1 = data1;
73   myData2 = data2;
74 }
75
76
77 //=======================================================================
78 //function : Destroy
79 //purpose  : 
80 //=======================================================================
81
82 void  NCollection_BaseMap::Destroy (NCollection_DelMapNode fDel,
83                                     Standard_Boolean doReleaseMemory)
84 {
85   if (!IsEmpty()) 
86   {
87     Standard_Integer i;
88     NCollection_ListNode** data = (NCollection_ListNode**) myData1;
89     NCollection_ListNode *p,*q;
90     for (i = 0; i <= NbBuckets(); i++) 
91     {
92       if (data[i]) 
93       {
94         p = data[i];
95         while (p) 
96         {
97           q = (NCollection_ListNode*)p->Next();
98           fDel (p, myAllocator);
99           p = q;
100         }
101         data[i] = NULL;
102       }
103     }
104   }
105
106   mySize = 0;
107   if (doReleaseMemory)
108   {
109     if (myData1) 
110       myAllocator->Free(myData1);
111     if (isDouble && myData2) 
112       myAllocator->Free(myData2);
113     myData1 = myData2 = NULL;
114   }
115 }
116
117
118 //=======================================================================
119 //function : Statistics
120 //purpose  : 
121 //=======================================================================
122
123 void NCollection_BaseMap::Statistics(Standard_OStream& S) const
124 {
125   S <<"\nMap Statistics\n---------------\n\n";
126   S <<"This Map has "<<myNbBuckets<<" Buckets and "<<mySize<<" Keys\n\n";
127   
128   if (mySize == 0) return;
129
130   // compute statistics on 1
131   Standard_Integer * sizes = new Standard_Integer [mySize+1];
132   Standard_Integer i,l,nb;
133   NCollection_ListNode* p;
134   NCollection_ListNode** data;
135   
136   S << "\nStatistics for the first Key\n";
137   for (i = 0; i <= mySize; i++) sizes[i] = 0;
138   data = (NCollection_ListNode **) myData1;
139   nb = 0;
140   for (i = 0; i <= myNbBuckets; i++) 
141   {
142     l = 0;
143     p = data[i];
144     if (p) nb++;
145     while (p) 
146     {
147       l++;
148       p = p->Next();
149     }
150     sizes[l]++;
151   }
152
153   // display results
154   l = 0;
155   for (i = 0; i<= mySize; i++) 
156   {
157     if (sizes[i] > 0) 
158     {
159       l += sizes[i] * i;
160       S << std::setw(5) << sizes[i] <<" buckets of size "<<i<<"\n";
161     }
162   }
163
164   Standard_Real mean = ((Standard_Real) l) / ((Standard_Real) nb);
165   S<<"\n\nMean of length : "<<mean<<"\n";
166
167   delete [] sizes;
168 }
169
170 //=======================================================================
171 //function : NextPrimeForMap
172 //purpose  : 
173 //=======================================================================
174
175 Standard_Integer NCollection_BaseMap::NextPrimeForMap
176   (const Standard_Integer N) const
177 {
178   return TCollection::NextPrimeForMap ( N );
179 }
180