71 lines
2.6 KiB
C++
71 lines
2.6 KiB
C++
// ----------------------------------------------------------------------------
|
|
// free_funcs.hpp : implementation of the free functions of boost::format
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// Copyright Samuel Krempp 2003. Use, modification, and distribution are
|
|
// subject to the Boost Software License, Version 1.0. (See accompanying
|
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
// See http://www.boost.org/libs/format for library home page
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#ifndef BOOST_FORMAT_FUNCS_HPP
|
|
#define BOOST_FORMAT_FUNCS_HPP
|
|
|
|
#include <boost/format/format_class.hpp>
|
|
#include <boost/throw_exception.hpp>
|
|
|
|
namespace boost {
|
|
|
|
template<class Ch, class Tr, class Alloc> inline
|
|
std::basic_string<Ch, Tr, Alloc> str(const basic_format<Ch, Tr, Alloc>& f) {
|
|
// adds up all pieces of strings and converted items, and return the formatted string
|
|
return f.str();
|
|
}
|
|
namespace io {
|
|
using ::boost::str; // keep compatibility with when it was defined in this N.S.
|
|
} // - namespace io
|
|
|
|
#ifndef BOOST_NO_TEMPLATE_STD_STREAM
|
|
template<class Ch, class Tr, class Alloc>
|
|
std::basic_ostream<Ch, Tr> &
|
|
operator<<( std::basic_ostream<Ch, Tr> & os,
|
|
const basic_format<Ch, Tr, Alloc>& f)
|
|
#else
|
|
template<class Ch, class Tr, class Alloc>
|
|
std::ostream &
|
|
operator<<( std::ostream & os,
|
|
const basic_format<Ch, Tr, Alloc>& f)
|
|
#endif
|
|
// effect: "return os << str(f);" but we can do it faster
|
|
{
|
|
typedef boost::basic_format<Ch, Tr, Alloc> format_t;
|
|
if(f.items_.size()==0)
|
|
os << f.prefix_;
|
|
else {
|
|
if(f.cur_arg_ < f.num_args_)
|
|
if( f.exceptions() & io::too_few_args_bit )
|
|
// not enough variables supplied
|
|
boost::throw_exception(io::too_few_args(f.cur_arg_, f.num_args_));
|
|
if(f.style_ & format_t::special_needs)
|
|
os << f.str();
|
|
else {
|
|
// else we dont have to count chars output, so we dump directly to os :
|
|
os << f.prefix_;
|
|
for(unsigned long i=0; i<f.items_.size(); ++i) {
|
|
const typename format_t::format_item_t& item = f.items_[i];
|
|
os << item.res_;
|
|
os << item.appendix_;
|
|
}
|
|
}
|
|
}
|
|
f.dumped_=true;
|
|
return os;
|
|
}
|
|
|
|
} // namespace boost
|
|
|
|
|
|
#endif // BOOST_FORMAT_FUNCS_HPP
|