// -*- C++ -*-
namespace Hurricane {
/*! \class Locator
* \brief Locator description (\b API)
*
* \section secLocatorIntro Introduction
*
* Locators are objects which allow to walk efficiently through
* the data structure.
*
* Locators are indeed algorithms. They do not hold a list of
* elements but the way to go from one element to the next.
* As such, they are very light in memory, contrary to containers.
* Locators are the workhorse of Collection, and while they can
* be used directly, this is not the recommended way.
*
*
* \section secLocatorGeneralConcepts General concepts
*
* Initialization In order to get a locator, you must :
* either ask the collection to provide a locator for visiting
* the elements of its described set, or build a clone of an
* existing locator allowing to visit the remaining elements
* starting from the current position of that locator.
*
* End of walk indicator The predicate isValid()
* returns \true if the locator refers an element of the set,
* \false when all the elements have been visited.
*
* getting the current element The current element is
* obtained by the accessor getElement(). There is no
* risk to call this function when the visit is finished or the
* locator is non initialized (the returned value is
* meaningless).
*
* Walk progression The function progress() moves
* forward the locator on the next element of the set (does
* nothing if called after the last element).
*
* \section secLocatorUsageExamples Usage examples
*
* The following sample code shows how to trace the nets of a
* given cell
\code
Cell* cell = ...; // we get the cell
if (cell) {
// cell->getNets()
// returns the nets collection of the cell
// and getLocator()
// allocates and returns a locator for traversing those nets
Locator* locator = cell->getNets().getLocator();
while (locator->isValid()) {
Net* net = locator->getElement();
assert(net->getCell() == cell);
locator->progress();
}
// don't forget to release the allocated locator
delete locator;
}
\endcode
* And this one how to print all pairs of nets of a given cell
\code
Cell* cell = ...; // we get a cell
if (cell) {
Locator* locator1 = cell->GetNets().getLocator();
while (locator1->isValid()) {
Net* net1 = locator1->getElement();
Locator* locator2 = locator1->getClone();
while (locator2->isValid()) {
Net* net2 = locator2->getElement();
cerr << net1 << " " << net2 << endl;
locator2->progress();
}
delete locator2;
locator1->progress();
}
delete locator1;
}
\endcode
* \remark Those examples are given in order to explain how locators
* work. We will see in the following how to do that more simply
* by using generic locators, or even simpler by using the
* forEach macros.
*/
/*! \function Type Locator::getElement() const;
* \Return the current element (or the value Type() when the
* locator is not or no longer valid).
*/
/*! \function Locator* Locator::getClone() const;
* This function allocates and returns a new locator that will
* have the same visiting course than the remaining one of the
* locator being cloned.
*
* \remark In principle there is no need to call this function, but if
* you do so you must not forget to release the clone after its
* use or, from it, build a generic locator which will do that
* for you (to be explained later).
*/
/*! \function bool Locator::isValid() const;
* \Return \true while the walk has not exhausted the set of elements,
* else \false.
*/
/*! \function void Locator::progress();
* Moves forward the locator to the following element.
*/
/*! \class GenericLocator
* \brief Generic Locator auto-pointer.
*
* This class is an auto-pointer like wrapped around the raw locator.
*
* \remark The destruction of a GenericLocator triggers the destruction of
* the raw locator.
*/
/*! \function GenericLocator::GenericLocator(Locator* locator);
* Constructor from a raw Locator.
*
* \remark This constructor do not build a copy of the raw locator. So the original
* raw locator must not be deleted. It's deletion will occurs with the one
* of the GenericLocator.
*/
/*! \function GenericLocator::GenericLocator(const Locator& locator);
* Constructor from a primary Locator.
*
* \remark This constructor build a \e copy of the raw locator. So the originating
* locator can be safely deleted.
*/
/*! \function GenericLocator::GenericLocator(const GenericLocator& locator);
* Constructor from a primary Locator and a Filter.
*
* \remark This constructor build a \e copy of the raw locator. So the originating
* locator can be safely deleted.
*/
}