|
Boost Users : |
From: Patel Priyank-PPATEL1 (priyankpatel_at_[hidden])
Date: 2006-04-17 15:36:25
Hi Joaquin,
First of all thanks for your time and response. I have it working as follows, but seems I have to recalculate iterators if in case I later on modify group associated with that access point. Is there any way that iterators will know automatically update when I update access point in future to some other group?
Let me know if you have come across that one. I am going to look in your code in detail and get back to you in case of any questions.
Thanks
Priyank
// class Access point test
class Access_Point {
public:
Access_Point(int id, int paging_group):id_(id), pg_(paging_group) {
}
bool by_id(int _id) const {
return (_id == id_);
}
int paging_group(int _pg) const {
return (_pg == pg_);
}
int id() const {
return id_;
}
int pg() const {
return pg_;
}
int pg(int _pg) {
pg_ = _pg;
}
friend ostream& operator << (ostream& _os, const Access_Point& _ap);
private:
int id_;
int pg_;
};
ostream& operator << (ostream& _os, const Access_Point& _ap)
{
_os << "Id: " << _ap.id_ << "Pg: " << _ap.pg_ << endl;
return _os;
}
// tag ids
struct hashed_objs {
};
struct paging_group {
};
// Create multi index container
typedef multi_index_container<
Access_Point*,
indexed_by<
hashed_unique<
tag<hashed_objs>, const_mem_fun<Access_Point, int, &Access_Point::id> >,
ordered_non_unique <
tag<paging_group>, const_mem_fun<Access_Point, int, &Access_Point::pg>
>
>
> Access_Points;
int ACE_MAIN (int, ACE_TCHAR *[])
{
// ACCESS POINT CHECK
Access_Points pool;
Access_Point * a1 = new Access_Point(1, 1);
Access_Point * a2 = new Access_Point(2, 1);
Access_Point * a3 = new Access_Point(3, 2);
Access_Point * a4 = new Access_Point(4, 1);
// insert all the access points
pool.insert(a1);
pool.insert(a2);
pool.insert(a3);
// get iterator
index_iterator<Access_Points, paging_group>::type pg0, pg1;
boost::tuples::tie(pg0, pg1) = get<paging_group> (pool).equal_range(1);
pool.insert(a4);
// print all that is there
while (pg0 != pg1) {
cout << *(*pg0) << endl;
pg0++;
}
// change paging group from access point 4
a4->pg(2);
// NEED TO RECALCULATE ITERATORS
boost::tuples::tie(pg0, pg1) = get<paging_group> (pool).equal_range(1);
while (pg0 != pg1) {
cout << *(*pg0) << endl;
pg0++;
}
// return success
return 0;
}
-----Original Message-----
From: boost-users-bounces_at_[hidden] [mailto:boost-users-bounces_at_[hidden]] On Behalf Of Joaquin M Lopez Munoz
Sent: Monday, April 17, 2006 2:26 PM
To: boost-users_at_[hidden]
Subject: Re: [Boost-users][multi_index] Sorting object based on some specified criteria !!
Patel Priyank-PPATEL1 <priyankpatel <at> motorola.com> writes:
>
>
> Hi
> all,
>
>
> I have following
> kind of class and having some identifier and group id associated with
> particular procedure. I want to know if I have to get the procedures
> relating particular
>
> group for ex.
> (groupId == 1). How do I do using multiindex container? Can somebody
> please give me some hint or code if they have done something similar
> to what I want to do?
>
Hello Priyank, I'm not sure I've understood what you're after, but let me try anyway:
As you'll search for group, you'll need an additional index (the one you've set up is based on process ID). The following has not been compiled, beware typos:
struct id {};
struct group {};
typedef
multi_index_container<
Procedure*,
indexed_by<
hashed_unique<
tag<id>,
const_mem_fun<Procedure, int, &Procedure::get_id> >
>,
hashed_non_unique<
tag<group>,
const_mem_fun<Procedure, int, &Procedure::get_group> >
>
>
>
Procedure_Hashed_Pool;
typedef Procedure_Hashed_Pool::
index<id>::type Procedure_By_Id;
typedef Procedure_Hashed_Pool::
index<group>::type Procedure_By_Group;
(I've decided to make the new index hashed non-unique, you could also have it ordered non-unique if you need the elements to be sorted by group ID --hashing only guarantees fast retrieval.) And now you can simply use equal_range() on this index to do what you want:
int gr=...;
const Procedure_By_Group& procedure_bg=
procedure_pool.get<group>();
std::pair<
Procedure_By_Group::iterator,
Procedure_By_Group::iterator
> p=procedure_bg.equal_range(gr);
p will hold the range of elements with group ID == gr.
Is this what you were after?
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
_______________________________________________
Boost-users mailing list
Boost-users_at_[hidden]
http://lists.boost.org/mailman/listinfo.cgi/boost-users
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