Есть такой контейнер, который упорядочен и по уникальному ID и по неуникальному композиному S с BYPP
struct SSS
{
SSS( unsigned id, unsigned aS, unsigned aBYPP )
: S(aS)
, BYPP(aBYPP)
, ID(id)
{}
unsigned get_tex_prop_FREE_S() { return S; }
unsigned get_tex_prop_BYPP() { return BYPP; }
unsigned get_tex_prop_ID() { return ID; }
void do_change_S() { изменяется... S }
unsigned ID, S, BYPP;
};
//pointer to SSS
typedef boost::shared_ptr< SSS > ptr_videotexture;
//tags
struct VIDEO_TEX_ID{};
struct VIDEO_TEX_S_BYPP{};
//extractors
struct extractor_tex_FREE_S
{
typedef unsigned result_type;
PGINLINE result_type operator()( const ptr_videotexture& tex ) const
{
return tex->get_tex_prop_FREE_S();
}
};
struct extractor_tex_BYPP
{
typedef unsigned result_type;
PGINLINE result_type operator()( const ptr_videotexture& tex ) const
{
return tex->get_tex_prop_BYPP();
}
};
struct extractor_tex_ID
{
typedef unsigned result_type;
PGINLINE result_type operator()( const ptr_videotexture& tex ) const
{
return tex->get_tex_prop_ID();
}
};
//container
typedef boost::multi_index_container <
ptr_videotexture
, boost::multi_index::indexed_by <
boost::multi_index::ordered_unique <
boost::multi_index::tag<VIDEO_TEX_ID> //tag
, extractor_tex_ID
, std::less<unsigned> //key extractor
>
, boost::multi_index::ordered_non_unique <
boost::multi_index::tag<VIDEO_TEX_S_BYPP>, //tag
boost::multi_index::composite_key < //key extractor
ptr_videotexture
, extractor_tex_BYPP
, extractor_tex_FREE_S
> //composite
> //non unique
> // indexes
> //multi index
video_tex; //container type
//iterators
typedef video_tex::index<VIDEO_TEX_ID>::type::iterator itr_ID_video_tex_container;
typedef video_tex::index<VIDEO_TEX_S_BYPP>::type::iterator itr_FREE_S_BYPP_video_tex_container;
video_tex m_video_tex;
В какой момент времени в коде заставляют пересчитать S делают так:
itr_ID_video_tex_container itr = m_video_tex.get<VIDEO_TEX_ID>().find( *video_tex_id );
(*itr)->do_change_S();
Как теперь заставить контейнер переиндексировать эллементы.
replace — делать нельзя так как имеем уникальное ID,
modify — вроде бы тоже не применим
Как вариант можно сохранить значение итератора, потом стереть эллемент по итератору и опять вставить соранённое значение.
Но мне кажется что можно сделать средствами буста и быстрее и проще.
Можете подсказать как?