Go to the documentation of this file.00001 #ifndef TYPELIB_DISPLAYVISITOR_HH
00002 #define TYPELIB_DISPLAYVISITOR_HH
00003
00004 #include "typevisitor.hh"
00005 #include <iosfwd>
00006
00007 namespace Typelib
00008 {
00013 class TypeDisplayVisitor : public TypeVisitor
00014 {
00015 template<typename T>
00016 void display_compound(T const& type, char const* compound_name);
00017
00018 std::ostream& m_stream;
00019 std::string m_indent;
00020
00021 protected:
00022 bool visit_(NullType const& type);
00023 bool visit_(OpaqueType const& type);
00024 bool visit_(Compound const& type);
00025 bool visit_(Compound const& type, Field const& field);
00026
00027 bool visit_(Numeric const& type);
00028 bool visit_(Enum const& type);
00029
00030 bool visit_(Pointer const& type);
00031 bool visit_(Array const& type);
00032
00033 public:
00034 TypeDisplayVisitor(std::ostream& stream, std::string const& base_indent);
00035 };
00036
00037 namespace details
00038 {
00039 struct do_type_display
00040 {
00041 Type const& type;
00042 std::string indent;
00043 do_type_display(Type const& type_, std::string const& indent_ = "")
00044 : type(type_), indent(indent_) {}
00045 };
00046 inline std::ostream& operator << (std::ostream& stream, do_type_display display)
00047 {
00048 TypeDisplayVisitor visitor(stream, display.indent);
00049 visitor.apply(display.type);
00050 return stream;
00051 }
00052 }
00053
00062 inline details::do_type_display type_display(Type const& type, std::string const& indent = "")
00063 { return details::do_type_display(type, indent); }
00064
00069 inline std::ostream& operator << (std::ostream& stream, Type const& type)
00070 { return stream << type_display(type); }
00071 }
00072
00073 #endif
00074