00001 00008 /***************************************************************************** 00009 ** Ifdefs 00010 *****************************************************************************/ 00011 00012 #ifndef ECL_STREAMS_MANIPULATOR_HPP_ 00013 #define ECL_STREAMS_MANIPULATOR_HPP_ 00014 00015 /***************************************************************************** 00016 ** Includes 00017 *****************************************************************************/ 00018 00019 #include <ecl/config/macros.hpp> 00020 #include <ecl/concepts/devices.hpp> 00021 00022 /***************************************************************************** 00023 ** Namespaces 00024 *****************************************************************************/ 00025 00026 namespace ecl { 00027 00028 /***************************************************************************** 00029 ** Forwarding 00030 *****************************************************************************/ 00031 00032 namespace interfaces { 00033 template <typename Device, bool OutputDevice> class ECL_PUBLIC OutputTextStream; 00034 } 00035 00036 /***************************************************************************** 00037 ** Interface [Manipulator] 00038 *****************************************************************************/ 00090 template <typename Derived> 00091 class ECL_PUBLIC Manipulator { 00092 public: 00107 template <typename ODevice> 00108 void insert (interfaces::OutputTextStream<ODevice,true>& ostream) { 00109 ecl_compile_time_concept_check(OutputCharDeviceConcept<ODevice>); 00110 static_cast<Derived*>(this)->action(ostream); 00111 } 00112 00113 virtual ~Manipulator() {} 00114 }; 00115 00116 } // namespace ecl 00117 00118 #endif /* ECL_STREAMS_MANIPULATOR_HPP_ */