triskele/include/ArrayTree/Leader.tpp
Git Merciol bdd6110787 modifié : ../include/ArrayTree/ArrayTreeBuilder.hpp
modifié :         ../include/ArrayTree/ArrayTreeBuilder.tpp
	modifié :         ../include/ArrayTree/GraphWalker.hpp
	modifié :         ../include/ArrayTree/GraphWalker.tpp
	modifié :         ../include/ArrayTree/Leader.tpp
	modifié :         ../include/IImage.tpp
	modifié :         ../include/Tree.hpp
	modifié :         ../include/Tree.tpp
	modifié :         ../include/TreeBuilder.hpp
	modifié :         ../include/TreeBuilder.tpp
	modifié :         ../src/QuadTree/QuadTreeBuilder.cpp
	modifié :         ../src/Tree.cpp
	modifié :         ../src/XMLTree/XMLTreeBuilder.cpp
	modifié :         ../src/testMain.cpp
2018-02-18 11:19:40 +01:00

96 lines
1.9 KiB
C++

#ifndef _OTB_TRISKELE_ARRAY_TREE_LEADER_TPP
#define _OTB_TRISKELE_ARRAY_TREE_LEADER_TPP
// ========================================
inline
Leader::Leader ()
: size (0),
leaders (NULL) {
}
inline
Leader::~Leader () {
free ();
}
// ========================================
inline void
Leader::book (DimImg vertexCount) {
#ifdef SMART_LOG
DEF_LOG ("Leader::book", "vertexCount:" << vertexCount);
#endif
if (vertexCount == size) {
reset ();
return;
}
free ();
if (!vertexCount)
return;
size = vertexCount;
leaders = new DimImg [vertexCount];
reset ();
}
// ---------------------------------------
inline void
Leader::free () {
#ifdef SMART_LOG
DEF_LOG ("Leader::free", "");
#endif
if (leaders)
delete [] leaders;
leaders = NULL;
size = 0;
}
// ---------------------------------------
inline void
Leader::reset () {
if (!size)
return;
// XXX dealThreadFill_n avec coreCount
std::fill_n (leaders, size, DimImg_MAX);
}
// ========================================
inline DimImg
Leader::find (DimImg a) const {
BOOST_ASSERT (a < size);
for (;;) {
// On recherche le leader de a dans le tableau
DimImg p = leaders[a];
// Si p est size, p n'a pas de leader donc p était le leader de a
if (p == DimImg_MAX)
break;
a = p;
}
BOOST_ASSERT (a < size);
return a;
}
// ----------------------------------------
inline void
Leader::link (DimImg a, const DimImg &r) {
BOOST_ASSERT (a < size);
BOOST_ASSERT (r < size);
for (; a != r;) {
// On affecte une variable "temporaire" qui joue le rôle du leader de a
DimImg p = leaders[a];
//
leaders[a] = r;
if (p == DimImg_MAX)
return;
a = p;
}
}
// ========================================
inline DimImg *
Leader::getLeaders () {
return leaders;
}
// ========================================
#endif // _OTB_TRISKELE_ARRAY_TREE_LEADER_TPP