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_