From 841c1354e58aecdc356a9a1dc547d91f42def398 Mon Sep 17 00:00:00 2001
From: Mansard <nmansard@laas.fr>
Date: Wed, 2 Feb 2011 19:06:06 +0100
Subject: [PATCH] Modify the g_caster object with a singleton design.

---
 include/dynamic-graph/signal-caster.h | 17 ++++++++++-------
 src/signal/signal-cast-helper.cpp     |  8 ++++----
 src/signal/signal-caster.cpp          | 17 ++++++++++++++++-
 3 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/include/dynamic-graph/signal-caster.h b/include/dynamic-graph/signal-caster.h
index d4a56e53..a713b415 100644
--- a/include/dynamic-graph/signal-caster.h
+++ b/include/dynamic-graph/signal-caster.h
@@ -47,7 +47,6 @@ namespace dynamicgraph
   class DYNAMIC_GRAPH_DLLAPI SignalCaster
   {
   public:
-    explicit SignalCaster ();
     virtual ~SignalCaster ();
 
     /// Typedef of displayer functions that take an encapsulated 'any'
@@ -87,10 +86,14 @@ namespace dynamicgraph
     std::map<std::string, cast_functions_type> functions_;
 
     std::map<std::string, const std::type_info*> type_info_;
+
+  private:
+    explicit SignalCaster ();
+    friend SignalCaster& g_caster(void);
   };
 
-  /// The library-wide instance of SignalCaster
-  extern DYNAMIC_GRAPH_DLLAPI SignalCaster g_caster;
+  /// 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
@@ -105,7 +108,7 @@ namespace dynamicgraph
 				 SignalCaster::caster_type caster,
 				 SignalCaster::tracer_type tracer)
     {
-      g_caster.registerCast(type, displayer, caster, tracer);
+      g_caster().registerCast(type, displayer, caster, tracer);
     }
   };
 
@@ -117,19 +120,19 @@ namespace dynamicgraph
   template<typename T>
   void signal_disp (const T& value, std::ostream& os)
   {
-    g_caster.disp(value, os);
+    g_caster().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>(g_caster().cast(typeid(T), iss));
   }
 
   template<typename T>
   void signal_trace (const T& value, std::ostream& os)
   {
-    g_caster.trace(value, os);
+    g_caster().trace(value, os);
   }
 } // end of namespace dynamicgraph.
 
diff --git a/src/signal/signal-cast-helper.cpp b/src/signal/signal-cast-helper.cpp
index 8f409c65..109fc51b 100644
--- a/src/signal/signal-cast-helper.cpp
+++ b/src/signal/signal-cast-helper.cpp
@@ -70,10 +70,10 @@ namespace dynamicgraph
   namespace
   {
     DefaultCastRegisterer<double> double_reg;
-    DefaultCastRegisterer<int> int_reg;
-    DefaultCastRegisterer<unsigned int> uint_reg;
-    DefaultCastRegisterer<dynamicgraph::Vector> vectorCastRegisterer;
-    DefaultCastRegisterer<dynamicgraph::Matrix> matrixCastRegisterer;
+    // DefaultCastRegisterer<int> int_reg;
+    // DefaultCastRegisterer<unsigned int> uint_reg;
+    // DefaultCastRegisterer<dynamicgraph::Vector> vectorCastRegisterer;
+    // DefaultCastRegisterer<dynamicgraph::Matrix> matrixCastRegisterer;
   } // end of anonymous namespace.
 
 } // namespace dynamicgraph
diff --git a/src/signal/signal-caster.cpp b/src/signal/signal-caster.cpp
index 02842ffe..6ab9aacd 100644
--- a/src/signal/signal-caster.cpp
+++ b/src/signal/signal-caster.cpp
@@ -120,6 +120,21 @@ namespace dynamicgraph
   }
 
   /// The global instance of the caster class.
-  SignalCaster g_caster;
+  //SignalCaster g_caster;
+  /// Singleton on the library-wide instance of SignalCaster
+  SignalCaster& g_caster(void)
+  {
+    static SignalCaster staticptr;
+    return staticptr;
+  }
 
 } // namespace dynamicgraph
+
+
+
+
+struct sigcastint
+{
+  sigcastint() { std::cout << "sigcastint!" << std::endl; }
+};
+sigcastint sigcastint_init;
-- 
GitLab