From 70334edd1998deeae98087578bcda06b5fcf565e Mon Sep 17 00:00:00 2001
From: Tsuda Kageyu <tsuda.kageyu@gmail.com>
Date: Fri, 4 Nov 2016 16:43:14 +0900
Subject: [PATCH] Add List::swap() and Map::swap().

---
 taglib/toolkit/tlist.h   |  5 +++++
 taglib/toolkit/tlist.tcc | 20 +++++++++++---------
 taglib/toolkit/tmap.h    |  5 +++++
 taglib/toolkit/tmap.tcc  | 20 +++++++++++---------
 4 files changed, 32 insertions(+), 18 deletions(-)

diff --git a/taglib/toolkit/tlist.h b/taglib/toolkit/tlist.h
index 6b4aa0a5..377b8248 100644
--- a/taglib/toolkit/tlist.h
+++ b/taglib/toolkit/tlist.h
@@ -229,6 +229,11 @@ namespace TagLib {
      */
     List<T> &operator=(const List<T> &l);
 
+    /*!
+     * Exchanges the content of this list by the content of \a l.
+     */
+    void swap(List<T> &l);
+
     /*!
      * Compares this list with \a l and returns true if all of the elements are
      * the same.
diff --git a/taglib/toolkit/tlist.tcc b/taglib/toolkit/tlist.tcc
index a55eb620..478f0983 100644
--- a/taglib/toolkit/tlist.tcc
+++ b/taglib/toolkit/tlist.tcc
@@ -89,9 +89,9 @@ public:
 ////////////////////////////////////////////////////////////////////////////////
 
 template <class T>
-List<T>::List()
+List<T>::List() :
+  d(new ListPrivate<T>())
 {
-  d = new ListPrivate<T>;
 }
 
 template <class T>
@@ -283,16 +283,18 @@ const T &List<T>::operator[](unsigned int i) const
 template <class T>
 List<T> &List<T>::operator=(const List<T> &l)
 {
-  if(&l == this)
-    return *this;
-
-  if(d->deref())
-    delete d;
-  d = l.d;
-  d->ref();
+  List<T>(l).swap(*this);
   return *this;
 }
 
+template <class T>
+void List<T>::swap(List<T> &l)
+{
+  using std::swap;
+
+  swap(d, l.d);
+}
+
 template <class T>
 bool List<T>::operator==(const List<T> &l) const
 {
diff --git a/taglib/toolkit/tmap.h b/taglib/toolkit/tmap.h
index c24c7636..f54e5a2a 100644
--- a/taglib/toolkit/tmap.h
+++ b/taglib/toolkit/tmap.h
@@ -174,6 +174,11 @@ namespace TagLib {
      */
     Map<Key, T> &operator=(const Map<Key, T> &m);
 
+    /*!
+     * Exchanges the content of this map by the content of \a m.
+     */
+    void swap(Map<Key, T> &m);
+
   protected:
     /*
      * If this List is being shared via implicit sharing, do a deep copy of the
diff --git a/taglib/toolkit/tmap.tcc b/taglib/toolkit/tmap.tcc
index c1227f3a..2e4ed5eb 100644
--- a/taglib/toolkit/tmap.tcc
+++ b/taglib/toolkit/tmap.tcc
@@ -48,9 +48,9 @@ public:
 };
 
 template <class Key, class T>
-Map<Key, T>::Map()
+Map<Key, T>::Map() :
+  d(new MapPrivate<Key, T>())
 {
-  d = new MapPrivate<Key, T>;
 }
 
 template <class Key, class T>
@@ -171,16 +171,18 @@ T &Map<Key, T>::operator[](const Key &key)
 template <class Key, class T>
 Map<Key, T> &Map<Key, T>::operator=(const Map<Key, T> &m)
 {
-  if(&m == this)
-    return *this;
-
-  if(d->deref())
-    delete(d);
-  d = m.d;
-  d->ref();
+  Map<Key, T>(m).swap(*this);
   return *this;
 }
 
+template <class Key, class T>
+void Map<Key, T>::swap(Map<Key, T> &m)
+{
+  using std::swap;
+
+  swap(d, m.d);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // protected members
 ////////////////////////////////////////////////////////////////////////////////
-- 
2.40.0