Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- if (s_before <= elemsbefore) {
- std::cerr << "In priv_range_insert_expand_backwards possibility 4/8 "<< std::endl;
- //The raw memory divides the old_begin group:
- //
- //If we need two phase construction (do_after)
- //new group is divided in new = new_beg + new_end groups
- //In this phase only new_beg will be inserted
- //
- //Old situation:
- // _________________________________________________
- //| raw_mem | old_begin | old_end | raw_mem |
- //|_________|___________|_________|_________________|
- //
- //New situation with do_after(1):
- //This is not definitive situation, the second phase
- //will include
- // _________________________________________________
- //| old_begin | new_beg | old_end | raw_mem |
- //|___________|_________|_________|_________________|
- //
- //New situation without do_after:
- // _________________________________________________
- //| old_begin | new | old_end | raw_mem |
- //|___________|_____|_________|_____________________|
- //
- //Copy the first part of old_begin to raw_mem
- T *start_n = old_start + difference_type(s_before);
- ::BOOST_CONTAINER_MOVE_NAMESPACE::uninitialized_move(old_start, start_n, new_start);
- //The buffer is all constructed until old_end,
- //release destroyer and update size
- old_values_destroyer.release();
- this->members_.m_size = old_size + s_before;
- //Now copy the second part of old_begin overwriting himself
- T* next = BOOST_CONTAINER_MOVE_NAMESPACE::move(start_n, pos, old_start);
- if(do_after){
- std::cerr << "In priv_range_insert_expand_backwards possibility 4/8 and do_after"<< std::endl;
- //Now copy the new_beg elements
- interf.copy_some_and_update(next, s_before, true);
- }
- else{
- std::cerr << "In priv_range_insert_expand_backwards possibility 4/8 and NOT do_after"<< std::endl;
- //Now copy the all the new elements
- interf.copy_all_to(next);
- T* move_start = next + n;
- //Now displace old_end elements
- T* move_end = BOOST_CONTAINER_MOVE_NAMESPACE::move(pos, old_finish, move_start);
- //Destroy remaining moved elements from old_end except if
- //they have trivial destructor after being moved
- difference_type n_destroy = s_before - n;
- if(!value_traits::trivial_dctr_after_move)
- this->destroy_n(move_end, n_destroy);
- this->members_.m_size -= n_destroy;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement