boost::multi_index переиндексация
От: nen777w  
Дата: 21.03.08 22:30
Оценка:
Есть такой контейнер, который упорядочен и по уникальному 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 — вроде бы тоже не применим

Как вариант можно сохранить значение итератора, потом стереть эллемент по итератору и опять вставить соранённое значение.
Но мне кажется что можно сделать средствами буста и быстрее и проще.
Можете подсказать как?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.