1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00
occt/src/Aspect/Aspect_GenId.cxx
abv 42cf5bc1ca 0024002: Overall code and build procedure refactoring -- automatic
Automatic upgrade of OCCT code by command "occt_upgrade . -nocdl":
- WOK-generated header files from inc and sources from drv are moved to src
- CDL files removed
- All packages are converted to nocdlpack
2015-07-12 07:42:38 +03:00

140 lines
4.0 KiB
C++

// Created on: 1992-05-14
// Created by: NW,JPB,CAL
// Copyright (c) 1992-1999 Matra Datavision
// Copyright (c) 1999-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.
#include <Aspect_GenId.hxx>
#include <Aspect_IdentDefinitionError.hxx>
// =======================================================================
// function : Aspect_GenId
// purpose :
// =======================================================================
Aspect_GenId::Aspect_GenId()
: myFreeCount (INT_MAX / 2 + 1),
myLength (INT_MAX / 2 + 1),
myLowerBound (0),
myUpperBound (INT_MAX / 2)
{
//
}
// =======================================================================
// function : Aspect_GenId
// purpose :
// =======================================================================
Aspect_GenId::Aspect_GenId (const Standard_Integer theLow,
const Standard_Integer theUpper)
: myFreeCount (theUpper - theLow + 1),
myLength (theUpper - theLow + 1),
myLowerBound (theLow),
myUpperBound (theUpper)
{
if (theLow > theUpper)
{
Aspect_IdentDefinitionError::Raise ("GenId Create Error: wrong interval");
}
}
// =======================================================================
// function : HasFree
// purpose :
// =======================================================================
Standard_Boolean Aspect_GenId::HasFree() const
{
return myFreeCount > 0
|| myFreeIds.Extent() > 0;
}
// =======================================================================
// function : Available
// purpose :
// =======================================================================
Standard_Integer Aspect_GenId::Available() const
{
return myFreeCount + myFreeIds.Extent();
}
// =======================================================================
// function : Free
// purpose :
// =======================================================================
void Aspect_GenId::Free()
{
myFreeCount = myLength;
myFreeIds.Clear();
}
// =======================================================================
// function : Free
// purpose :
// =======================================================================
void Aspect_GenId::Free (const Standard_Integer theId)
{
if (theId >= myLowerBound
&& theId <= myUpperBound)
{
if (myFreeCount + myFreeIds.Extent() + 1 == myLength)
{
myFreeCount = myLength;
myFreeIds.Clear();
}
else
{
myFreeIds.Prepend (theId);
}
}
}
// =======================================================================
// function : Lower
// purpose :
// =======================================================================
Standard_Integer Aspect_GenId::Lower() const
{
return myLowerBound;
}
// =======================================================================
// function : Next
// purpose :
// =======================================================================
Standard_Integer Aspect_GenId::Next()
{
if (!myFreeIds.IsEmpty())
{
const Standard_Integer anId = myFreeIds.First();
myFreeIds.RemoveFirst();
return anId;
}
else if (myFreeCount < 1)
{
Aspect_IdentDefinitionError::Raise ("GenId Next Error: Available == 0");
}
--myFreeCount;
const Standard_Integer anId = myLowerBound + myLength - myFreeCount - 1;
return anId;
}
// =======================================================================
// function : Upper
// purpose :
// =======================================================================
Standard_Integer Aspect_GenId::Upper() const
{
return myUpperBound;
}