diff --git a/STL_Extension/include/CGAL/Skiplist.h b/STL_Extension/include/CGAL/Skiplist.h index 59db1f7b885..81e289f23de 100644 --- a/STL_Extension/include/CGAL/Skiplist.h +++ b/STL_Extension/include/CGAL/Skiplist.h @@ -216,16 +216,18 @@ public: /// Insert \c t before \c pos in the all_view. \t will not be inserted into the skip view. /// @returns an skip_iterator to the inserted element. - skip_iterator insert(all_iterator pos, const value_type& t) + all_iterator insert(all_iterator pos, const value_type& t) { - return skip_.iterator_to(*all_.insert(pos.base(), *new Node(t))); + return all_.insert(pos.base(), *new Node(t)); } - // /// Insert \c t before \c pos in the all_view. \t will be inserted into the skip view. - // /// @returns an iterator to the inserted element. - // skip_iterator insert(skip_iterator pos, const value_type& t) - // { - // } + /// Insert \c t before \c pos in the all_view. \t will be inserted into the skip view. + /// @returns an iterator to the inserted element. + skip_iterator insert(skip_iterator pos, const value_type& t) + { + all_iterator it = insert(static_cast(pos), t); + return skip_.insert(pos.base(), *it.base()); + } /// Insert the range [begin,end) into the all view. If the container /// is empty() the range will also be visible in the skip view. @@ -243,6 +245,17 @@ public: } } + /// Drop the contents of iterator \c it from both views. + + all_iterator erase(all_iterator it) + { + if(!is_skipped(it)) { + skip_.erase(skip_.iterator_to(*it.base())); + } + + return all_.erase_and_dispose(it.base(), Node_disposer()); + } + size_type all_size() const { return all_.size(); } diff --git a/STL_Extension/test/STL_Extension/test_skiplist.cpp b/STL_Extension/test/STL_Extension/test_skiplist.cpp index 8aa493c50f1..e84cbf8f5a4 100644 --- a/STL_Extension/test/STL_Extension/test_skiplist.cpp +++ b/STL_Extension/test/STL_Extension/test_skiplist.cpp @@ -58,7 +58,7 @@ BOOST_FIXTURE_TEST_CASE( test_insert, Fixture ) all.begin(), all.end()); BOOST_CHECK_EQUAL_COLLECTIONS(l.skip_begin(), l.skip_end(), skips.begin(), skips.end()); - + // the same goes for inserting at an arbitrary position skip::all_iterator pos = boost::next(l.all_begin(), 3); l.insert(boost::next(l.all_begin(), 3) @@ -203,6 +203,29 @@ BOOST_FIXTURE_TEST_CASE( test_implicit_conversion, Fixture ) BOOST_CHECK(all == l.all_begin()); } +BOOST_FIXTURE_TEST_CASE( test_erase, Fixture ) +{ + // erase 3 + l.erase(boost::next(l.all_begin(), 2)); + skips.erase(std::remove(skips.begin(), skips.end(), 3), skips.end()); + all.erase(std::remove(all.begin(), all.end(), 3), all.end()); + BOOST_CHECK_EQUAL_COLLECTIONS(l.skip_begin(), l.skip_end(), + skips.begin(), skips.end()); + BOOST_CHECK_EQUAL_COLLECTIONS(l.all_begin(), l.all_end(), + all.begin(), all.end()); + + // skip 2 first and then erase it + l.skip(boost::next(l.all_begin())); + skips.erase(std::remove(skips.begin(), skips.end(), 2), skips.end()); + all.erase(std::remove(all.begin(), all.end(), 2), all.end()); + l.erase(boost::next(l.all_begin())); + BOOST_CHECK_EQUAL_COLLECTIONS(l.skip_begin(), l.skip_end(), + skips.begin(), skips.end()); + BOOST_CHECK_EQUAL_COLLECTIONS(l.all_begin(), l.all_end(), + all.begin(), all.end()); +} + + // trick cgal_create_cmake_script // int main() // {