]> granicus.if.org Git - taglib/commitdiff
Added some missing detach()s to List<T>, ByteVector and String.
authorTsuda Kageyu <tsuda.kageyu@gmail.com>
Sat, 30 Nov 2013 23:57:26 +0000 (08:57 +0900)
committerTsuda Kageyu <tsuda.kageyu@gmail.com>
Fri, 8 Aug 2014 04:12:14 +0000 (13:12 +0900)
taglib/toolkit/tbytevector.cpp
taglib/toolkit/tlist.tcc
taglib/toolkit/tstring.cpp
tests/test_bytevector.cpp
tests/test_list.cpp
tests/test_map.cpp
tests/test_string.cpp

index 3404ab39b5e2d722168a692f702978b9194fda1d..abcaffc5b6af86700e75b49e5b71cf9f75299bec 100644 (file)
@@ -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<char> &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<char> &v = d->data->data;
-  return v.rbegin() + (v.size() - d->offset);
+  detach();
+  return d->data->data.rend();
 }
 
 ByteVector::ConstReverseIterator ByteVector::rend() const
index 72d4767b68b3d5a2d68b57fc333d5f3b822f14da..34df7fdddc4aad36c4f668a6e293b0a883f7fa6f 100644 (file)
@@ -208,6 +208,7 @@ bool List<T>::isEmpty() const
 template <class T>
 typename List<T>::Iterator List<T>::find(const T &value)
 {
+  detach();
   return std::find(d->list.begin(), d->list.end(), value);
 }
 
index 8287244ba0f5215b2965d6a4650b96a482f55385..c410deb4138a54e10e7a029a5ce0dc79e5f3fb2b 100644 (file)
@@ -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();
 }
 
index 5614f6954560f0841add7a87360c2d65a0a37a62..61b39e05d57abe06eda437ef80bb589319af1cf0 100644 (file)
@@ -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);
index 39cbaf0a65801517f9ea435e082a43ee82f25343..1b3156b574237f22710fbcd0ad1455cfc23c6aae 100644 (file)
@@ -51,8 +51,13 @@ public:
     l3.append(3);
     l3.append(4);
     CPPUNIT_ASSERT(l1 == l3);
+    
+    List<int> l4 = l1;
+    List<int>::Iterator it = l4.find(3);
+    *it = 33;
+    CPPUNIT_ASSERT_EQUAL(l1[2], 3);
+    CPPUNIT_ASSERT_EQUAL(l4[2], 33);
   }
-
 };
 
 CPPUNIT_TEST_SUITE_REGISTRATION(TestList);
index b6f77aae328cb96846dd49e69125df522d9f55d4..5fdea15798b1cab04e850729f9cbcec3d2bba257 100644 (file)
@@ -15,11 +15,21 @@ public:
 
   void testInsert()
   {
-    Map<String, int> m;
-    m.insert("foo", 3);
-    CPPUNIT_ASSERT_EQUAL(3, m["foo"]);
-    m.insert("foo", 7);
-    CPPUNIT_ASSERT_EQUAL(7, m["foo"]);
+    Map<String, int> 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<String, int> m2 = m1;
+    Map<String, int>::Iterator it = m2.find("bob");
+    (*it).second = 99;
+    CPPUNIT_ASSERT_EQUAL(m1["bob"], 9);
+    CPPUNIT_ASSERT_EQUAL(m2["bob"], 99);
   }
 
 };
index 40a21576692c30fe24dec45debcdd4cf7fc17947..c620c500f9748fa80d04907afd69bff02dcf8b0d 100644 (file)
@@ -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);