141 lines
4.1 KiB
C++
141 lines
4.1 KiB
C++
|
|
// -*- C++ -*-
|
|
//
|
|
// This file is part of the Coriolis Software.
|
|
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
|
|
//
|
|
// ===================================================================
|
|
//
|
|
// $Id$
|
|
//
|
|
// x-----------------------------------------------------------------x
|
|
// | |
|
|
// | C O R I O L I S |
|
|
// | K a t a b a t i c - Routing Toolbox |
|
|
// | |
|
|
// | Author : Jean-Paul CHAPUT |
|
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
|
// | =============================================================== |
|
|
// | C++ Module : "./AutoContacts.cpp" |
|
|
// | *************************************************************** |
|
|
// | U p d a t e s |
|
|
// | |
|
|
// x-----------------------------------------------------------------x
|
|
|
|
|
|
#include <utility>
|
|
|
|
#include "hurricane/Segment.h"
|
|
#include "hurricane/Horizontal.h"
|
|
#include "hurricane/Vertical.h"
|
|
|
|
#include "katabatic/Session.h"
|
|
#include "katabatic/AutoContact.h"
|
|
#include "katabatic/AutoSegment.h"
|
|
|
|
|
|
namespace Katabatic {
|
|
|
|
|
|
using namespace std;
|
|
using Hurricane::Hook;
|
|
using Hurricane::Error;
|
|
using Hurricane::Segment;
|
|
using Hurricane::ForEachIterator;
|
|
|
|
|
|
// -------------------------------------------------------------------
|
|
// Class : "Katabatic::AutoContacts_Collapsed".
|
|
|
|
|
|
void AutoContactStack::push ( AutoContact* contact, Segment* segment )
|
|
{
|
|
ltrace(80) << "Stacking " << (void*)contact->getContact() << ":" << contact
|
|
<< " + " << (void*)segment << ":" << segment << endl;
|
|
|
|
push_back(make_pair(contact,segment));
|
|
}
|
|
|
|
|
|
AutoContact* AutoContacts_Collapsed::Locator::getElement () const
|
|
{
|
|
return _stack.getAutoContact ();
|
|
}
|
|
|
|
|
|
void AutoContacts_Collapsed::Locator::progress ()
|
|
{
|
|
AutoContact* sourceContact = _stack.getAutoContact ();
|
|
Segment* sourceSegment = _stack.getSegment ();
|
|
|
|
_stack.pop ();
|
|
|
|
forEach ( Hook*, ihook, sourceContact->getBodyHook()->getHooks() ) {
|
|
Segment* segment = NULL;
|
|
|
|
if ( _direction & Constant::Horizontal ) segment = dynamic_cast<Horizontal*>(ihook->getComponent());
|
|
else segment = dynamic_cast<Vertical* >(ihook->getComponent());
|
|
|
|
if ( segment && (segment != sourceSegment) ) {
|
|
AutoSegment* autoSegment = Session::lookup ( segment );
|
|
|
|
if ( !autoSegment ) {
|
|
cerr << Error("Can't lookup <AutoSegment> for %s.",getString(segment).c_str()) << endl;
|
|
continue;
|
|
}
|
|
if ( !autoSegment->isCollapsed() ) continue;
|
|
|
|
Hook* opposite = segment->getOppositeHook ( *ihook );
|
|
AutoContact* targetContact = dynamic_cast<AutoContact*>(opposite->getMasterHook()->getComponent());
|
|
|
|
if ( targetContact ) _stack.push ( targetContact, segment );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
Hurricane::Locator<AutoContact*>* AutoContacts_Collapsed::Locator::getClone () const
|
|
{
|
|
return new Locator(*this);
|
|
}
|
|
|
|
|
|
bool AutoContacts_Collapsed::Locator::isValid () const
|
|
{
|
|
return _stack.isEmpty();
|
|
}
|
|
|
|
|
|
string AutoContacts_Collapsed::Locator::_getString () const
|
|
{
|
|
string s = "<" + _TName("AutoContacts_Collapsed::Locator")
|
|
+ getString(_stack.getAutoContact())
|
|
+ ">";
|
|
return s;
|
|
}
|
|
|
|
|
|
Collection<AutoContact*>* AutoContacts_Collapsed::getClone () const
|
|
{
|
|
return new AutoContacts_Collapsed(*this);
|
|
}
|
|
|
|
|
|
Hurricane::Locator<AutoContact*>* AutoContacts_Collapsed::getLocator () const
|
|
{
|
|
return new Locator(_contact,_direction);
|
|
}
|
|
|
|
|
|
string AutoContacts_Collapsed::_getString () const
|
|
{
|
|
string s = "<" + _TName("AutoContacts_Collapsed") + " "
|
|
+ getString(_contact) + " "
|
|
+ getString(_direction)
|
|
+ ">";
|
|
return s;
|
|
}
|
|
|
|
|
|
} // End of Katabatic namespace.
|