Boost logo

Boost Users :

Subject: [Boost-users] multi-index-container with nested templates => problem getting iterator on 2nd index.
From: JohnQ (jqs_at_[hidden])
Date: 2009-05-13 15:23:16


Hi,

I'm really stuck on this one, so I'm hoping someone can lend me a hand.
 Basically, I'm defining a templated multi-index-container to hold one piece
of data along with two indexes to that data. Next, I'm wrapping that in
another templated class that will handle concurrent access to that
structure.

My problem is that I'm having trouble figuring out how to define a type that
will give me an interator on the 2nd index of the
multi-index-container ("bimimapIterator2"
below).

I'm basing this on the Boost multi-index-container example here:
http://www.boost.org/doc/libs/1_39_0/libs/multi_index/example/bimap.cpp

Here's what I have...

//********************************************************************
// multi-index-container
//********************************************************************

struct index1{};
struct index2{};

template<typename Key1,typename Key2, typename Data>
struct bimultimap
{
  typedef boost::tuple<Key1,Key2,Data> value_type;

  typedef boost::multi_index_container<
    value_type,
    indexed_by<
      ordered_non_unique<
        tag<index1>,member<value_type,Key1,&value_type::first> >,
      ordered_non_unique<
        tag<index2>,member<value_type,Key2,&value_type::second> >
>
> bimimap;

};

//********************************************************************
// concurrent access class.
//********************************************************************

template<typename Key1, typename Key2, typename Data>
class concurrent_bimultimap
{
private:
    typename bimultimap<Key1, Key2, Data>::bimimap the_bimultimap;
    mutable boost::mutex the_mutex;
    boost::condition_variable the_condition_variable;

public:
 typedef typename bimultimap<Key1,Key2,Data>::bimimap bimimapType;
typedef typename bimultimap<Key1,Key2,Data>::bimimap::iterator
bimimapIterator;
typedef typename
bimultimap<Key1,Key2,Data>::bimimap::index<index2>::type::iterator
bimimapIterator2;

void insert(Key1 const& key1, Key2 const& key2, Data const& data)
{
 boost::mutex::scoped_lock lock(the_mutex);
 the_bimultimap.insert(
bimultimap<Key1,Key2,Data>::bimimap::value_type(key1,key2,data) );

 lock.unlock();
// Note: because we unlock above and notify below, we can starve the "pop"
thread for short durations in burst situations. That's ok so far.
 the_condition_variable.notify_one();
}

bool findKey1(Key1& key1, Data& data)
{
boost::mutex::scoped_lock lock(the_mutex);
 bimimapIterator itFindIt = the_bimultimap.find(key1);
if (itFindIt != the_bimultimap.end()) {
data = itFindIt->third;
return true;
}
else return false;
}
 bool findKey2(Key2& key2, Data& data)
{
boost::mutex::scoped_lock lock(the_mutex);

 bimimapIterator2 itFindIt = the_bimultimap.get<index2>().find(key2);

 if (itFindIt != the_bimultimap.get<index2>().end()) {
data = itFindIt->third;
return true;
}
else return false;
}

..... there's more but this gives the essence of the problem ....

};



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net