140 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // -*- C++ -*-
 | |
| //  Boost general library 'format'   ---------------------------
 | |
| //  See http://www.boost.org for updates, documentation, and revision history.
 | |
| 
 | |
| //  (C) Samuel Krempp 2001
 | |
| //                  krempp@crans.ens-cachan.fr
 | |
| //  Permission to copy, use, modify, sell and
 | |
| //  distribute this software is granted provided this copyright notice appears
 | |
| //  in all copies. This software is provided "as is" without express or implied
 | |
| //  warranty, and with no claim as to its suitability for any purpose.
 | |
| 
 | |
| // ideas taken from Rüdiger Loos's format class
 | |
| // and Karl Nelson's ofstream (also took its parsing code as basis for printf parsing)
 | |
| 
 | |
| // ------------------------------------------------------------------------------
 | |
| // format_class.hpp :  class interface
 | |
| // ------------------------------------------------------------------------------
 | |
| 
 | |
| 
 | |
| #ifndef BOOST_FORMAT_CLASS_HPP
 | |
| #define BOOST_FORMAT_CLASS_HPP
 | |
| 
 | |
| #include <vector>
 | |
| #include <string>
 | |
| 
 | |
| #include <boost/format/format_fwd.hpp>
 | |
| #include <boost/format/internals_fwd.hpp>
 | |
| 
 | |
| #include <boost/format/internals.hpp>
 | |
| 
 | |
| namespace boost {
 | |
| 
 | |
| template<class Ch, class Tr>
 | |
| class basic_format 
 | |
| {
 | |
| public:
 | |
|   typedef Ch  CharT;   // those 2 are necessary for borland compatibilty,
 | |
|   typedef Tr  Traits;  // in the body of the operator% template.
 | |
| 
 | |
| 
 | |
|   typedef std::basic_string<Ch, Tr>                string_t;
 | |
|   typedef BOOST_IO_STD basic_ostringstream<Ch, Tr> internal_stream_t;
 | |
| private:
 | |
|   typedef BOOST_IO_STD basic_ostream<Ch, Tr>       stream_t;
 | |
|   typedef io::detail::stream_format_state<Ch, Tr>  stream_format_state;
 | |
|   typedef io::detail::format_item<Ch, Tr>          format_item_t;
 | |
| 
 | |
| public:
 | |
|   basic_format(const Ch* str);
 | |
|   basic_format(const string_t& s);
 | |
| #ifndef BOOST_NO_STD_LOCALE
 | |
|   basic_format(const Ch* str, const std::locale & loc);
 | |
|   basic_format(const string_t& s, const std::locale & loc);
 | |
| #endif // no locale
 | |
|   basic_format(const basic_format& x);
 | |
|   basic_format& operator= (const basic_format& x);
 | |
| 
 | |
|   basic_format& clear(); // empty the string buffers (except bound arguments, see clear_binds() )
 | |
| 
 | |
|   // pass arguments through those operators :
 | |
|   template<class T>  basic_format&   operator%(const T& x) 
 | |
|   { 
 | |
|     return io::detail::feed<CharT, Traits, const T&>(*this,x);
 | |
|   }
 | |
| 
 | |
| #ifndef BOOST_NO_OVERLOAD_FOR_NON_CONST
 | |
|   template<class T>  basic_format&   operator%(T& x) 
 | |
|   {
 | |
|     return io::detail::feed<CharT, Traits, T&>(*this,x);
 | |
|   }
 | |
| #endif
 | |
| 
 | |
| 
 | |
|   // system for binding arguments :
 | |
|   template<class T>  
 | |
|   basic_format&         bind_arg(int argN, const T& val) 
 | |
|   {
 | |
|     return io::detail::bind_arg_body(*this, argN, val); 
 | |
|   }
 | |
|   basic_format&         clear_bind(int argN);
 | |
|   basic_format&         clear_binds();
 | |
| 
 | |
|   // modify the params of a directive, by applying a manipulator :
 | |
|   template<class T> 
 | |
|   basic_format&  modify_item(int itemN, const T& manipulator) 
 | |
|   {
 | |
|     return io::detail::modify_item_body(*this, itemN, manipulator) ;
 | |
|   }
 | |
| 
 | |
|   // Choosing which errors will throw exceptions :
 | |
|   unsigned char exceptions() const;
 | |
|   unsigned char exceptions(unsigned char newexcept);
 | |
| 
 | |
|   // final output
 | |
|   string_t str() const;
 | |
|   friend BOOST_IO_STD basic_ostream<Ch, Tr>& 
 | |
|   operator<< <Ch, Tr> ( BOOST_IO_STD basic_ostream<Ch, Tr>& , const basic_format& ); 
 | |
|                       
 | |
| 
 | |
|   template<class Ch2, class Tr2, class T>  friend basic_format<Ch2, Tr2>&  
 | |
|   io::detail::feed(basic_format<Ch2,Tr2>&, T);
 | |
|     
 | |
|   template<class Ch2, class Tr2, class T>  friend   
 | |
|   void io::detail::distribute(basic_format<Ch2,Tr2>&, T);
 | |
|   
 | |
|   template<class Ch2, class Tr2, class T>  friend
 | |
|   basic_format<Ch2, Tr2>&  io::detail::modify_item_body(basic_format<Ch2, Tr2>&, int, const T&);
 | |
| 
 | |
|   template<class Ch2, class Tr2, class T> friend
 | |
|   basic_format<Ch2, Tr2>&  io::detail::bind_arg_body(basic_format<Ch2, Tr2>&, int, const T&);
 | |
| 
 | |
| // make the members private only if the friend templates are supported
 | |
| private:
 | |
| 
 | |
|   // flag bits, used for style_
 | |
|   enum style_values  { ordered = 1,        // set only if all directives are  positional directives
 | |
|                        special_needs = 4 };     
 | |
| 
 | |
|   // parse the format string :
 | |
|   void parse(const string_t&);
 | |
| 
 | |
|   int                           style_;         // style of format-string :  positional or not, etc
 | |
|   int                           cur_arg_;       // keep track of wich argument will come
 | |
|   int                           num_args_;      // number of expected arguments
 | |
|   mutable bool                  dumped_;        // true only after call to str() or <<
 | |
|   std::vector<format_item_t>    items_;         // vector of directives (aka items)
 | |
|   string_t                      prefix_;        // piece of string to insert before first item
 | |
| 
 | |
|   std::vector<bool>             bound_;         // stores which arguments were bound
 | |
|                                                 //   size = num_args OR zero
 | |
|   internal_stream_t             oss_;           // the internal stream.
 | |
|   stream_format_state           state0_;        // reference state for oss_
 | |
|   unsigned char                 exceptions_;
 | |
| }; // class basic_format
 | |
| 
 | |
| 
 | |
| } // namespace boost
 | |
| 
 | |
| 
 | |
| #endif // BOOST_FORMAT_CLASS_HPP
 |