1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-09 18:50:54 +03:00
occt/src/Interface/Interface_EntityList.cxx
ski 9775fa6110 0026937: Eliminate NO_CXX_EXCEPTION macro support
Macro NO_CXX_EXCEPTION was removed from code.
Method Raise() was replaced by explicit throw statement.
Method Standard_Failure::Caught() was replaced by normal C++mechanism of exception transfer.
Method Standard_Failure::Caught() is deprecated now.
Eliminated empty constructors.
Updated samples.
Eliminate empty method ChangeValue from NCollection_Map class.
Removed not operable methods from NCollection classes.
2017-02-02 16:35:54 +03:00

209 lines
7.5 KiB
C++

// 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 <Interface_EntityCluster.hxx>
#include <Interface_EntityIterator.hxx>
#include <Interface_EntityList.hxx>
#include <Interface_InterfaceError.hxx>
#include <Standard_NullObject.hxx>
#include <Standard_OutOfRange.hxx>
#include <Standard_Transient.hxx>
// Une EntityList, c est au fond un "Handle" bien entoure :
// S il est nul, la liste est vide
// Si c est une Entite, la liste comprend cette entite et rien d autre
// Si c est un EntityCluster, il definit (avec ses Next eventuels) le contenu
// de la liste
Interface_EntityList::Interface_EntityList () { }
void Interface_EntityList::Clear ()
{ theval.Nullify(); }
// .... EDITIONS (ajout-suppression) ....
void Interface_EntityList::Append
(const Handle(Standard_Transient)& ent)
{
if (ent.IsNull()) throw Standard_NullObject("Interface_EntityList Append");
if (theval.IsNull()) { theval = ent; return; }
Handle(Interface_EntityCluster) aValEC =
Handle(Interface_EntityCluster)::DownCast(theval);
if (!aValEC.IsNull()) aValEC->Append(ent); // EntityCluster
else { // reste InterfaceEntity ...
Handle(Interface_EntityCluster) ec = new Interface_EntityCluster(theval);
ec->Append(ent);
theval = ec;
}
}
// Difference avec Append : on optimise, en evitant la recursivite
// En effet, quand un EntityCluster est plein, Append transmet au Next
// Ici, EntityList garde le controle, le temps de traitement reste le meme
// Moyennant quoi, l ordre n est pas garanti
void Interface_EntityList::Add
(const Handle(Standard_Transient)& ent)
{
if (ent.IsNull()) throw Standard_NullObject("Interface_EntityList Add");
if (theval.IsNull()) { theval = ent; return; }
Handle(Interface_EntityCluster) aValEC =
Handle(Interface_EntityCluster)::DownCast(theval);
if (!aValEC.IsNull()) { // EntityCluster
if (aValEC->IsLocalFull()) theval = new Interface_EntityCluster(ent, aValEC);
else aValEC->Append (ent);
} else { // reste InterfaceEntity ...
Handle(Interface_EntityCluster) ec = new Interface_EntityCluster(theval);
ec->Append(ent);
theval = ec;
}
}
// Remove : Par Identification d Item a supprimer, ou par Rang
// Identification : Item supprime ou qu il soit
// N.B.: La liste peut devenir vide ... cf retour Remove de Cluster
void Interface_EntityList::Remove (const Handle(Standard_Transient)& ent)
{
if (ent.IsNull()) throw Standard_NullObject("Interface_EntityList Remove");
if (theval.IsNull()) return;
if (theval == ent) {
theval.Nullify();
return;
}
Handle(Interface_EntityCluster) ec =
Handle(Interface_EntityCluster)::DownCast(theval);
if (ec.IsNull()) return; // Une seule Entite et pas la bonne
Standard_Boolean res = ec->Remove(ent);
if (res) theval.Nullify();
}
// Remove par rang : tester OutOfRange
void Interface_EntityList::Remove (const Standard_Integer num)
{
if (theval.IsNull()) throw Standard_OutOfRange("EntityList : Remove");
Handle(Interface_EntityCluster) ec =
Handle(Interface_EntityCluster)::DownCast(theval);
if (ec.IsNull()) {
if (num != 1) throw Standard_OutOfRange("EntityList : Remove");
theval.Nullify();
return;
}
Standard_Boolean res = ec->Remove(num);
if (res) theval.Nullify();
}
// .... ACCES Unitaire AUX DONNEES ....
Standard_Boolean Interface_EntityList::IsEmpty () const
{ return (theval.IsNull()); }
Standard_Integer Interface_EntityList::NbEntities () const
{
if (theval.IsNull()) return 0;
Handle(Interface_EntityCluster) ec =
Handle(Interface_EntityCluster)::DownCast(theval);
if (ec.IsNull()) return 1; // Une seuke Entite
return ec->NbEntities();
}
const Handle(Standard_Transient)& Interface_EntityList::Value
(const Standard_Integer num) const
{
if (theval.IsNull()) throw Standard_OutOfRange("Interface EntityList : Value");
Handle(Interface_EntityCluster) ec =
Handle(Interface_EntityCluster)::DownCast(theval);
if (!ec.IsNull()) return ec->Value(num); // EntityCluster
else if (num != 1) throw Standard_OutOfRange("Interface EntityList : Value");
return theval;
}
void Interface_EntityList::SetValue
(const Standard_Integer num, const Handle(Standard_Transient)& ent)
{
if (ent.IsNull()) throw Standard_NullObject("Interface_EntityList SetValue");
if (theval.IsNull()) throw Standard_OutOfRange("Interface EntityList : SetValue");
Handle(Interface_EntityCluster) ec =
Handle(Interface_EntityCluster)::DownCast(theval);
if (!ec.IsNull()) ec->SetValue(num,ent); // EntityCluster
else if (num != 1) throw Standard_OutOfRange("Interface EntityList : SetValue");
else theval = ent;
}
// .... Interrogations Generales ....
void Interface_EntityList::FillIterator
(Interface_EntityIterator& iter) const
{
if (theval.IsNull()) return;
Handle(Interface_EntityCluster) ec =
Handle(Interface_EntityCluster)::DownCast(theval);
if (!ec.IsNull()) ec->FillIterator(iter); // EntityCluster;
else iter.GetOneItem(theval);
}
Standard_Integer Interface_EntityList::NbTypedEntities
(const Handle(Standard_Type)& atype) const
{
Standard_Integer res = 0;
if (theval.IsNull()) return 0;
Handle(Interface_EntityCluster) ec =
Handle(Interface_EntityCluster)::DownCast(theval);
if (!ec.IsNull()) { // EntityCluster
while (!ec.IsNull()) {
for (Standard_Integer i = ec->NbLocal(); i > 0; i --) {
if (ec->Value(i)->IsKind(atype)) res ++;
}
if (!ec->HasNext()) break;
ec = ec->Next();
}
} else { // Une seule Entite
if (theval->IsKind(atype)) res = 1;
}
return res;
}
Handle(Standard_Transient) Interface_EntityList::TypedEntity
(const Handle(Standard_Type)& atype, const Standard_Integer num) const
{
Standard_Integer res = 0;
Handle(Standard_Transient) entres;
if (theval.IsNull()) throw Interface_InterfaceError("Interface EntityList : TypedEntity , none found");
Handle(Interface_EntityCluster) ec =
Handle(Interface_EntityCluster)::DownCast(theval);
if (!ec.IsNull()) { // EntityCluster
while (!ec.IsNull()) {
for (Standard_Integer i = ec->NbLocal(); i > 0; i --) {
if (ec->Value(i)->IsKind(atype)) {
res ++;
if (num == 0 && res > 1) throw Interface_InterfaceError("Interface EntityList : TypedEntity , several found");
entres = ec->Value(i);
if (res == num) return entres;
}
}
if (!ec->HasNext()) break;
ec = ec->Next();
}
} else if (num > 1) {
throw Interface_InterfaceError("Interface EntityList : TypedEntity ,out of range");
} else { // InterfaceEntity
if (!theval->IsKind(atype)) throw Interface_InterfaceError("Interface EntityList : TypedEntity , none found");
entres = theval;
}
return entres;
}