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