You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
3.7 KiB
182 lines
3.7 KiB
2 years ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: $RCSfile: vtkVoidArray.cxx,v $
|
||
|
|
||
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
||
|
All rights reserved.
|
||
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
||
|
|
||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
|
PURPOSE. See the above copyright notice for more information.
|
||
|
|
||
|
=========================================================================*/
|
||
|
#include "vtkVoidArray.h"
|
||
|
#include "vtkObjectFactory.h"
|
||
|
|
||
|
vtkCxxRevisionMacro(vtkVoidArray, "$Revision: 1.44 $");
|
||
|
vtkStandardNewMacro(vtkVoidArray);
|
||
|
|
||
|
typedef void *voidPtr;
|
||
|
|
||
|
// Instantiate object.
|
||
|
vtkVoidArray::vtkVoidArray()
|
||
|
: NumberOfPointers(0),Size(0),Array(NULL)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
vtkVoidArray::~vtkVoidArray()
|
||
|
{
|
||
|
if (this->Array)
|
||
|
{
|
||
|
delete [] this->Array;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Allocate memory for this array. Delete old storage only if necessary.
|
||
|
int vtkVoidArray::Allocate(vtkIdType sz, vtkIdType vtkNotUsed(ext))
|
||
|
{
|
||
|
if ( sz > this->Size || this->Array != NULL )
|
||
|
{
|
||
|
delete [] this->Array;
|
||
|
|
||
|
this->Size = ( sz > 0 ? sz : 1);
|
||
|
if ( (this->Array = new voidPtr[this->Size]) == NULL )
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this->NumberOfPointers = 0;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
// Release storage and reset array to initial state.
|
||
|
void vtkVoidArray::Initialize()
|
||
|
{
|
||
|
if ( this->Array != NULL )
|
||
|
{
|
||
|
delete [] this->Array;
|
||
|
this->Array = NULL;
|
||
|
}
|
||
|
this->Size = 0;
|
||
|
this->NumberOfPointers = 0;
|
||
|
}
|
||
|
|
||
|
// Deep copy of another void array.
|
||
|
void vtkVoidArray::DeepCopy(vtkVoidArray *va)
|
||
|
{
|
||
|
// Do nothing on a NULL input.
|
||
|
if (va == NULL)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( this != va )
|
||
|
{
|
||
|
delete [] this->Array;
|
||
|
|
||
|
this->NumberOfPointers = va->NumberOfPointers;
|
||
|
this->Size = va->Size;
|
||
|
|
||
|
this->Array = new voidPtr[this->Size];
|
||
|
memcpy(this->Array, va->GetVoidPointer(0), this->Size*sizeof(void *));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void** vtkVoidArray::WritePointer(vtkIdType id,
|
||
|
vtkIdType number)
|
||
|
{
|
||
|
vtkIdType newSize=id+number;
|
||
|
if ( newSize > this->Size )
|
||
|
{
|
||
|
this->ResizeAndExtend(newSize);
|
||
|
}
|
||
|
if ( newSize > this->NumberOfPointers )
|
||
|
{
|
||
|
this->NumberOfPointers = newSize;
|
||
|
}
|
||
|
return this->Array + id;
|
||
|
}
|
||
|
|
||
|
void vtkVoidArray::InsertVoidPointer(vtkIdType id, void* p)
|
||
|
{
|
||
|
if ( id >= this->Size )
|
||
|
{
|
||
|
this->ResizeAndExtend(id+1);
|
||
|
}
|
||
|
this->Array[id] = p;
|
||
|
if ( id >= this->NumberOfPointers )
|
||
|
{
|
||
|
this->NumberOfPointers = id+1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
vtkIdType vtkVoidArray::InsertNextVoidPointer(void* p)
|
||
|
{
|
||
|
this->InsertVoidPointer(this->NumberOfPointers,p);
|
||
|
return this->NumberOfPointers-1;
|
||
|
}
|
||
|
|
||
|
// Protected function does "reallocate"
|
||
|
//
|
||
|
void** vtkVoidArray::ResizeAndExtend(vtkIdType sz)
|
||
|
{
|
||
|
void** newArray;
|
||
|
vtkIdType newSize;
|
||
|
|
||
|
if ( sz > this->Size )
|
||
|
{
|
||
|
newSize = this->Size + sz;
|
||
|
}
|
||
|
else if (sz == this->Size)
|
||
|
{
|
||
|
return this->Array;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
newSize = sz;
|
||
|
}
|
||
|
|
||
|
if (newSize <= 0)
|
||
|
{
|
||
|
this->Initialize();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
if ( (newArray = new voidPtr[newSize]) == NULL )
|
||
|
{
|
||
|
vtkErrorMacro(<< "Cannot allocate memory\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
memcpy(newArray, this->Array,
|
||
|
(sz < this->Size ? sz : this->Size) * sizeof(voidPtr));
|
||
|
|
||
|
if (newSize < this->Size)
|
||
|
{
|
||
|
this->NumberOfPointers = newSize;
|
||
|
}
|
||
|
this->Size = newSize;
|
||
|
delete [] this->Array;
|
||
|
this->Array = newArray;
|
||
|
|
||
|
return this->Array;
|
||
|
}
|
||
|
|
||
|
void vtkVoidArray::PrintSelf(ostream& os, vtkIndent indent)
|
||
|
{
|
||
|
this->Superclass::PrintSelf(os,indent);
|
||
|
|
||
|
if (this->Array)
|
||
|
{
|
||
|
os << indent << "Array: " << this->Array << "\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
os << indent << "Array: (null)\n";
|
||
|
}
|
||
|
}
|