From 1dc2471d01534729cb623a3a96d2c1b1317c0ad9 Mon Sep 17 00:00:00 2001
From: Tsuda Kageyu <tsuda.kageyu@gmail.com>
Date: Sun, 13 Apr 2014 15:02:17 +0900
Subject: [PATCH] Removed some redundant code from tsmartptr.h.

---
 taglib/toolkit/trefcounter.cpp | 39 ++++++++++++++++---------------
 taglib/toolkit/trefcounter.h   |  1 +
 taglib/toolkit/tsmartptr.h     | 42 +++++-----------------------------
 3 files changed, 28 insertions(+), 54 deletions(-)

diff --git a/taglib/toolkit/trefcounter.cpp b/taglib/toolkit/trefcounter.cpp
index f9a9f952..fc508efc 100644
--- a/taglib/toolkit/trefcounter.cpp
+++ b/taglib/toolkit/trefcounter.cpp
@@ -31,36 +31,36 @@
 
 #if defined(HAVE_STD_ATOMIC)
 # include <atomic>
-# define ATOMIC_INT std::atomic<unsigned int>
+# define ATOMIC_INT std::atomic<int>
 # define ATOMIC_INC(x) x.fetch_add(1)
 # define ATOMIC_DEC(x) (x.fetch_sub(1) - 1)
 #elif defined(HAVE_BOOST_ATOMIC)
 # include <boost/atomic.hpp>
-# define ATOMIC_INT boost::atomic<unsigned int>
+# define ATOMIC_INT boost::atomic<int>
 # define ATOMIC_INC(x) x.fetch_add(1)
 # define ATOMIC_DEC(x) (x.fetch_sub(1) - 1)
 #elif defined(HAVE_GCC_ATOMIC)
 # define ATOMIC_INT int
-# define ATOMIC_INC(x) __sync_add_and_fetch(&x, 1)
-# define ATOMIC_DEC(x) __sync_sub_and_fetch(&x, 1)
+# define ATOMIC_INC(x) ::__sync_add_and_fetch(&x, 1)
+# define ATOMIC_DEC(x) ::__sync_sub_and_fetch(&x, 1)
 #elif defined(HAVE_WIN_ATOMIC)
 # if !defined(NOMINMAX)
 #   define NOMINMAX
 # endif
 # include <windows.h>
-# define ATOMIC_INT long
-# define ATOMIC_INC(x) InterlockedIncrement(&x)
-# define ATOMIC_DEC(x) InterlockedDecrement(&x)
+# define ATOMIC_INT volatile LONG
+# define ATOMIC_INC(x) ::InterlockedIncrement(&x)
+# define ATOMIC_DEC(x) ::InterlockedDecrement(&x)
 #elif defined(HAVE_MAC_ATOMIC)
 # include <libkern/OSAtomic.h>
 # define ATOMIC_INT int32_t
-# define ATOMIC_INC(x) OSAtomicIncrement32Barrier(&x)
-# define ATOMIC_DEC(x) OSAtomicDecrement32Barrier(&x)
+# define ATOMIC_INC(x) ::OSAtomicIncrement32Barrier(&x)
+# define ATOMIC_DEC(x) ::OSAtomicDecrement32Barrier(&x)
 #elif defined(HAVE_IA64_ATOMIC)
 # include <ia64intrin.h>
 # define ATOMIC_INT int
-# define ATOMIC_INC(x) __sync_add_and_fetch(&x, 1)
-# define ATOMIC_DEC(x) __sync_sub_and_fetch(&x, 1)
+# define ATOMIC_INC(x) ::__sync_add_and_fetch(&x, 1)
+# define ATOMIC_DEC(x) ::__sync_sub_and_fetch(&x, 1)
 #else
 # define ATOMIC_INT int
 # define ATOMIC_INC(x) (++x)
@@ -72,16 +72,14 @@ namespace TagLib
   class RefCounter::RefCounterPrivate
   {
   public:
-    RefCounterPrivate() 
-      : refCount(1) 
-    {
-    }
+    RefCounterPrivate() : 
+      refCount(1) {}
 
-    volatile ATOMIC_INT refCount;
+    ATOMIC_INT refCount;
   };
 
-  RefCounter::RefCounter()
-    : d(new RefCounterPrivate())
+  RefCounter::RefCounter() : 
+    d(new RefCounterPrivate())
   {
   }
 
@@ -100,6 +98,11 @@ namespace TagLib
     return (ATOMIC_DEC(d->refCount) == 0); 
   }
 
+  int RefCounter::count() const
+  {
+    return static_cast<int>(d->refCount);
+  }
+
   bool RefCounter::unique() const 
   { 
     return (d->refCount == 1); 
diff --git a/taglib/toolkit/trefcounter.h b/taglib/toolkit/trefcounter.h
index 424f6d49..e5873ba3 100644
--- a/taglib/toolkit/trefcounter.h
+++ b/taglib/toolkit/trefcounter.h
@@ -44,6 +44,7 @@ namespace TagLib
 
     void ref();
     bool deref();
+    int count() const;
     bool unique() const;
 
   private:
diff --git a/taglib/toolkit/tsmartptr.h b/taglib/toolkit/tsmartptr.h
index cf85b02a..5d61c73c 100644
--- a/taglib/toolkit/tsmartptr.h
+++ b/taglib/toolkit/tsmartptr.h
@@ -55,34 +55,7 @@
 #else // !HAVE_STD_SHARED_PTR && !HAVE_TR1_SHARED_PTR && !HAVE_BOOST_SHARED_PTR
 
 # include <algorithm>
-
-# if defined(HAVE_GCC_ATOMIC)
-#   define ATOMIC_INT int
-#   define ATOMIC_INC(x) ::__sync_add_and_fetch(&x, 1)
-#   define ATOMIC_DEC(x) ::__sync_sub_and_fetch(&x, 1)
-# elif defined(HAVE_WIN_ATOMIC)
-#   if !defined(NOMINMAX)
-#     define NOMINMAX
-#   endif
-#   include <windows.h>
-#   define ATOMIC_INT volatile LONG
-#   define ATOMIC_INC(x) ::InterlockedIncrement(&x)
-#   define ATOMIC_DEC(x) ::InterlockedDecrement(&x)
-# elif defined(HAVE_MAC_ATOMIC)
-#   include <libkern/OSAtomic.h>
-#   define ATOMIC_INT int32_t
-#   define ATOMIC_INC(x) ::OSAtomicIncrement32Barrier(&x)
-#   define ATOMIC_DEC(x) ::OSAtomicDecrement32Barrier(&x)
-# elif defined(HAVE_IA64_ATOMIC)
-#   include <ia64intrin.h>
-#   define ATOMIC_INT int
-#   define ATOMIC_INC(x) ::__sync_add_and_fetch(&x, 1)
-#   define ATOMIC_DEC(x) ::__sync_sub_and_fetch(&x, 1)
-# else
-#   define ATOMIC_INT int
-#   define ATOMIC_INC(x) (++x)
-#   define ATOMIC_DEC(x) (--x)
-# endif
+# include <trefcounter.h>
 
 namespace TagLib
 {
@@ -91,11 +64,11 @@ namespace TagLib
 
   // Counter base class. Provides a reference counter.
 
-  class CounterBase
+  class CounterBase : public RefCounter
   {
   public:
     CounterBase() :
-      refCount(1)
+      RefCounter()
     {
     }
 
@@ -105,12 +78,12 @@ namespace TagLib
 
     void addref()
     {
-      ATOMIC_INC(refCount);
+      RefCounter::ref();
     }
 
     void release()
     {
-      if(ATOMIC_DEC(refCount) == 0) {
+      if(RefCounter::deref()) {
         dispose();
         delete this;
       }
@@ -118,13 +91,10 @@ namespace TagLib
 
     long use_count() const
     {
-      return static_cast<long>(refCount);
+      return RefCounter::count();
     }
 
     virtual void dispose() = 0;
-
-  private:
-    ATOMIC_INT refCount;
   };
 
   // Counter impl class. Provides a dynamic deleter.