From 1944588595483a7341f9533d0955d58f0da0e2f0 Mon Sep 17 00:00:00 2001 From: Tsuda Kageyu Date: Sun, 1 Dec 2013 08:57:26 +0900 Subject: [PATCH] Added some missing detach()s to List, ByteVector and String. --- taglib/toolkit/tbytevector.cpp | 14 ++++++++------ taglib/toolkit/tlist.tcc | 1 + taglib/toolkit/tstring.cpp | 2 ++ tests/test_bytevector.cpp | 31 +++++++++++++++++++++++++++++++ tests/test_list.cpp | 7 ++++++- tests/test_map.cpp | 20 +++++++++++++++----- tests/test_string.cpp | 19 +++++++++++++++++++ 7 files changed, 82 insertions(+), 12 deletions(-) diff --git a/taglib/toolkit/tbytevector.cpp b/taglib/toolkit/tbytevector.cpp index 3404ab39..abcaffc5 100644 --- a/taglib/toolkit/tbytevector.cpp +++ b/taglib/toolkit/tbytevector.cpp @@ -714,7 +714,8 @@ ByteVector &ByteVector::resize(uint size, char padding) ByteVector::Iterator ByteVector::begin() { - return d->data->data.begin() + d->offset; + detach(); + return d->data->data.begin(); } ByteVector::ConstIterator ByteVector::begin() const @@ -724,7 +725,8 @@ ByteVector::ConstIterator ByteVector::begin() const ByteVector::Iterator ByteVector::end() { - return d->data->data.begin() + d->offset + d->length; + detach(); + return d->data->data.end(); } ByteVector::ConstIterator ByteVector::end() const @@ -734,8 +736,8 @@ ByteVector::ConstIterator ByteVector::end() const ByteVector::ReverseIterator ByteVector::rbegin() { - std::vector &v = d->data->data; - return v.rbegin() + (v.size() - (d->offset + d->length)); + detach(); + return d->data->data.rbegin(); } ByteVector::ConstReverseIterator ByteVector::rbegin() const @@ -746,8 +748,8 @@ ByteVector::ConstReverseIterator ByteVector::rbegin() const ByteVector::ReverseIterator ByteVector::rend() { - std::vector &v = d->data->data; - return v.rbegin() + (v.size() - d->offset); + detach(); + return d->data->data.rend(); } ByteVector::ConstReverseIterator ByteVector::rend() const diff --git a/taglib/toolkit/tlist.tcc b/taglib/toolkit/tlist.tcc index 72d4767b..34df7fdd 100644 --- a/taglib/toolkit/tlist.tcc +++ b/taglib/toolkit/tlist.tcc @@ -208,6 +208,7 @@ bool List::isEmpty() const template typename List::Iterator List::find(const T &value) { + detach(); return std::find(d->list.begin(), d->list.end(), value); } diff --git a/taglib/toolkit/tstring.cpp b/taglib/toolkit/tstring.cpp index 8287244b..c410deb4 100644 --- a/taglib/toolkit/tstring.cpp +++ b/taglib/toolkit/tstring.cpp @@ -316,6 +316,7 @@ const wchar_t *String::toCWString() const String::Iterator String::begin() { + detach(); return d->data.begin(); } @@ -326,6 +327,7 @@ String::ConstIterator String::begin() const String::Iterator String::end() { + detach(); return d->data.end(); } diff --git a/tests/test_bytevector.cpp b/tests/test_bytevector.cpp index 5614f695..61b39e05 100644 --- a/tests/test_bytevector.cpp +++ b/tests/test_bytevector.cpp @@ -41,6 +41,7 @@ class TestByteVector : public CppUnit::TestFixture CPPUNIT_TEST(testToHex); CPPUNIT_TEST(testNumericCoversion); CPPUNIT_TEST(testReplace); + CPPUNIT_TEST(testIterator); CPPUNIT_TEST_SUITE_END(); public: @@ -290,6 +291,36 @@ public: } } + void testIterator() + { + ByteVector v1("taglib"); + ByteVector v2 = v1; + + ByteVector::Iterator it1 = v1.begin(); + ByteVector::Iterator it2 = v2.begin(); + + CPPUNIT_ASSERT_EQUAL('t', *it1); + CPPUNIT_ASSERT_EQUAL('t', *it2); + + std::advance(it1, 4); + std::advance(it2, 4); + *it2 = 'I'; + CPPUNIT_ASSERT_EQUAL('i', *it1); + CPPUNIT_ASSERT_EQUAL('I', *it2); + + ByteVector::ReverseIterator it3 = v1.rbegin(); + ByteVector::ReverseIterator it4 = v2.rbegin(); + + CPPUNIT_ASSERT_EQUAL('b', *it3); + CPPUNIT_ASSERT_EQUAL('b', *it4); + + std::advance(it3, 4); + std::advance(it4, 4); + *it4 = 'A'; + CPPUNIT_ASSERT_EQUAL('a', *it3); + CPPUNIT_ASSERT_EQUAL('A', *it4); + } + }; CPPUNIT_TEST_SUITE_REGISTRATION(TestByteVector); diff --git a/tests/test_list.cpp b/tests/test_list.cpp index 39cbaf0a..1b3156b5 100644 --- a/tests/test_list.cpp +++ b/tests/test_list.cpp @@ -51,8 +51,13 @@ public: l3.append(3); l3.append(4); CPPUNIT_ASSERT(l1 == l3); + + List l4 = l1; + List::Iterator it = l4.find(3); + *it = 33; + CPPUNIT_ASSERT_EQUAL(l1[2], 3); + CPPUNIT_ASSERT_EQUAL(l4[2], 33); } - }; CPPUNIT_TEST_SUITE_REGISTRATION(TestList); diff --git a/tests/test_map.cpp b/tests/test_map.cpp index b6f77aae..5fdea157 100644 --- a/tests/test_map.cpp +++ b/tests/test_map.cpp @@ -15,11 +15,21 @@ public: void testInsert() { - Map m; - m.insert("foo", 3); - CPPUNIT_ASSERT_EQUAL(3, m["foo"]); - m.insert("foo", 7); - CPPUNIT_ASSERT_EQUAL(7, m["foo"]); + Map m1; + m1.insert("foo", 3); + CPPUNIT_ASSERT_EQUAL(3, m1["foo"]); + m1.insert("foo", 7); + CPPUNIT_ASSERT_EQUAL(7, m1["foo"]); + + m1.insert("alice", 5); + m1.insert("bob", 9); + m1.insert("carol", 11); + + Map m2 = m1; + Map::Iterator it = m2.find("bob"); + (*it).second = 99; + CPPUNIT_ASSERT_EQUAL(m1["bob"], 9); + CPPUNIT_ASSERT_EQUAL(m2["bob"], 99); } }; diff --git a/tests/test_string.cpp b/tests/test_string.cpp index 40a21576..c620c500 100644 --- a/tests/test_string.cpp +++ b/tests/test_string.cpp @@ -44,6 +44,7 @@ class TestString : public CppUnit::TestFixture CPPUNIT_TEST(testSubstr); CPPUNIT_TEST(testNewline); CPPUNIT_TEST(testEncode); + CPPUNIT_TEST(testIterator); CPPUNIT_TEST_SUITE_END(); public: @@ -280,6 +281,24 @@ public: CPPUNIT_ASSERT(empty7.empty()); } + void testIterator() + { + String s1 = "taglib string"; + String s2 = s1; + + String::Iterator it1 = s1.begin(); + String::Iterator it2 = s2.begin(); + + CPPUNIT_ASSERT_EQUAL(L't', *it1); + CPPUNIT_ASSERT_EQUAL(L't', *it2); + + std::advance(it1, 4); + std::advance(it2, 4); + *it2 = L'I'; + CPPUNIT_ASSERT_EQUAL(L'i', *it1); + CPPUNIT_ASSERT_EQUAL(L'I', *it2); + } + }; CPPUNIT_TEST_SUITE_REGISTRATION(TestString);