$search
00001 00008 /***************************************************************************** 00009 ** PreProcessor 00010 *****************************************************************************/ 00011 00012 #ifndef ECL_CONVERTERS_CONVERTER_HPP_ 00013 #define ECL_CONVERTERS_CONVERTER_HPP_ 00014 00015 /***************************************************************************** 00016 ** Include 00017 *****************************************************************************/ 00018 00019 #include <ecl/errors/handlers.hpp> 00020 00021 /***************************************************************************** 00022 ** Namespaces 00023 *****************************************************************************/ 00024 00025 namespace ecl { 00029 namespace converters { 00030 00031 class ConverterBase { 00032 public: 00033 ConverterBase() : error_handler(ecl::NoError) {}; 00034 virtual Error error() const { return error_handler; } 00035 protected: 00036 Error error_handler; 00037 }; 00038 } // namespace converters 00042 /***************************************************************************** 00043 ** Converter Interface 00044 *****************************************************************************/ 00055 template <typename Output, typename Input = void> 00056 class Converter : public converters::ConverterBase { 00057 public: 00058 virtual ~Converter() {} 00059 Output operator()(const Input &input); 00060 }; 00061 00070 template <typename Output> 00071 class Converter<Output,void> : public converters::ConverterBase { 00072 public: 00073 virtual ~Converter() {} 00074 00075 template <typename Input> 00076 Output operator()(const Input &input); 00077 }; 00078 00079 /***************************************************************************** 00080 ** Converter Implementation 00081 *****************************************************************************/ 00090 template <typename Output, typename Input> 00091 Output Converter<Output,Input>::operator ()(const Input &input) 00092 { 00093 return typename Output::Converter()(input); 00094 }; 00095 00104 template <typename Output> 00105 template <typename Input> 00106 Output Converter<Output,void>::operator ()(const Input &input) 00107 { 00108 return typename Output::Converter()(input); 00109 }; 00110 00111 }; // Namespace ecl 00112 00113 00114 #endif /* ECL_CONVERTERS_CONVERTER_HPP_ */