[Orxonox-commit 5711] r10371 - code/branches/core7/src/libraries/core/class
landauf at orxonox.net
landauf at orxonox.net
Sat Apr 18 12:46:58 CEST 2015
Author: landauf
Date: 2015-04-18 12:46:57 +0200 (Sat, 18 Apr 2015)
New Revision: 10371
Modified:
code/branches/core7/src/libraries/core/class/Identifier.cc
code/branches/core7/src/libraries/core/class/Identifier.h
code/branches/core7/src/libraries/core/class/IdentifierManager.cc
Log:
trying to make the initialization of parents of an identifier better understandable in code
Modified: code/branches/core7/src/libraries/core/class/Identifier.cc
===================================================================
--- code/branches/core7/src/libraries/core/class/Identifier.cc 2015-04-16 19:59:58 UTC (rev 10370)
+++ code/branches/core7/src/libraries/core/class/Identifier.cc 2015-04-18 10:46:57 UTC (rev 10371)
@@ -153,29 +153,14 @@
return;
}
- for (std::set<const Identifier*>::const_iterator it = initializationTrace.begin(); it != initializationTrace.end(); ++it)
- if (*it != this)
- this->parents_.insert(*it);
- }
-
- /**
- * @brief Initializes the direct parents of this Identifier while creating the class hierarchy. This is only intended for abstract classes.
- */
- void Identifier::initializeDirectParentsOfAbstractClass()
- {
- if (!IdentifierManager::getInstance().isCreatingHierarchy())
+ if (this->directParents_.empty())
{
- orxout(internal_warning) << "Identifier::initializeDirectParentsOfAbstractClass() created outside of class hierarchy creation" << endl;
- return;
+ for (std::set<const Identifier*>::const_iterator it = initializationTrace.begin(); it != initializationTrace.end(); ++it)
+ if (*it != this)
+ this->parents_.insert(*it);
}
-
- // only Identifiable is allowed to have no parents (even tough it's currently not abstract)
- if (this->directParents_.empty() && !this->isExactlyA(Class(Identifiable)))
- {
- orxout(internal_error) << "Identifier " << this->getName() << " / " << this->getTypeidName() << " is marked as abstract but has no direct parents defined" << endl;
- orxout(internal_error) << " If this class is not abstract, use RegisterClass(ThisClass);" << endl;
- orxout(internal_error) << " If this class is abstract, use RegisterAbstractClass(ThisClass).inheritsFrom(Class(BaseClass));" << endl;
- }
+ else
+ orxout(internal_error) << "Trying to add parents to " << this->getName() << " after it was already initialized with manual calls to inheritsFrom<Class>()." << endl;
}
/**
@@ -192,24 +177,43 @@
if (this->isInitialized())
return;
- // if no direct parents were defined, initialize them with the set of all parents
- if (this->directParents_.empty())
+ if (!this->parents_.empty())
+ {
+ // parents defined -> this class was initialized by creating a sample instance and recording the trace of identifiers
+
+ // initialize all parents
+ for (std::set<const Identifier*>::const_iterator it = this->parents_.begin(); it != this->parents_.end(); ++it)
+ const_cast<Identifier*>(*it)->finishInitialization(); // initialize parent
+
+ // parents of parents are no direct parents of this identifier
this->directParents_ = this->parents_;
+ for (std::set<const Identifier*>::const_iterator it_parent = this->parents_.begin(); it_parent != this->parents_.end(); ++it_parent)
+ for (std::set<const Identifier*>::const_iterator it_parent_parent = const_cast<Identifier*>(*it_parent)->parents_.begin(); it_parent_parent != const_cast<Identifier*>(*it_parent)->parents_.end(); ++it_parent_parent)
+ this->directParents_.erase(*it_parent_parent);
+ }
+ else if (!this->directParents_.empty())
+ {
+ // no parents defined -> this class was manually initialized by calling inheritsFrom<Class>()
- // initialize all parents before continuing to initialize this identifier
- for (std::set<const Identifier*>::const_iterator it = this->directParents_.begin(); it != this->directParents_.end(); ++it)
+ // initialize all direct parents
+ for (std::set<const Identifier*>::const_iterator it = this->directParents_.begin(); it != this->directParents_.end(); ++it)
+ const_cast<Identifier*>(*it)->finishInitialization(); // initialize parent
+
+ // direct parents and their parents are also parents of this identifier (but only add them once)
+ this->parents_ = this->directParents_;
+ for (std::set<const Identifier*>::const_iterator it_parent = this->directParents_.begin(); it_parent != this->directParents_.end(); ++it_parent)
+ for (std::set<const Identifier*>::const_iterator it_parent_parent = const_cast<Identifier*>(*it_parent)->parents_.begin(); it_parent_parent != const_cast<Identifier*>(*it_parent)->parents_.end(); ++it_parent_parent)
+ if (std::find(this->parents_.begin(), this->parents_.end(), *it_parent_parent) == this->parents_.end())
+ this->parents_.insert(*it_parent_parent);
+ }
+ else if (!this->isExactlyA(Class(Identifiable)))
{
- Identifier* directParent = const_cast<Identifier*>(*it);
- directParent->finishInitialization(); // initialize parent
- this->parents_.insert(directParent); // direct parent is also a parent
- this->parents_.insert(directParent->parents_.begin(), directParent->parents_.end()); // parents of direct parent are also parents
+ // only Identifiable is allowed to have no parents (even tough it's currently not abstract)
+ orxout(internal_error) << "Identifier " << this->getName() << " / " << this->getTypeidName() << " is marked as abstract but has no direct parents defined" << endl;
+ orxout(internal_error) << " If this class is not abstract, use RegisterClass(ThisClass);" << endl;
+ orxout(internal_error) << " If this class is abstract, use RegisterAbstractClass(ThisClass).inheritsFrom(Class(BaseClass));" << endl;
}
- // parents of parents are no direct parents of this identifier
- for (std::set<const Identifier*>::const_iterator it_parent = this->parents_.begin(); it_parent != this->parents_.end(); ++it_parent)
- for (std::set<const Identifier*>::const_iterator it_parent_parent = const_cast<Identifier*>(*it_parent)->parents_.begin(); it_parent_parent != const_cast<Identifier*>(*it_parent)->parents_.end(); ++it_parent_parent)
- this->directParents_.erase(*it_parent_parent);
-
// tell all parents that this identifier is a child
for (std::set<const Identifier*>::const_iterator it = this->parents_.begin(); it != this->parents_.end(); ++it)
const_cast<Identifier*>(*it)->children_.insert(this);
@@ -232,7 +236,7 @@
*/
bool Identifier::isA(const Identifier* identifier) const
{
- return (identifier == this || (this->parents_.find(identifier) != this->parents_.end()));
+ return (identifier == this || (this->isChildOf(identifier)));
}
/**
Modified: code/branches/core7/src/libraries/core/class/Identifier.h
===================================================================
--- code/branches/core7/src/libraries/core/class/Identifier.h 2015-04-16 19:59:58 UTC (rev 10370)
+++ code/branches/core7/src/libraries/core/class/Identifier.h 2015-04-18 10:46:57 UTC (rev 10371)
@@ -148,7 +148,6 @@
Identifier& inheritsFrom(Identifier* directParent);
void initializeParents(const std::set<const Identifier*>& initializationTrace);
- void initializeDirectParentsOfAbstractClass();
void finishInitialization();
bool isA(const Identifier* identifier) const;
Modified: code/branches/core7/src/libraries/core/class/IdentifierManager.cc
===================================================================
--- code/branches/core7/src/libraries/core/class/IdentifierManager.cc 2015-04-16 19:59:58 UTC (rev 10370)
+++ code/branches/core7/src/libraries/core/class/IdentifierManager.cc 2015-04-18 10:46:57 UTC (rev 10371)
@@ -132,8 +132,6 @@
delete temp;
}
- else
- it->second->initializeDirectParentsOfAbstractClass();
initializedIdentifiers.insert(it->second);
}
More information about the Orxonox-commit
mailing list