1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-05 18:16:23 +03:00
occt/src/NCollection/NCollection_BaseVector.hxx
kgv 50a0744c2c 0023040: Annoying warnings in NCollection_Vector
Fixed initialization order of class members in constructors
2012-06-15 11:52:11 +04:00

213 lines
7.9 KiB
C++
Executable File

// Created on: 2002-04-24
// Created by: Alexander GRIGORIEV
// Copyright (c) 2002-2012 OPEN CASCADE SAS
//
// The content of this file is subject to the Open CASCADE Technology Public
// License Version 6.5 (the "License"). You may not use the content of this file
// except in compliance with the License. Please obtain a copy of the License
// at http://www.opencascade.org and read it completely before using this file.
//
// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
//
// The Original Code and all software distributed under the License is
// distributed on an "AS IS" basis, without warranty of any kind, and the
// Initial Developer hereby disclaims all such warranties, including without
// limitation, any warranties of merchantability, fitness for a particular
// purpose or non-infringement. Please see the License for the specific terms
// and conditions governing the rights and limitations under the License.
#ifndef NCollection_BaseVector_HeaderFile
#define NCollection_BaseVector_HeaderFile
#include <Standard_TypeDef.hxx>
#include <NCollection_BaseAllocator.hxx>
#include <stddef.h>
#if !defined No_Exception && !defined No_Standard_OutOfRange
#include <Standard_OutOfRange.hxx>
#endif
#ifdef WNT
#pragma warning(push, 1)
#pragma warning(disable:4355)
#endif
// this value defines the number of blocks that are reserved
// when the capacity of vector is increased
inline Standard_Integer GetCapacity (const Standard_Integer theIncrement)
{
return Max(theIncrement/8, 1);
}
/**
* Class NCollection_BaseVector - base for generic vector
*/
class NCollection_BaseVector
{
public:
// ------------ Class MemBlock ------------
class MemBlock {
protected:
MemBlock (NCollection_BaseAllocator* theAlloc)
: myAlloc(theAlloc),
myData(NULL),
myFirstInd(0),
myLength(0),
mySize(0) {}
MemBlock (const Standard_Integer theFirstInd,
const Standard_Integer theLength,
NCollection_BaseAllocator* theAlloc)
: myAlloc(theAlloc),
myData(NULL),
myFirstInd(theFirstInd),
myLength(0),
mySize(theLength) {}
virtual void Reinit (const Standard_Integer,
const Standard_Integer) {}
Standard_Integer FirstIndex () const { return myFirstInd; }
Standard_Integer Size () const { return mySize; }
public:
virtual ~MemBlock () {}
void SetLength (const Standard_Integer theLen)
{ myLength = theLen; }
Standard_Integer Length () const { return myLength; }
void * Find (const Standard_Integer theInd,
const size_t theSize) const
{ return ((char *) myData)+theInd*theSize;}
Standard_EXPORT Standard_Integer
GetIndexV (void * theItem, const size_t theSz) const;
protected:
NCollection_BaseAllocator* myAlloc;
void* myData;
Standard_Integer myFirstInd;
Standard_Integer myLength;
Standard_Integer mySize;
friend class NCollection_BaseVector;
};
class Iterator {
protected:
Iterator () :
myICurBlock (0), myIEndBlock (0), myCurIndex (0), myEndIndex (0) {}
Iterator (const NCollection_BaseVector& theVector) { InitV (theVector); }
Iterator (const Iterator& theVector) { CopyV (theVector); }
Standard_EXPORT void InitV (const NCollection_BaseVector& theVector);
Standard_EXPORT void CopyV (const Iterator&);
Standard_Boolean MoreV () const
{ return (myICurBlock < myIEndBlock || myCurIndex < myEndIndex); }
void NextV ()
{ if (++myCurIndex >= myVector -> myData[myICurBlock].Length() &&
myICurBlock < myIEndBlock)
{ ++myICurBlock; myCurIndex = 0; } }
const MemBlock * CurBlockV () const
{ return &myVector -> myData[myICurBlock]; }
const NCollection_BaseVector * myVector; // the Master vector
Standard_Integer myICurBlock; // # of the current block
Standard_Integer myIEndBlock;
Standard_Integer myCurIndex; // Index in the current block
Standard_Integer myEndIndex;
};
protected:
// ------------ Block initializer ---------
typedef MemBlock * (* FuncPtrDataInit) (const NCollection_BaseVector&,
const Standard_Integer aCapacity,
const void * aSource,
const Standard_Integer aSize);
typedef void (* FuncPtrDataFree) (const NCollection_BaseVector&,
MemBlock *);
friend class Iterator;
// ---------- PROTECTED METHODS ----------
//! Empty constructor
NCollection_BaseVector (const size_t theSize,
const Standard_Integer theInc,
FuncPtrDataInit theDataInit,
FuncPtrDataFree theDataFree)
: myItemSize (theSize),
myIncrement (theInc),
myLength (0),
myCapacity (GetCapacity(myIncrement)),
myNBlocks (0),
myData (theDataInit (* this, myCapacity, NULL, 0)),
myDataInit (theDataInit),
myDataFree (theDataFree)
{
// myData = (MemBlock *) new char [myCapacity * sizeof(MemBlock)];
// for (Standard_Integer i = 0; i < myCapacity; i++)
// new (&myData[i]) MemBlock;
}
//! Copy constructor
NCollection_BaseVector (const NCollection_BaseVector& theOther,
FuncPtrDataInit theDataInit,
FuncPtrDataFree theDataFree)
: myItemSize (theOther.myItemSize),
myIncrement (theOther.myIncrement),
myLength (theOther.Length()),
myCapacity (GetCapacity(myIncrement)+theOther.Length()/theOther.myIncrement),
myNBlocks (1 + (theOther.Length() - 1)/theOther.myIncrement),
myData (theDataInit (* this, myCapacity, NULL, 0)),
myDataInit (theDataInit),
myDataFree (theDataFree) {}
//! Destructor
Standard_EXPORT ~NCollection_BaseVector ();
//! Operator =
Standard_EXPORT NCollection_BaseVector& operator =
(const NCollection_BaseVector&);
//! ExpandV: returns pointer to memory where to put the new item
Standard_EXPORT void * ExpandV (const Standard_Integer theIndex);
//! Find: locate the memory holding the desired value
inline void * Find (const Standard_Integer theIndex) const;
public:
//! Total number of items
Standard_Integer Length () const { return myLength; }
//! Empty the vector of its objects
Standard_EXPORT void Clear ();
protected:
// ---------- PRIVATE FIELDS ----------
size_t myItemSize;
Standard_Integer myIncrement;
Standard_Integer myLength;
Standard_Integer myCapacity;
Standard_Integer myNBlocks;
MemBlock * myData;
FuncPtrDataInit myDataInit;
FuncPtrDataFree myDataFree;
};
//=======================================================================
//function : Find
//purpose : locate the memory holding the desired value
//=======================================================================
inline void * NCollection_BaseVector::Find
(const Standard_Integer theIndex) const
{
#if !defined No_Exception && !defined No_Standard_OutOfRange
if (theIndex < 0 || theIndex >= myLength)
Standard_OutOfRange::Raise ("NCollection_BaseVector::Find");
#endif
const Standard_Integer aBlock = theIndex / myIncrement;
return myData[aBlock].Find (theIndex - aBlock * myIncrement, myItemSize);
}
#ifdef WNT
#pragma warning(pop)
#endif
#endif