1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-07 18:30:55 +03:00
occt/src/NCollection/NCollection_SparseArray.hxx
abv 8e8070c47d 0025000: Missing implementation of method NCollection_SparseArrayBase::changeValue()
Method changeValue() removed from NCollection_SparseArrayBase, ChangeValue() of NCollection_SparseArray is used instead
2014-09-26 17:29:01 +04:00

274 lines
7.2 KiB
C++

// Created on: 2006-11-23
// Created by: Andrey BETENEV
// Copyright (c) 2006-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef NCollection_SparseArray_HeaderFile
#define NCollection_SparseArray_HeaderFile
#include <NCollection_SparseArrayBase.hxx>
/**
* Dynamically resizable sparse array of objects
*
* This class is similar to NCollection_Vector: it works like virtually
* unlimited array of items accessible by index; however unlike simple
* Vector it distinguishes items that have been set from the ones that
* have not been set explicitly.
*
* This class can be also seen as equivalence of
* NCollection_DataMap<Standard_Integer,TheItemType>
* with the only one practical difference: it can be much less
* memory-expensive if items are small (e.g. Integer or Handle).
*
* The index starts from 0, i.e. should be non-negative. Memory is allocated
* when item is set by SetValue().
*
* Iterator returns only defined items;
* the item can be tested for being defined by IsSet(),
* and undefined by UnsetValue().
*
* The attempt to access the item that has not been set will result
* in OutOfRange exception in Debug mode; in Release mode this will either
* return null-filled object or cause access violation.
*/
template <class TheItemType> class NCollection_SparseArray
: public NCollection_SparseArrayBase
{
public:
//! Constructor; accepts size of blocks
NCollection_SparseArray (Standard_Size theIncrement)
: NCollection_SparseArrayBase(sizeof(TheItemType),theIncrement)
{
}
//! Explicit assignment operator
NCollection_SparseArray& Assign (const NCollection_SparseArray& theOther)
{
this->assign (theOther);
return *this;
}
//! Exchange the data of two arrays;
//! can be used primarily to move contents of theOther into the new array
//! in a fast way (without creation of duplicated data)
void Exchange (NCollection_SparseArray& theOther)
{
this->exchange (theOther);
}
//! Destructor
virtual ~NCollection_SparseArray ()
{
Clear();
}
public:
//!@name Array-like interface (in addition to inherited methods)
//!@{
//! Direct const access to the item
const TheItemType& Value (const Standard_Size theIndex) const
{
return *(const TheItemType*)this->getValue(theIndex);
}
//! Const access to the item - operator()
const TheItemType& operator () (const Standard_Size theIndex) const
{
return Value (theIndex);
}
//! Modification access to the item
TheItemType& ChangeValue (const Standard_Size theIndex)
{
return *(TheItemType*)(this->getValue (theIndex));
}
//! Access to the item - operator()
TheItemType& operator () (const Standard_Size theIndex)
{
return ChangeValue (theIndex);
}
//! Set a value at specified index method
TheItemType& SetValue (const Standard_Size theIndex,
const TheItemType& theValue)
{
return *(TheItemType*)this->setValue(theIndex, (Standard_Address)&theValue);
}
//!@}
public:
//!@name DataMap-like interface
//!@{
//! Returns number of items in the array
Standard_Size Extent () const
{
return Size();
}
//! Returns True if array is empty
Standard_Boolean IsEmpty () const
{
return Size() == 0;
}
//! Direct const access to the item
const TheItemType& Find (const Standard_Size theIndex) const
{
return Value(theIndex);
}
//! Modification access to the item
TheItemType& ChangeFind (const Standard_Size theIndex)
{
return ChangeValue(theIndex);
}
//! Set a value as explicit method
TheItemType& Bind (const Standard_Size theIndex,
const TheItemType& theValue)
{
return SetValue(theIndex, theValue);
}
//! Returns True if the item is defined
Standard_Boolean IsBound (const Standard_Size theIndex) const
{
return this->HasValue(theIndex);
}
//! Remove the item from array
Standard_Boolean UnBind (const Standard_Size theIndex)
{
return this->UnsetValue(theIndex);
}
//!@}
public:
// Iterator interface
/**
* Implementation of type-specific const Iterator class
*/
class ConstIterator : public NCollection_SparseArrayBase::Iterator
{
public:
//! Empty constructor - for later Init
ConstIterator () {}
//! Constructor with initialisation
ConstIterator (const NCollection_SparseArray& theVector) :
NCollection_SparseArrayBase::Iterator (&theVector) {}
//! Initialisation
void Init (const NCollection_SparseArray& theVector)
{
this->init (&theVector);
}
//! Constant value access
const TheItemType& Value (void) const
{
return *(const TheItemType*)this->value();
}
//! Constant value access operator
const TheItemType& operator () (void) const
{
return *(const TheItemType*)this->value();
}
//! Access current index with 'a-la map' interface
Standard_Size Key (void) const { return Index(); }
};
/**
* Implementation of type-specific non-const Iterator class
*/
class Iterator : public ConstIterator
{
public:
//! Empty constructor - for later Init
Iterator () {}
//! Constructor with initialisation
Iterator (NCollection_SparseArray& theVector) :
ConstIterator (theVector) {}
//! Initialisation
void Init (const NCollection_SparseArray& theVector)
{
this->init (&theVector);
}
//! Value access
TheItemType& ChangeValue (void)
{
return *(TheItemType*)this->value();
}
//! Value access operator
TheItemType& operator () (void)
{
return *(TheItemType*)this->value();
}
//! Const access operator - the same as in parent class
const TheItemType& operator () (void) const
{
return *(const TheItemType*)this->value();
}
};
private:
// Implementation of virtual methods providing type-specific behaviour
//! Create new item at the specified address with default constructor
// virtual void createItem (Standard_Address theAddress)
// {
// new (theAddress) TheItemType;
// }
//! Create new item at the specified address with copy constructor
//! from existing item
virtual void createItem (Standard_Address theAddress, Standard_Address theOther)
{
new (theAddress) TheItemType(*(const TheItemType*)theOther);
}
//! Call destructor to the item at given address
virtual void destroyItem (Standard_Address theAddress)
{
((TheItemType*)theAddress)->TheItemType::~TheItemType();
}
//! Call assignment operator to the item
virtual void copyItem (Standard_Address theAddress, Standard_Address theOther)
{
(*(TheItemType*)theAddress) = *(const TheItemType*)theOther;
}
};
#endif