| 601 | } |
| 602 | |
| 603 | void concurrent_vector_base_v3::internal_swap(concurrent_vector_base_v3& v) |
| 604 | { |
| 605 | size_type my_sz = my_early_size.load<acquire>(); |
| 606 | size_type v_sz = v.my_early_size.load<relaxed>(); |
| 607 | if(!my_sz && !v_sz) return; |
| 608 | |
| 609 | bool my_was_short = (my_segment.load<relaxed>() == my_storage); |
| 610 | bool v_was_short = (v.my_segment.load<relaxed>() == v.my_storage); |
| 611 | |
| 612 | //In C++11, this would be: swap(my_storage, v.my_storage); |
| 613 | for (int i=0; i < pointers_per_short_table; ++i){ |
| 614 | swap(my_storage[i], v.my_storage[i]); |
| 615 | } |
| 616 | tbb::internal::swap<relaxed>(my_first_block, v.my_first_block); |
| 617 | tbb::internal::swap<relaxed>(my_segment, v.my_segment); |
| 618 | if (my_was_short){ |
| 619 | v.my_segment.store<relaxed>(v.my_storage); |
| 620 | } |
| 621 | if(v_was_short){ |
| 622 | my_segment.store<relaxed>(my_storage); |
| 623 | } |
| 624 | |
| 625 | my_early_size.store<relaxed>(v_sz); |
| 626 | v.my_early_size.store<release>(my_sz); |
| 627 | } |
| 628 | |
| 629 | } // namespace internal |
| 630 |
no test coverage detected