coriolis/hurricane/src/hurricane/Path.cpp

265 lines
7.6 KiB
C++

// ****************************************************************************************************
// File: Path.cpp
// Authors: R. Escassut
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
// ****************************************************************************************************
#include "hurricane/Path.h"
#include "hurricane/SharedPath.h"
#include "hurricane/Cell.h"
#include "hurricane/Instance.h"
#include "hurricane/Error.h"
namespace Hurricane {
// ****************************************************************************************************
// Path implementation
// ****************************************************************************************************
Path::Path(SharedPath* sharedPath)
// *******************************
: _sharedPath(sharedPath)
{
}
Path::Path(Instance* instance)
// ***************************
: _sharedPath(NULL)
{
if (instance) {
_sharedPath = instance->_getSharedPath(NULL);
if (!_sharedPath) _sharedPath = new SharedPath(instance);
}
}
Path::Path(Instance* headInstance, const Path& tailPath)
// *****************************************************
: _sharedPath(NULL)
{
if (!headInstance)
throw Error("Cant't create " + _TName("Path") + " : null head instance");
if (!tailPath._getSharedPath()) {
_sharedPath = headInstance->_getSharedPath(NULL);
if (!_sharedPath) _sharedPath = new SharedPath(headInstance);
}
else {
SharedPath* tailSharedPath = tailPath._getSharedPath();
if (tailSharedPath->getOwnerCell() != headInstance->getMasterCell())
throw Error("Cant't create " + _TName("Path") + " : incompatible tail path");
_sharedPath = headInstance->_getSharedPath(tailSharedPath);
if (!_sharedPath) _sharedPath = new SharedPath(headInstance, tailSharedPath);
}
}
Path::Path(const Path& headPath, Instance* tailInstance)
// *****************************************************
: _sharedPath(NULL)
{
if (!tailInstance)
throw Error("Cant't create " + _TName("Path") + " : null tail instance");
if (!headPath._getSharedPath()) {
_sharedPath = tailInstance->_getSharedPath(NULL);
if (!_sharedPath) _sharedPath = new SharedPath(tailInstance);
}
else {
Instance* headInstance = headPath.getHeadInstance();
SharedPath* tailSharedPath = Path(headPath.getTailPath(), tailInstance)._getSharedPath();
_sharedPath = headInstance->_getSharedPath(tailSharedPath);
if (!_sharedPath) _sharedPath = new SharedPath(headInstance, tailSharedPath);
}
}
Path::Path(const Path& headPath, const Path& tailPath)
// *****************************************************
: _sharedPath(tailPath._getSharedPath())
{
vector<Instance*> instances;
headPath.getInstances().fill(instances);
for (vector<Instance*>::reverse_iterator rit=instances.rbegin() ; rit != instances.rend() ; rit++)
{ Instance* instance=*rit;
SharedPath* sharedPath = _sharedPath;
_sharedPath = instance->_getSharedPath(sharedPath);
if (!_sharedPath) _sharedPath = new SharedPath(instance,sharedPath);
}
}
Path::Path(Cell* cell, const string& pathName)
// *******************************************
: _sharedPath(NULL)
{
if (cell) {
list<Instance*> instanceList;
string restOfPathName = pathName;
char nameSeparator = getNameSeparator();
while (!restOfPathName.empty()) {
size_t pos = restOfPathName.find(nameSeparator);
Instance* instance = cell->getInstance(restOfPathName.substr(0, pos));
if (!instance) throw Error("Cant't create " + _TName("Path") + " : invalid path name");
cell = instance->getMasterCell();
restOfPathName = (pos == string::npos) ? string("") : restOfPathName.substr(pos + 1);
instanceList.push_back(instance);
}
if (!instanceList.empty()) {
list<Instance*>::reverse_iterator instanceIterator = instanceList.rbegin();
while (instanceIterator != instanceList.rend()) {
Instance* headInstance = *instanceIterator;
SharedPath* tailSharedPath = _sharedPath;
_sharedPath = headInstance->_getSharedPath(tailSharedPath);
if (!_sharedPath) _sharedPath = new SharedPath(headInstance, tailSharedPath);
++instanceIterator;
}
}
}
}
Path::Path(const Path& path)
// *************************
: _sharedPath(path._sharedPath)
{
}
Path::~Path()
// **********
{
}
Path& Path::operator=(const Path& path)
// ************************************
{
_sharedPath = path._sharedPath;
return *this;
}
bool Path::operator==(const Path& path) const
// ******************************************
{
return (_sharedPath == path._sharedPath);
}
bool Path::operator!=(const Path& path) const
// ******************************************
{
return (_sharedPath != path._sharedPath);
}
bool Path::operator<(const Path& path) const
// *****************************************
{
return (_sharedPath < path._sharedPath);
}
Instance* Path::getHeadInstance() const
// ************************************
{
return (_sharedPath) ? _sharedPath->getHeadInstance() : NULL;
}
Path Path::getTailPath() const
// ***************************
{
return Path((_sharedPath) ? _sharedPath->getTailSharedPath() : NULL);
}
Path Path::getHeadPath() const
// ***************************
{
return Path((_sharedPath) ? _sharedPath->getHeadSharedPath() : NULL);
}
Instance* Path::getTailInstance() const
// ************************************
{
return (_sharedPath) ? _sharedPath->getTailInstance() : NULL;
}
char Path::getNameSeparator()
// **************************
{
return SharedPath::getNameSeparator();
}
string Path::getName() const
// *************************
{
return (_sharedPath) ? _sharedPath->getName() : string("");
}
Cell* Path::getOwnerCell() const
// *****************************
{
return (_sharedPath) ? _sharedPath->getOwnerCell() : NULL;
}
Cell* Path::getMasterCell() const
// ******************************
{
return (_sharedPath) ? _sharedPath->getMasterCell() : NULL;
}
Instances Path::getInstances() const
// *********************************
{
return (_sharedPath) ? _sharedPath->getInstances() : Instances();
}
Transformation Path::getTransformation(const Transformation& transformation) const
// *******************************************************************************
{
return (_sharedPath) ? _sharedPath->getTransformation(transformation) : transformation;
}
bool Path::isEmpty() const
// ***********************
{
return (_sharedPath == NULL);
}
void Path::makeEmpty()
// *******************
{
_sharedPath = NULL;
}
void Path::setNameSeparator(char nameSeparator)
// ********************************************
{
SharedPath::setNameSeparator(nameSeparator);
}
string Path::_getString() const
// ****************************
{
string s = "<" + _TName("Path");
if (!_sharedPath)
s += " empty";
else
s += " " + getString(getName());
s += ">";
return s;
}
Record* Path::_getRecord() const
// ***********************
{
Record* record = NULL;
if (_sharedPath) {
record = new Record(getString(this));
record->add(getSlot("SharedPath", _sharedPath));
}
return record;
}
} // End of Hurricane namespace.
// ****************************************************************************************************
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
// ****************************************************************************************************