Boost logo

Boost Users :

Subject: Re: [Boost-users] Update the index of a hashed_non_unique entry in boost::multiindex
From: Dominique Devienne (ddevienne_at_[hidden])
Date: 2016-10-24 03:54:20


On Mon, Oct 24, 2016 at 9:27 AM, Ram <sourceopen_at_[hidden]> wrote:

> I am not sure I understood a few things you said like, [...]
> Does this, [...] mean I would need to iterate using the unique key
> and find the object I want to update and change this non-unique key to the
> new one?
>

No. Perhaps the pseudo C++11 code below will help?
Lets assume your unique index is the first index (index = 0),
and the non-unique one is second index (index = 1).

using bmi_t = ...;
bmi_t& bmi = /*get the BMI container*/;
auto& uniq_idx = bmi.get<0>();
auto unique_idx_iter = uniq_idx.find(uniq_key);
if (unique_idx_iter == uniq_idx.end()) return;
auto nonunique_iter = bmi.project<1>(unique_idx_iter);
auto& nonuniq_idx = bmi.get<0>();
bool ok = nonuniq_idx.modify(nonunique_iter,
[&new_value](bmi_t::value_type& element) {
  element.setNonUniqueIdString(new_value);
});

if the modification could be veto'd by any of your indexes,
you'd probably use the overload with a Rollback functor.

For actual code, I'm sure there's an example in your Boost install. --DD

PS: If you don't have a unique index and unique key for your element,
then indeed you need to iterate on your container (or non-unique index),
and figure out in an ad-hoc way which exact element you want to modify.
(and need to project<1>() only if not iterating on the index you want to
modify).



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