Question

I have just noticed that i am not able to make changes in the boost multi index container elements. Is this true? (based on the following simplified code) look at the "update" function:

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/random_access_index.hpp>
#include <boost/multi_index/identity.hpp>
#include <boost/multi_index/member.hpp>
namespace sim_mob
{
enum TrafficColor
{
    Red =1,             ///< Stop, do not go beyond the stop line.
    Amber = 2,          ///< Slow-down, prepare to stop before the stop line.
    Green = 3,          ///< Proceed either in the forward, left, or right direction.
    FlashingRed = 4,    ///future use
    FlashingAmber = 5,  ///future use
    FlashingGreen = 6   ///future use
};
//Forward declarations
class Link
{
public:
    int aa;
};

//////////////some bundling ///////////////////
using namespace ::boost;
using namespace ::boost::multi_index;

typedef struct
{
    sim_mob::Link *LinkTo;
    sim_mob::Link *LinkFrom;
//  ColorSequence colorSequence;
    TrafficColor currColor;
} linkToLink;


typedef multi_index_container<
    linkToLink,
    indexed_by<                                                                    // index
        random_access<>,//0
        ordered_non_unique< member<linkToLink,sim_mob::Link *, &linkToLink::LinkTo> >,  // 1
        ordered_non_unique< member<linkToLink,sim_mob::Link *, &linkToLink::LinkFrom> >  // 2
    >
> links_map;
class Phase
{
public:
    typedef links_map::nth_index_iterator<1>::type LinkTo_Iterator;
    Phase(double CycleLenght,std::size_t start, std::size_t percent): cycleLength(CycleLenght),startPecentage(start),percentage(percent){
    };

    void update(double lapse)
    {
        links_map_[0].currColor = Red;
    }

    std::string name;
private:
    sim_mob::links_map links_map_;

};
}//namespace

int main()
{
    sim_mob::Phase F(100,70,30);
}

No need to go through entire program. just note that, in the update method, I get this error: multiIndex$ c++ exp2.cpp exp2.cpp: In member function ‘void sim_mob::Phase::update(double)’: exp2.cpp:69:29: error: assignment of member ‘sim_mob::linkToLink::currColor’ in read-only object

I just read in the boost tutorial that iterators only grant const access. How can I go around this issue? thank you for your help

Was it helpful?

Solution

Three different ways of changing elements in a multi-index container. You can use links_map_.replace(iterator, new_value) to replace an existing element with a new one. You can use links_map_.modify(iterator, unaryFunctionObject) to change the element with a modifier object. And finally, if a member variable is not part of any index, you can declare it as mutable and change it directly. In your example, the latter should work fine.

For the other two ways, take a look at the specification of the member function replace and modify in the Boost.MultiIndex Documentation.

Edit: In your specific case, the approach with mutable might look like this:

struct linkToLink
{
    sim_mob::Link* LinkTo;
    sim_mob::Link* LinkFrom;
    // simplify write operations to this variable if used in a multi-index
    // container - bypassing the const-ness. This is possible, because the
    // variable is not part of any index.
    mutable TrafficColor currColor;
};
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top