From ef9b515663097cca3ab68bb2f86ab37e69120d56 Mon Sep 17 00:00:00 2001
From: Florent Lamiraux <florent@laas.fr>
Date: Tue, 21 Jun 2011 10:37:49 +0200
Subject: [PATCH] SignalCaster class is now a singleton.

    Call to g_caster function have been replaced by call to
    SignalCaster::getInstance.
---
 include/dynamic-graph/signal-caster.h | 25 ++++++++++++++-----------
 src/signal/signal-caster.cpp          | 15 ++++++++++++---
 2 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/include/dynamic-graph/signal-caster.h b/include/dynamic-graph/signal-caster.h
index a713b41..f8cd687 100644
--- a/include/dynamic-graph/signal-caster.h
+++ b/include/dynamic-graph/signal-caster.h
@@ -33,14 +33,14 @@
 
 namespace dynamicgraph
 {
-  /// This class allows serialization of a number of objects into
+  /// This singleton class allows serialization of a number of objects into
   /// (disp) and from (cast) std i/o streams.
   ///
   /// The transformation is done at run-time, i.e. SignalCaster
   /// doesn't know about the type of objects it casts to.
   ///
   /// It also allows registering of user-defined casts. A cast is
-  /// identified by the compiler The mapping from a type to a
+  /// identified by the compiler. The mapping from a type to a
   /// serialization function is dynamic, hence it is more complex than
   /// a typical template-based compile-time resolve. So disp, cast and
   /// trace are costly functions and should be used as such.
@@ -48,7 +48,8 @@ namespace dynamicgraph
   {
   public:
     virtual ~SignalCaster ();
-
+    /// Destroy the unique instance.
+    static void destroy();
     /// Typedef of displayer functions that take an encapsulated 'any'
     /// object and displays, cast, or trace it on an output stream
     /// (serialization).
@@ -58,6 +59,8 @@ namespace dynamicgraph
     typedef boost::function2<void, const boost::any&, std::ostream&>
       tracer_type;
 
+    /// Get a reference to the unique object of the class.
+    static SignalCaster* getInstance(void);
     /// Displays an object using a registered displayer function.
     void disp (const boost::any& object, std::ostream& os);
     /// Traces an object using a registered trace function.
@@ -89,12 +92,10 @@ namespace dynamicgraph
 
   private:
     explicit SignalCaster ();
-    friend SignalCaster& g_caster(void);
+    /// Pointer to the unique instance of the class.
+    static SignalCaster* instance_;
   };
 
-  /// Access on the library wide caster instance (simple singleton design).
-  DYNAMIC_GRAPH_DLLAPI SignalCaster& g_caster(void);
-
   ///The SignalCast registerer class. Can be used to automatically
   /// register a cast when instanced somewhere in a cpp file. Pass the
   /// typeid () of the type you want to register a cast to as the first
@@ -108,7 +109,8 @@ namespace dynamicgraph
 				 SignalCaster::caster_type caster,
 				 SignalCaster::tracer_type tracer)
     {
-      g_caster().registerCast(type, displayer, caster, tracer);
+      SignalCaster::getInstance()->registerCast(type, displayer,
+						caster, tracer);
     }
   };
 
@@ -120,19 +122,20 @@ namespace dynamicgraph
   template<typename T>
   void signal_disp (const T& value, std::ostream& os)
   {
-    g_caster().disp(value, os);
+    SignalCaster::getInstance()->disp(value, os);
   }
 
   template<typename T>
   T signal_cast(std::istringstream& iss)
   {
-    return boost::any_cast<T>(g_caster().cast(typeid(T), iss));
+    return boost::any_cast<T>(SignalCaster::getInstance()->cast(typeid(T),
+								iss));
   }
 
   template<typename T>
   void signal_trace (const T& value, std::ostream& os)
   {
-    g_caster().trace(value, os);
+    SignalCaster::getInstance()->trace(value, os);
   }
 } // end of namespace dynamicgraph.
 
diff --git a/src/signal/signal-caster.cpp b/src/signal/signal-caster.cpp
index e869548..6ceec6f 100644
--- a/src/signal/signal-caster.cpp
+++ b/src/signal/signal-caster.cpp
@@ -34,6 +34,12 @@ namespace dynamicgraph
   SignalCaster::~SignalCaster ()
   {}
 
+  void SignalCaster::destroy()
+  {
+    delete instance_;
+    instance_ = 0;
+  }
+
   void
   SignalCaster::registerCast (const std::type_info& type,
 			      SignalCaster::displayer_type displayer,
@@ -120,10 +126,13 @@ namespace dynamicgraph
   }
 
   /// Singleton on the library-wide instance of SignalCaster
-  SignalCaster& g_caster(void)
+  SignalCaster* SignalCaster::getInstance(void)
   {
-    static SignalCaster staticptr;
-    return staticptr;
+    if (instance_ == 0) {
+      instance_ = new SignalCaster;
+    }
+    return instance_;
   }
+  SignalCaster* SignalCaster::instance_ = 0;
 
 } // namespace dynamicgraph
-- 
GitLab