]> git.lyx.org Git - lyx.git/blob - boost/boost/format/format_class.hpp
add the Boost.Format library
[lyx.git] / boost / boost / format / format_class.hpp
1 // -*- C++ -*-
2 //  Boost general library 'format'   ---------------------------
3 //  See http://www.boost.org for updates, documentation, and revision history.
4
5 //  (C) Samuel Krempp 2001
6 //                  krempp@crans.ens-cachan.fr
7 //  Permission to copy, use, modify, sell and
8 //  distribute this software is granted provided this copyright notice appears
9 //  in all copies. This software is provided "as is" without express or implied
10 //  warranty, and with no claim as to its suitability for any purpose.
11
12 // ideas taken from RĂ¼diger Loos's format class
13 // and Karl Nelson's ofstream (also took its parsing code as basis for printf parsing)
14
15 // ------------------------------------------------------------------------------
16 // format_class.hpp :  class interface
17 // ------------------------------------------------------------------------------
18
19
20 #ifndef BOOST_FORMAT_CLASS_HPP
21 #define BOOST_FORMAT_CLASS_HPP
22
23 #include <vector>
24 #include <sstream>
25 #include <string>
26 #include <ostream>
27 #include <locale>
28 #include "boost/format/format_fwd.hpp"
29 #include "boost/format/internals_fwd.hpp"
30
31 #include "boost/format/internals.hpp" 
32
33 namespace boost {
34
35 template<class Ch, class Tr>
36 class basic_format 
37 {
38   typedef BOOST_IO_STD basic_ostream<Ch, Tr>               stream_t;
39   typedef io::detail::stream_format_state<Ch, Tr>  stream_format_state;
40   typedef io::detail::format_item<Ch, Tr>          format_item_t;
41 public:
42   typedef std::basic_string<Ch, Tr>                string_t;
43   typedef BOOST_IO_STD basic_ostringstream<Ch, Tr>         internal_stream_t;
44
45 public:
46   basic_format(const Ch* str);
47   basic_format(const Ch* str, const std::locale & loc);
48   basic_format(const string_t& s);
49   basic_format(const string_t& s, const std::locale & loc);
50   basic_format(const basic_format& x);
51   basic_format& operator= (const basic_format& x);
52
53   basic_format& clear(); // empty the string buffers (except bound arguments, see clear_binds() )
54
55   // pass arguments through those operators :
56   template<class T>  basic_format&   operator%(const T& x) 
57   { 
58     return io::detail::feed<Ch, Tr, const T&>(*this,x);
59   }
60
61 #ifdef BOOST_OVERLOAD_FOR_NON_CONST
62   template<class T>  basic_format&   operator%(T& x) 
63   {
64     return io::detail::feed<Ch, Tr, T&>(*this,x);
65   }
66 #endif
67
68
69   // system for binding arguments :
70   template<class T>  
71   basic_format&         bind_arg(int argN, const T& val) 
72   {
73     return io::detail::bind_arg_body(*this, argN, val); 
74   }
75   basic_format&         clear_bind(int argN);
76   basic_format&         clear_binds();
77
78   // modify the params of a directive, by applying a manipulator :
79   template<class T> 
80   basic_format&  modify_item(int itemN, const T& manipulator) 
81   {
82     return io::detail::modify_item_body(*this, itemN, manipulator) ;
83   }
84
85   // Choosing which errors will throw exceptions :
86   unsigned char exceptions() const;
87   unsigned char exceptions(unsigned char newexcept);
88
89   // final output
90   string_t str() const;
91   friend BOOST_IO_STD basic_ostream<Ch, Tr>& 
92 #if !defined(BOOST_MSVC) || BOOST_MSVC > 1300
93   operator<< <Ch, Tr> ( BOOST_IO_STD basic_ostream<Ch, Tr>& , const basic_format& ); 
94 #else
95   operator<< ( BOOST_IO_STD basic_ostream<Ch, Tr>& , const basic_format& ); 
96 #endif
97                       
98
99 #ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
100   template<class Ch2, class Tr2, class T>  friend basic_format<Ch2, Tr2>&  
101   io::detail::feed(basic_format<Ch2,Tr2>&, T);
102     
103   template<class Ch2, class Tr2, class T>  friend   
104   void io::detail::distribute(basic_format<Ch2,Tr2>&, T);
105   
106   template<class Ch2, class Tr2, class T>  friend
107   basic_format<Ch2, Tr2>&  io::detail::modify_item_body(basic_format<Ch2, Tr2>&, int, const T&);
108
109   template<class Ch2, class Tr2, class T> friend
110   basic_format<Ch2, Tr2>&  io::detail::bind_arg_body(basic_format<Ch2, Tr2>&, int, const T&);
111
112 // make the members private only if the friend templates are supported
113 private:
114 #endif
115
116   // flag bits, used for style_
117   enum style_values  { ordered = 1,        // set only if all directives are  positional directives
118                        special_needs = 4 };     
119
120   // parse the format string :
121   void parse(const string_t&);
122
123   int                           style_;         // style of format-string :  positional or not, etc
124   int                           cur_arg_;       // keep track of wich argument will come
125   int                           num_args_;      // number of expected arguments
126   mutable bool                  dumped_;        // true only after call to str() or <<
127   std::vector<format_item_t>    items_;         // vector of directives (aka items)
128   string_t                      prefix_;        // piece of string to insert before first item
129
130   std::vector<bool>             bound_;         // stores which arguments were bound
131                                                 //   size = num_args OR zero
132   internal_stream_t             oss_;           // the internal stream.
133   stream_format_state           state0_;        // reference state for oss_
134   unsigned char                 exceptions_;
135 }; // class basic_format
136
137
138 } // namespace boost
139
140
141 #endif // BOOST_FORMAT_CLASS_HPP