Files
geant4/source/geometry/solids/BREPS/src/G4SurfaceList.cc
T
2016-06-08 15:28:20 +02:00

250 lines
4.2 KiB
C++

// This code implementation is the intellectual property of
// the GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4SurfaceList.cc,v 1.1.10.1 1999/12/07 20:48:27 gunter Exp $
// GEANT4 tag $Name: geant4-01-00 $
//
#include "G4SurfaceList.hh"
G4SurfaceList::G4SurfaceList()
{
first = index = last = (G4Surface*)0;
number_of_elements=0;
}
G4SurfaceList::~G4SurfaceList() { EmptyList(); }
void G4SurfaceList::MoveToFirst(G4Surface* srf)
{
if(number_of_elements)
{
RemovePointer();
srf->next = first;
first = srf;
index=first;
number_of_elements++;
}
}
void G4SurfaceList::AddSurface(G4Surface* srf)
{
if(first == (G4Surface*)0)
{
index = srf;
first = srf;
last = srf;
first->next = (G4Surface*)0;
}
else
{
srf->next = last->next;
last->next = srf;
last = last->next;
}
number_of_elements++;
index=first;
}
G4Surface* G4SurfaceList::GetSurface()
{
return index;
}
G4Surface* G4SurfaceList::GetSurface(int number)
{
index = first;
for(int a=0;a<number;a++)
Step();
return index;
}
G4Surface* G4SurfaceList::GetLastSurface()
{
return last;
}
void G4SurfaceList::RemoveSurface(G4Surface* srf)
{
if(srf!=(G4Surface*)0)
{
number_of_elements--;
temp = first;
if(srf == first)
{
first=first->next;
index = first;
if(number_of_elements == 0)last = first;
delete srf;
return;
}
else
{
while(temp->next != srf) temp = temp->next;
index = srf->next;
temp->next = index;
if(srf == last) last = temp;
index = first;
delete srf;
}
}
}
void G4SurfaceList::RemovePointer()
{
// Remove the current pointer from the List
// Do not delete the object itself
if(number_of_elements)
if(first != index)
{
temp = first;
// Find previous
while(temp->next != index) temp = temp->next;
// Hop over the one to be removed
temp->next = index->next;
// Correct the index pointer
index = temp->next;
}
else
{
// Hop over the first
first = first->next;
index = first;
}
number_of_elements--;
}
void G4SurfaceList::EmptyList()
{
//Deletes all surfaces in List
while (first != (G4Surface*)0)
{
temp = first;
first = first->next;
delete temp;
number_of_elements--;
}
last = index = first;
}
void G4SurfaceList::MoveToFirst()
{
index = first;
}
void G4SurfaceList::Step()
{
if(index!=(G4Surface*)0)
index = index->next;
}
void G4SurfaceList::G4SortList()
{
if(number_of_elements == 1) return;
// First create a vector of the surface distances
// to the ray origin
G4Surface** distances = new G4Surface*[number_of_elements];
int x = 0;
MoveToFirst();
// Copy surface pointers to vector
if(number_of_elements > 1)
{
while(x < number_of_elements)
{
distances[x] = index;
index = index->next;
x++;
}
MoveToFirst();
// Sort List of pointers using quick G4Sort
QuickG4Sort( distances, 0, number_of_elements-1 );
// Organize the linked List of surfaces according
// to the quickG4Sorted List.
x = 0;
first = distances[x];
last = first;
x++;
while (x < number_of_elements)
{
last->next = distances[x];
last = last ->next;
x++;
}
last->next = (G4Surface*)0;
MoveToFirst();
}
delete[] distances;
}
void G4SurfaceList::QuickG4Sort(G4Surface** Dist, int left, int right)
{
register int i=left;
register int j=right;
G4Surface* elem1;
G4Surface* elem2 = Dist[(left+right)/2];
do
{
while ( (Dist[i]->Distance() < elem2->Distance()) && (i < right) )
i++;
while ( (elem2->Distance() < Dist[j]->Distance()) && (j > left))
j--;
if(i<=j)
{
elem1 = Dist[i];
Dist[i] = Dist[j];
Dist[j] = elem1;
i++;
j--;
}
} while (i<=j);
if( left < j )
QuickG4Sort(Dist, left, j );
if( i < right )
QuickG4Sort(Dist, i, right);
}