Go to the documentation of this file.00001
00002 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00003 #pragma implementation
00004 #endif
00005
00006
00007
00008 #include "vsl_indent.h"
00009 #include <vcl_iostream.h>
00010 #include <vcl_map.txx>
00011 #include <vcl_utility.h>
00012
00013 const int default_tab = 2;
00014
00015 typedef vcl_pair<int,int> indent_data_type;
00016
00017
00018 indent_data_type* indent_data(vcl_ostream& os)
00019 {
00020 typedef vcl_map<void*, indent_data_type, vcl_less<void*> > maps2i_type;
00021
00022
00023
00024 static maps2i_type indent_data_map;
00025
00026 maps2i_type::iterator entry = indent_data_map.find(&os);
00027 if (entry==indent_data_map.end())
00028 {
00029
00030 indent_data_map[&os]=indent_data_type(0,default_tab);
00031 entry = indent_data_map.find(&os);
00032 }
00033
00034 return &((*entry).second);
00035 }
00036
00037
00038 void vsl_indent_inc(vcl_ostream& os)
00039 {
00040 indent_data(os)->first++;
00041 }
00042
00043
00044 void vsl_indent_dec(vcl_ostream& os)
00045 {
00046 indent_data(os)->first--;
00047 }
00048
00049
00050 void vsl_indent_set_tab(vcl_ostream& os, int t)
00051 {
00052 indent_data(os)->second = t;
00053 }
00054
00055
00056 int vsl_indent_tab(vcl_ostream& os)
00057 {
00058 return indent_data(os)->second;
00059 }
00060
00061
00062 void vsl_indent_clear(vcl_ostream& os)
00063 {
00064 indent_data(os)->first =0;
00065 }
00066
00067 vcl_ostream& operator<<(vcl_ostream& os, const vsl_indent& )
00068 {
00069 indent_data_type* data = indent_data(os);
00070
00071 int n = data->first * data->second;
00072 for (int i=0;i<n;i++) os<<' ';
00073 return os;
00074 }
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 void vsl_indent_clear_all_data()
00087 {
00088 #if 0 // no longer needed?
00089 indent_data_map.clear();
00090 #endif
00091 }
00092
00093
00094