Advertisement
Guest User

Untitled

a guest
Jul 19th, 2012
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.88 KB | None | 0 0
  1.          if (s_before <= elemsbefore) {
  2.              std::cerr << "In priv_range_insert_expand_backwards possibility 4/8 "<< std::endl;
  3.             //The raw memory divides the old_begin group:
  4.             //
  5.             //If we need two phase construction (do_after)
  6.             //new group is divided in new = new_beg + new_end groups
  7.             //In this phase only new_beg will be inserted
  8.             //
  9.             //Old situation:
  10.             // _________________________________________________
  11.             //| raw_mem | old_begin | old_end |  raw_mem        |
  12.             //|_________|___________|_________|_________________|
  13.             //
  14.             //New situation with do_after(1):
  15.             //This is not definitive situation, the second phase
  16.             //will include
  17.             // _________________________________________________
  18.             //| old_begin | new_beg | old_end |  raw_mem        |
  19.             //|___________|_________|_________|_________________|
  20.             //
  21.             //New situation without do_after:
  22.             // _________________________________________________
  23.             //| old_begin | new | old_end |  raw_mem            |
  24.             //|___________|_____|_________|_____________________|
  25.             //
  26.             //Copy the first part of old_begin to raw_mem
  27.             T *start_n = old_start + difference_type(s_before);
  28.             ::BOOST_CONTAINER_MOVE_NAMESPACE::uninitialized_move(old_start, start_n, new_start);
  29.             //The buffer is all constructed until old_end,
  30.             //release destroyer and update size
  31.             old_values_destroyer.release();
  32.             this->members_.m_size = old_size + s_before;
  33.             //Now copy the second part of old_begin overwriting himself
  34.             T* next = BOOST_CONTAINER_MOVE_NAMESPACE::move(start_n, pos, old_start);
  35.             if(do_after){
  36.              std::cerr << "In priv_range_insert_expand_backwards possibility 4/8 and do_after"<< std::endl;
  37.                //Now copy the new_beg elements
  38.                interf.copy_some_and_update(next, s_before, true);
  39.             }
  40.             else{
  41.              std::cerr << "In priv_range_insert_expand_backwards possibility 4/8  and  NOT do_after"<< std::endl;
  42.                //Now copy the all the new elements
  43.                interf.copy_all_to(next);
  44.                T* move_start = next + n;
  45.                //Now displace old_end elements
  46.                T* move_end   = BOOST_CONTAINER_MOVE_NAMESPACE::move(pos, old_finish, move_start);
  47.                //Destroy remaining moved elements from old_end except if
  48.                //they have trivial destructor after being moved
  49.                difference_type n_destroy = s_before - n;
  50.                if(!value_traits::trivial_dctr_after_move)
  51.                   this->destroy_n(move_end, n_destroy);
  52.                this->members_.m_size -= n_destroy;
  53.             }
  54.          }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement