/*

args_4: Command line arguments parsing library
Yauheni A. Akhotnikau (C) 2002-2003
eao197@yahoo.com
-------------------------------------------------

Permission is granted to anyone to use this software for any purpose on any
computer system, and to redistribute it freely, subject to the following
restrictions:

1. This software is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

2. The origin of this software must not be misrepresented, either by
   explicit claim or by omission.

3. Altered versions must be plainly marked as such, and must not be
   misrepresented as being the original software.

-------------------------------------------------

*/
/*
	Args-4
*/

/*!
	\file
	\brief Классы потоков ввода/вывода средствами iostream.
*/

#ifndef _ARGS_4__ARGS_IOSTREAM_HPP_
#define _ARGS_4__ARGS_IOSTREAM_HPP_

#include <iostream>

#include <args_4/h/args.hpp>

namespace args_4
{

/*
** iostream_error_stream_t
*/
/*!
	\brief Поток вывода ошибок посредством std::ostream.
*/
class	iostream_error_stream_t :
	public error_stream_t
{
	public :
		//! Конструктор по умолчанию для std::cerr.
		iostream_error_stream_t();
		//! Инициализирующий конструктор.
		iostream_error_stream_t(
			//! Поток вывода.
			/*! Класс %iostream_error_stream_t не несет
				ответственности за время жизни этого
				объекта. */
			std::ostream * stream );
		virtual ~iostream_error_stream_t();

		/*! Отображает строку в m_stream. */
		virtual error_stream_t &
		out( const char * str );

	protected :
		/*! Поток вывода ошибок. */
		std::ostream *	m_stream;
};

/*
** iostream_with_file_line_num_t
*/
/*!
	\brief Поток вывода ошибок с именем файла и номером
	строки, в котором обнаружена ошибка.

	Модификация класса iostream_error_stream_t, которая
	связывается с объектом words_from_file_t, из которого
	и берется информация об имени файла и номере
	строки.
*/
class	iostream_with_file_line_num_t :
	public iostream_error_stream_t
{
	public :
		//! Для использования в качестве
		//! потока вывода std::cerr.
		iostream_with_file_line_num_t(
			const words_from_file_t & file );
		//! Полностью инициализирующий конструктор.
		iostream_with_file_line_num_t(
			const words_from_file_t & file,
			//! Поток вывода.
			/*! Класс %iostream_with_file_line_num_t не несет
				ответственности за время жизни этого
				объекта. */
			std::ostream * stream );
		virtual ~iostream_with_file_line_num_t();

		/*! Отображает указанную строку в
			поток вывода. Если обнаруживается, что
			строка завершается '\n', то перед
			выводом следующей строки в поток
			вывода будет отображено имя файла и
			номер строки. */
		virtual error_stream_t &
		out( const char * str );

	protected :
		/*! Входной поток, ошибки разбора которого,
			отображаются на поток ошибок. */
		const	words_from_file_t &	m_file;
		/*! Признак того, что последнее обращение
			к out привело к переходу на новую
			строку. */
		bool	m_is_new_line;
};

} /* namespace args_4 */

#endif

