00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef _MPCL_IO_OUTPUT_STREAMABLE__
00027 #define _MPCL_IO_OUTPUT_STREAMABLE__
00028
00029 #include <ostream>
00030
00031
00033 namespace mpcl
00034 {
00035
00037 namespace io
00038 {
00039
00041 template <typename TChar, typename TTraits>
00042 class IOutputStreamable;
00043
00048 template <typename TChar, typename TTraits>
00049 std::basic_ostream<TChar, TTraits>&
00050 operator << ( std::basic_ostream<TChar, TTraits>& rtSOURCE_OSTREAM ,
00051 const IOutputStreamable<TChar, TTraits>& rktSOURCE_OUTPUT_STREAMABLE );
00052
00054 template < typename TChar = char ,
00055 typename TTraits = std::char_traits<TChar> >
00056 class IOutputStreamable
00057 {
00058
00059 public:
00060
00062 typedef
00063 TChar
00064 char_type;
00065
00067 typedef
00068 TTraits
00069 traits_type;
00070
00071
00072 public:
00073
00074
00075
00076
00077
00079 virtual ~IOutputStreamable (void) {}
00080
00081
00082 protected:
00083
00084
00085
00086
00087
00092 virtual void write (std::basic_ostream<char_type, traits_type>& rtOUTPUT_OSTREAM) const = 0;
00093
00094
00095 public:
00096
00097
00098
00099
00100
00101 friend std::basic_ostream<TChar, TTraits>&
00102 operator << <TChar, TTraits>
00103 (
00104 std::basic_ostream<TChar, TTraits>& rtSOURCE_OSTREAM ,
00105 const IOutputStreamable<TChar, TTraits>& rktSOURCE_OUTPUT_STREAMABLE
00106 );
00107
00108 };
00109
00110
00111
00112
00113
00114
00115 template <typename TChar, typename TTraits>
00116 std::basic_ostream<TChar, TTraits>&
00117 operator << ( std::basic_ostream<TChar, TTraits>& rtSOURCE_OSTREAM ,
00118 const IOutputStreamable<TChar, TTraits>& rktSOURCE_OUTPUT_STREAMABLE )
00119 {
00120 rktSOURCE_OUTPUT_STREAMABLE.write (rtSOURCE_OSTREAM);
00121 return rtSOURCE_OSTREAM;
00122 }
00123
00124 }
00125
00126 }
00127
00128
00129 #endif // not _MPCL_OUTPUT_STREAMABLE__