Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Mar 19, 2008, 12:38:32 AM (17 years ago)
Author:
landauf
Message:

Namespaces are working now. I love this feature, can't stop playing with it :D

Location:
code/branches/core2/src/orxonox/core
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • code/branches/core2/src/orxonox/core/Loader.cc

    r899 r901  
    115115            ticpp::Document xmlfile(level->getFile());
    116116            xmlfile.LoadFile();
     117
    117118            ticpp::Element rootElement;
    118119            rootElement.SetAttribute("name", "root");
     120            rootElement.SetAttribute("bAutogenerated", true);
    119121
    120122            for (ticpp::Iterator<ticpp::Element> child = xmlfile.FirstChildElement(false); child != child.end(); child++)
     
    126128            rootNamespace->setLevel(level);
    127129            rootNamespace->setNamespace(rootNamespace);
    128             rootNamespace->deleteNamespaceNodesAfterDestruction(true);
     130            rootNamespace->setRoot(true);
    129131            rootNamespace->XMLPort(rootElement, true);
    130132
    131133            COUT(0) << "Finished loading " << level->getFile() << "." << std::endl;
     134
     135            COUT(4) << "Namespace-tree:" << std::endl << rootNamespace->toString("  ") << std::endl;
    132136
    133137            return true;
  • code/branches/core2/src/orxonox/core/Namespace.cc

    r898 r901  
    4141
    4242        this->bAutogeneratedFileRootNamespace_ = false;
    43         this->bDeleteNamespaceNodesAfterDestruction_ = false;
     43        this->bRoot_ = false;
    4444        this->operator_ = "or";
    4545    }
     
    4747    Namespace::~Namespace()
    4848    {
    49         if (this->bDeleteNamespaceNodesAfterDestruction_)
     49        if (this->bRoot_)
    5050            for (std::set<NamespaceNode*>::iterator it = this->representingNamespaces_.begin(); it != this->representingNamespaces_.end(); ++it)
    5151                delete (*it);
     
    7373            name.replace(pos, 1, " ");
    7474        SubString tokens(name, " ", "", false, '\\', '"', '\0', '\0', '\0');
    75         for (unsigned int i = 0; i < tokens.size(); i++)
     75        if (this->bRoot_)
    7676        {
    77             for (std::set<NamespaceNode*>::iterator it = this->getNamespace()->representingNamespaces_.begin(); it != this->getNamespace()->representingNamespaces_.end(); ++it)
     77            this->representingNamespaces_.insert(new NamespaceNode(this->getName()));
     78        }
     79        else
     80        {
     81            for (unsigned int i = 0; i < tokens.size(); i++)
    7882            {
    79                 std::set<NamespaceNode*> temp = (*it)->getNodeRelative(tokens[i]);
    80                 this->representingNamespaces_.insert(temp.begin(), temp.end());
     83                for (std::set<NamespaceNode*>::iterator it = this->getNamespace()->representingNamespaces_.begin(); it != this->getNamespace()->representingNamespaces_.end(); ++it)
     84                {
     85                    std::set<NamespaceNode*> temp = (*it)->getNodeRelative(tokens[i]);
     86                    this->representingNamespaces_.insert(temp.begin(), temp.end());
     87                }
    8188            }
    8289        }
     
    138145        return false;
    139146    }
     147
     148    std::string Namespace::toString() const
     149    {
     150        std::string output;
     151
     152        int i = 0;
     153        for (std::set<NamespaceNode*>::const_iterator it = this->representingNamespaces_.begin(); it != this->representingNamespaces_.end(); i++, ++it)
     154        {
     155            if (i > 0)
     156                output += " / ";
     157
     158            output += (*it)->toString();
     159        }
     160
     161        return output;
     162    }
     163
     164    std::string Namespace::toString(const std::string& indentation) const
     165    {
     166        std::string output;
     167
     168        int i = 0;
     169        for (std::set<NamespaceNode*>::const_iterator it = this->representingNamespaces_.begin(); it != this->representingNamespaces_.end(); i++, ++it)
     170        {
     171            if (i > 0)
     172                output += "\n";
     173
     174            output += (*it)->toString(indentation);
     175        }
     176
     177        return output;
     178    }
    140179}
  • code/branches/core2/src/orxonox/core/Namespace.h

    r896 r901  
    5959                { return this->operator_; }
    6060
     61            void setRoot(bool bRoot)
     62                { this->bRoot_ = bRoot; }
     63
    6164            bool includes(const Namespace* ns) const;
    6265            bool isIncludedIn(const Namespace* ns) const { return ns->includes(this); }
    6366
    64             void deleteNamespaceNodesAfterDestruction(bool bDelete)
    65                 { this->bDeleteNamespaceNodesAfterDestruction_ = bDelete; }
     67            std::string toString() const;
     68            std::string toString(const std::string& indentation) const;
    6669
    6770        private:
    6871            std::set<NamespaceNode*> representingNamespaces_;
    6972            bool bAutogeneratedFileRootNamespace_;
    70             bool bDeleteNamespaceNodesAfterDestruction_;
     73            bool bRoot_;
    7174            std::string operator_;
    7275    };
  • code/branches/core2/src/orxonox/core/NamespaceNode.cc

    r895 r901  
    4949        std::set<NamespaceNode*> nodes;
    5050
    51         if (name == "")
     51        if ((name.size() == 0) || (name == ""))
    5252        {
    5353            nodes.insert(this);
     
    5656        {
    5757            unsigned int pos = name.find("::");
    58             std::string firstPart = name.substr(0, pos);
    59             std::string secondPart = name.substr(pos + 2, std::string::npos);
     58            std::string firstPart = name;
     59            std::string secondPart;
     60
     61            if (pos != std::string::npos)
     62            {
     63                firstPart = name.substr(0, pos);
     64                secondPart = name.substr(pos + 2, std::string::npos);
     65            }
    6066
    6167            if (firstPart == "..")
     
    6470                {
    6571                    COUT(2) << "Warning: Can't go to enclosing namespace with '..' operator in namespace " << this->name_ << ", namespace is root." << std::endl;
     72                    nodes = this->getNodeRelative(secondPart);
     73                }
     74                else if (!this->parent_)
     75                {
     76                    COUT(2) << "Warning: Can't go to enclosing namespace with '..' operator in namespace " << this->name_ << ", no parent namespace set." << std::endl;
    6677                    nodes = this->getNodeRelative(secondPart);
    6778                }
     
    7889
    7990                if ((*it).second->isHidden())
     91                {
    8092                    COUT(2) << "Warning: Subnamespace '" << firstPart << "' in namespace '" << this->name_ << "' is hidden and can't be accessed." << std::endl;
     93                    nodes.insert(this);
     94                }
    8195                else
     96                {
    8297                    nodes = (*it).second->getNodeRelative(secondPart);
     98                }
    8399            }
    84100            else
    85101            {
     102                bool bFoundMatchingNamespace = false;
     103
    86104                for (std::map<std::string, NamespaceNode*>::iterator it = this->subnodes_.begin(); it != this->subnodes_.end(); ++it)
    87105                {
     
    90108                        std::set<NamespaceNode*> temp2 = (*it).second->getNodeRelative(secondPart);
    91109                        nodes.insert(temp2.begin(), temp2.end());
     110                        bFoundMatchingNamespace = true;
    92111                    }
     112                }
     113
     114                if (!bFoundMatchingNamespace)
     115                {
     116                    COUT(2) << "Warning: No file included with name '" << firstPart.substr(1, std::string::npos) << "' at this part of the level file, using parent namespace instead." << std::endl;
     117                    nodes = this->getNodeRelative(secondPart);
    93118                }
    94119            }
     
    113138        return false;
    114139    }
     140
     141    std::string NamespaceNode::toString() const
     142    {
     143        std::string output = this->name_;
     144
     145        if (this->subnodes_.size() > 0)
     146        {
     147            output += " (";
     148
     149            int i = 0;
     150            for (std::map<std::string, NamespaceNode*>::const_iterator it = this->subnodes_.begin(); it != this->subnodes_.end(); i++, ++it)
     151            {
     152                if (i > 0)
     153                    output += ", ";
     154
     155                output += (*it).second->toString();
     156            }
     157
     158            output += ")";
     159        }
     160
     161        return output;
     162    }
     163
     164    std::string NamespaceNode::toString(const std::string& indentation) const
     165    {
     166        std::string output = (indentation + this->name_ + "\n");
     167
     168        for (std::map<std::string, NamespaceNode*>::const_iterator it = this->subnodes_.begin(); it != this->subnodes_.end(); ++it)
     169            output += (*it).second->toString(indentation + "  ");
     170
     171        return output;
     172    }
    115173}
  • code/branches/core2/src/orxonox/core/NamespaceNode.h

    r895 r901  
    5353            bool includes(const NamespaceNode*) const;
    5454
     55            std::string toString() const;
     56            std::string toString(const std::string& indentation) const;
     57
    5558        private:
    5659            std::string name_;
  • code/branches/core2/src/orxonox/core/XMLPort.h

    r898 r901  
    256256                                            newObject->setNamespace(object->getNamespace());
    257257                                            if (this->bLoadBefore_)
     258                                            {
    258259                                                newObject->XMLPort(*child, true);
    259                                             COUT(4) << object->getLoaderIndentation() << "assigning " << child->Value() << " (objectname " << newObject->getName() << ") to " << this->classname_ << " (objectname " << object->getName() << ")" << std::endl;
     260                                                COUT(4) << object->getLoaderIndentation() << "assigning " << child->Value() << " (objectname " << newObject->getName() << ") to " << this->classname_ << " (objectname " << object->getName() << ")" << std::endl;
     261                                            }
     262                                            else
     263                                            {
     264                                                COUT(4) << object->getLoaderIndentation() << "assigning " << child->Value() << " (object not yet loaded) to " << this->classname_ << " (objectname " << object->getName() << ")" << std::endl;
     265                                            }
    260266                                            (*object.*this->loadfunction_)(newObject);
    261267                                            if (!this->bLoadBefore_)
Note: See TracChangeset for help on using the changeset viewer.