diff --git a/include/dynamic-graph/signal-caster.h b/include/dynamic-graph/signal-caster.h index 69b003e3c53adb3d8ad6b6985a138aa090b46f99..d4a56e5309e1054def13aea206a0c2334cbcaa11 100644 --- a/include/dynamic-graph/signal-caster.h +++ b/include/dynamic-graph/signal-caster.h @@ -109,84 +109,6 @@ namespace dynamicgraph } }; - /// This class can be used to register default casts, i.e. casts - /// already supported by the object to an std::iostream through the - /// operators >> and << . - template<typename T> - class DefaultCastRegisterer : public SignalCastRegisterer - { - public: - DefaultCastRegisterer () - : SignalCastRegisterer (typeid(T), disp, cast, trace) - {} - - static boost::any cast (std::istringstream& iss); - - static void disp (const boost::any& object, std::ostream& os) - { - os << boost::any_cast<T> (object) << std::endl; - } - - static void trace (const boost::any& object, std::ostream& os) - { - disp(object,os); - } - }; - - - // Define a custom implementation of the DefaultCastRegisterer - // to workaround the limitations of the stream based approach. - // When dealing with double: displaying a double on a stream - // is *NOT* the opposite of reading a double from a stream. - // - // In practice, it means that there is no way to read - // a NaN, +inf, -inf from a stream! - // - // To workaround this problem, parse special values manually - // (the strings used are the one produces by displaying special - // values on a stream). - template <> - inline boost::any - DefaultCastRegisterer<double>::cast (std::istringstream& iss) - { - std::string tmp; - iss >> tmp; - - if (tmp == "nan") - return std::numeric_limits<double>::quiet_NaN (); - else if (tmp == "inf" || tmp == "+inf") - return std::numeric_limits<double>::infinity (); - else if (tmp == "-inf") - return -1. * std::numeric_limits<double>::infinity (); - - try - { - return boost::lexical_cast<double> (tmp); - } - catch (boost::bad_lexical_cast&) - { - boost::format fmt ("failed to serialize %s (to double)"); - fmt % tmp; - throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str ()); - } - } - - template <typename T> - boost::any - DefaultCastRegisterer<T>::cast (std::istringstream& iss) - { - T inst; - iss >> inst; - if (iss.fail ()) - { - boost::format fmt ("failed to serialize %s "); - fmt % iss.str (); - throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str ()); - } - return inst; - } - - /// Global signal cast template (helper) functions /// diff --git a/src/signal/signal-caster.cpp b/src/signal/signal-caster.cpp index 72bc26a4f49ea328b033447353ff4d08651833e8..02842ffe430bf254c85d98dc31129a9c8ab76449 100644 --- a/src/signal/signal-caster.cpp +++ b/src/signal/signal-caster.cpp @@ -122,14 +122,4 @@ namespace dynamicgraph /// The global instance of the caster class. SignalCaster g_caster; - /// Registers useful casts - namespace - { - DefaultCastRegisterer<double> double_reg; - 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/tests/signal-cast-registerer.cpp b/tests/signal-cast-registerer.cpp index f171ed20739deddc422e68006637bdb67213e698..cc61c4935d7f9e36e3bd745b1c70f1fba3817150 100644 --- a/tests/signal-cast-registerer.cpp +++ b/tests/signal-cast-registerer.cpp @@ -26,6 +26,7 @@ #include <dynamic-graph/pool.h> #include <dynamic-graph/signal-caster.h> #include <dynamic-graph/signal.h> +#include <dynamic-graph/signal-cast-helper.h> #include "signal-cast-registerer-libA.hh" #include "signal-cast-registerer-libB.hh"