$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-users] Problem of scope with the replace in static data structure
From: Rodrigo Dias Ferreira (rodrigodias_at_[hidden])
Date: 2009-02-10 04:51:01
Hi there,
I am having a problem with Boost.MultiIndex (I'm using Boost 1.37).
So the problem is the following:
I am using a static data structure, an index which I use as my graph repository:
/// Data member to represent the graph repository (using ordered_unique index)
        static graphIndex _graphRep;
which is from the type graphIndex:
///ordered_unique Index in the data structure graph_hm
typedef multi_index_container<
        graphMap,
        indexed_by<
                ordered_unique<
                        BOOST_MULTI_INDEX_MEMBER(graphMap,string,_name)
		>
	>
> graphIndex;
Here is the graphMap:
/// GraphMap: Data Structure for setting an index in the uniqueGraphName and retrieving handler Graph_h
struct graphMap {
        string _name;
        Graph _graph;
        /// Default Constructor
        graphMap(){}
        /// Constructor with parameters: initialize the name and graph
        graphMap(string uniqueGraphName, Graph graph) :
                _name(uniqueGraphName),	_graph (graph) {}
        /// Constructor with parameters: initialize the name and graph
        graphMap(const graphMap &gm) : _name(gm._name), _graph (gm._graph) {}
};
For manipulating the graphs, I use a Graph_h (handler), which does a copy from the graph from this repository, does the changes in the local copy, and then the user has to call commitChanges(); to apply it in the repository (which I am using the replace function from the MultiIndex to commit it).
The problem it is that inside the commitChanges(); I can retrieve from the repository through the find function (from MultiIndex).
But when I the main program, it does not work (remark: I am trying right after calling the commitChanges();
It founds the graph, but it seems to be the old one, and I cannot retrieve the nodes...
Why is that happening?
Here it is a stretch of code from the main:
//Test of the commit
                                if (graph_h.commitChanges())
                                        cout << "Commit was successful!\n";
                                else
                                        cout << "Commit was unsuccessful!\n";
                                // Debug
                                //Graph_h graph_h;
                                //NodeIterator nodeIt;
                                //Node_h node_h;
                                graphIt it = DynamicGraphs::_graphRep.find("COI:0351-123-4555");
                                graph_h = Graph_h(it);
                                //propertystream_h propS;
                                propS = graph_h->lookupLocalProp("name");
                                p_h = propS.next();
                                cout << "DEBUG_at_main:right after the commit:_git " << p_h.value() <<endl;
                                nodeIt = graph_h->nodeIterator("Node:0351-123-4569");
                                        if (!nodeIt)
                                                cout << "Node version was not found!"<<endl;
                                        else //Works for both: one match and range lookup
                                                while (!nodeIt.end()){
                                                        node_h = nodeIt.next();
                                                        cout << "Found it: " << *node_h;
                                                }
                                //Debug
And here it is the code from inside the commit, which it works!!!
bool Graph_h::commitChanges(){
        bool success;
        propertystream_h ps_h = _localGraph.lookupLocalProp("name");
        //Exception handling in the case does not find the name property
        property_h p_h = ps_h.next();
        //TODO: Revise about the setting of the time in the graph... too stable
        _localGraph.resetTimeRange();
        // Debug
        cout << "DEBUG_at_commitChanges:before replacing:_git Name: " << p_h.value() <<endl;
        Graph_h graph_h;
        NodeIterator nodeIt;
        Node_h node_h;
        graphIt it = DynamicGraphs::_graphRep.find("COI:0351-123-4555");
        graph_h = Graph_h(it);
        nodeIt = graph_h->nodeIterator("Node:0351-123-4569");
                if (!nodeIt)
                        cout << "Node version was not found!"<<endl;
                else //Works for both: one match and range lookup
                        while (!nodeIt.end()){
                                node_h = nodeIt.next();
                                cout << "Found it: " << *node_h;
                        }
        //Debug
        success = DynamicGraphs::_graphRep.replace(_git, graphMap(p_h.value(),_localGraph));
        // Debug
        cout << "DEBUG_at_commitChanges:after replacing:_git Name: " << p_h.value() <<endl;
        it = DynamicGraphs::_graphRep.find("COI:0351-123-4555");
        graph_h = Graph_h(it);
        nodeIt = graph_h->nodeIterator("Node:0351-123-4569");
                if (!nodeIt)
                        cout << "Node version was not found!"<<endl;
                else //Works for both: one match and range lookup
                        while (!nodeIt.end()){
                                node_h = nodeIt.next();
                                cout << "Found it: " << *node_h;
                        }
        //Debug
        return success;
}
I hope someone can help me..
thanks in advance,
                               Rodrigo
-- ************************************************* Rodrigo Dias Ferreira Master Student of Computational Engineering Technische Universität Dresden - Germany Mobile Phone:+49 171 3158797 E-mail: rodrigodias_at_[hidden] ************************************************* Jetzt 1 Monat kostenlos! GMX FreeDSL - Telefonanschluss + DSL für nur 17,95 Euro/mtl.!* http://dsl.gmx.de/?ac=OM.AD.PD003K11308T4569a