$search
00001 #ifndef TYPELIB_DISPLAY_HH 00002 #define TYPELIB_DISPLAY_HH 00003 #include <string> 00004 #include <iosfwd> 00005 00006 namespace Typelib 00007 { 00008 class Type; 00009 00010 class CSVOutput 00011 { 00012 Type const& m_type; 00013 std::string m_separator; 00014 bool m_char_as_numeric; 00015 00016 public: 00017 CSVOutput(Type const& type, std::string const& sep, bool char_as_numeric); 00018 00020 void header(std::ostream& out, std::string const& basename); 00021 void display(std::ostream& out, void* value); 00022 }; 00023 00024 00025 namespace details { 00026 struct csvheader 00027 { 00028 CSVOutput output; 00029 std::string basename; 00030 00031 csvheader(Type const& type, std::string const& basename_, std::string const& sep = " ") 00032 : output(type, sep, true), basename(basename_) {} 00033 }; 00034 struct csvline 00035 { 00036 CSVOutput output; 00037 void* value; 00038 bool char_as_numeric; 00039 00040 csvline(Type const& type_, void* value_, std::string const& sep_ = " ", bool char_as_numeric = true) 00041 : output(type_, sep_, char_as_numeric), value(value_), char_as_numeric(char_as_numeric) {} 00042 }; 00043 inline std::ostream& operator << (std::ostream& stream, csvheader header) 00044 { 00045 header.output.header(stream, header.basename); 00046 return stream; 00047 } 00048 inline std::ostream& operator << (std::ostream& stream, csvline line) 00049 { 00050 line.output.display(stream, line.value); 00051 return stream; 00052 } 00053 } 00054 00060 inline details::csvheader csv_header(Type const& type, std::string const& basename, std::string const& sep = " ") 00061 { return details::csvheader(type, basename, sep); } 00062 00068 inline details::csvline csv(Type const& type, void* value, std::string const& sep = " ", bool char_as_numeric = true) 00069 { return details::csvline(type, value, sep, char_as_numeric); } 00070 }; 00071 00072 #endif 00073