core/vsl/vsl_indent.h
Go to the documentation of this file.
00001 // This is core/vsl/vsl_indent.h
00002 #ifndef vsl_indent_h_
00003 #define vsl_indent_h_
00004 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00005 #pragma interface
00006 #endif
00007 //:
00008 // \file
00009 // \author Tim Cootes
00010 
00011 #include <vcl_iosfwd.h>
00012 
00013 //: Put indents into output streams, to produce more legible printed output
00014 //  Its use is best described by example:
00015 // \code
00016 // vcl_cout<<vsl_indent()<<"No Indent\n";
00017 // vsl_indent_inc(vcl_cout);
00018 // vcl_cout<<vsl_indent()<<"1 Indent\n";
00019 // vsl_indent_inc(vcl_cout);
00020 // vcl_cout<<vsl_indent()<<"2 Indent\n";
00021 // vsl_indent_dec(vcl_cout);
00022 // vcl_cout<<vsl_indent()<<"1 Indent\n";
00023 // vsl_indent_dec(vcl_cout);
00024 // vcl_cout<<vsl_indent()<<"No Indent\n";
00025 // \endcode
00026 //
00027 // This produces output of the form
00028 // \verbatim
00029 // No Indent
00030 //   1 Indent
00031 //     2 Indent
00032 //   1 Indent
00033 // No Indent
00034 // \endverbatim
00035 //
00036 // Example of use in class output:
00037 // \code
00038 // class Fred
00039 // {
00040 //  public:
00041 //   void print(vcl_ostream& os) const { os<<vsl_indent()<<"Fred's data"; }
00042 // };
00043 //
00044 // vcl_ostream& operator<<(vcl_ostream& os, const Fred& fred)
00045 // {
00046 //   os<<"Fred:\n";
00047 //   vsl_indent_inc(os);
00048 //   fred.print(os);
00049 //   vsl_indent_dec(os);
00050 //   return os;
00051 // }
00052 //
00053 // class Jim
00054 // {
00055 //  private:
00056 //   Fred fred_;
00057 //  public:
00058 //   void print(vcl_ostream& os) const
00059 //   {
00060 //     os<<vsl_indent()<<fred_<<'\n'
00061 //       <<vsl_indent()<<"Jim's other data\n";
00062 //   }
00063 // };
00064 //
00065 // vcl_ostream& operator<<(vcl_ostream& os, const Jim& jim)
00066 // {
00067 //   os<<"Jim:\n";
00068 //   vsl_indent_inc(os);
00069 //   jim.print(os);
00070 //   vsl_indent_dec(os);
00071 //   return os;
00072 // }
00073 //
00074 // main()
00075 // {
00076 //   Jim jim;
00077 //   vcl_cout<<jim<<vcl_endl;
00078 // }
00079 // \endcode
00080 //
00081 // This produces output:
00082 // \verbatim
00083 //  Jim:
00084 //    Fred's data
00085 //    Jim's other data
00086 // \endverbatim
00087 
00088 class vsl_indent
00089 {
00090 };
00091 
00092 //: Increments current indent for given stream
00093 void vsl_indent_inc(vcl_ostream& os);
00094 
00095 //: Decrements current indent for given stream
00096 void vsl_indent_dec(vcl_ostream& os);
00097 
00098 //: Set number of spaces per increment step
00099 void vsl_indent_set_tab(vcl_ostream& os,int);
00100 
00101 //: Number of spaces per increment step
00102 int vsl_indent_tab(vcl_ostream& os);
00103 
00104 //: Set indentation to zero
00105 void vsl_indent_clear(vcl_ostream& os);
00106 
00107 //: Outputs current indent to os
00108 vcl_ostream& operator<<(vcl_ostream& os, const vsl_indent& indent);
00109 
00110 //: Tidy up the internal indent map to remove potential memory leaks
00111 //  The details of indents for each stream are stored in a static
00112 //  map.  When testing for memory leaks, this is flagged, creating
00113 //  lots of noise in the output of memory leak checkers.
00114 //  This call empties the map, removing the potential leak.
00115 //  Pragmatically it is called in the vsl_delete_all_loaders()
00116 void vsl_indent_clear_all_data();
00117 
00118 #endif // vsl_indent_h_