/*	Copyright (C) 2004 Garrett A. Kajmowicz

	This file is part of the uClibc++ Library.

	This library is free software; you can redistribute it and/or
	modify it under the terms of the GNU Lesser General Public
	License as published by the Free Software Foundation; either
	version 2.1 of the License, or (at your option) any later version.

	This library 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.  See the GNU
	Lesser General Public License for more details.

	You should have received a copy of the GNU Lesser General Public
	License along with this library; if not, write to the Free Software
	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
#pragma once
// iosfwd只负责声明。在设计上应该避免包含其它头文件（除非你确信不会造成循环包含）。包含iosfwd的文件应该负责包含iosfwd依赖的定义（如果需要）。如果依赖iosfwd中的默认参数，则必须包含iosfwd，定义文件中则不应该包含这些默认参数。
#ifndef ARDUINO_ARCH_AVR
#include_next <iosfwd>
#include "system_configuration.h"
#endif
#include <Stream.h>
#include <bits/allocator.h>

#pragma GCC visibility push(default)

namespace std
{
#ifdef ARDUINO_ARCH_AVR
	class ios_base;
	template <>
	class char_traits<char>;

#ifdef __UCLIBCXX_HAS_WCHAR__
	template <>
	class char_traits<wchar_t>;
#endif

	template <class charT, class traits = char_traits<charT>>
	class basic_ios;

	template <class charT, class traits = char_traits<charT>>
	class basic_streambuf;
	template <class charT, class traits = char_traits<charT>>
	class basic_istream;
	template <class charT, class traits = char_traits<charT>>
	class basic_ostream;
	template <class charT, class traits = char_traits<charT>>
	class basic_iostream;

	template <class charT, class traits = char_traits<charT>,
			  class Allocator = allocator<charT>>
	class basic_stringbuf;

	template <class charT, class traits = char_traits<charT>,
			  class Allocator = allocator<charT>>
	class basic_istringstream;

	template <class charT, class traits = char_traits<charT>,
			  class Allocator = allocator<charT>>
	class basic_ostringstream;

	template <class charT, class traits = char_traits<charT>,
			  class Allocator = allocator<charT>>
	class basic_stringstream;
#endif
	template <class charT, class traits = char_traits<charT>, class Tserial = Stream>
	class basic_serialbuf;
	template <class charT, class traits = char_traits<charT>, class Tserial = Stream>
	class basic_iserialstream;
	template <class charT, class traits = char_traits<charT>, class Tserial = Stream>
	class basic_oserialstream;

	template <class charT, class traits = char_traits<charT>>
	class basic_serstream;
#ifdef ARDUINO_ARCH_AVR
	template <class charT, class traits = char_traits<charT>>
	class basic_istreambuf_iterator;

	template <class charT, class traits = char_traits<charT>>
	class basic_ostreambuf_iterator;

	typedef basic_ios<char> ios;
#ifdef __UCLIBCXX_HAS_WCHAR__
	typedef basic_ios<wchar_t> wios;
#endif

	typedef basic_streambuf<char> streambuf;
	typedef basic_istream<char> istream;
	typedef basic_ostream<char> ostream;
	typedef basic_iostream<char> iostream;

	typedef basic_stringbuf<char> stringbuf;
	typedef basic_istringstream<char> istringstream;
	typedef basic_ostringstream<char> ostringstream;
	typedef basic_stringstream<char> stringstream;
#endif
	typedef basic_serialbuf<char> serialbuf;
	typedef basic_iserialstream<char> ihserialstream;
	typedef basic_oserialstream<char> ohserialstream;
	typedef basic_serstream<char> serstream;
#ifdef ARDUINO_ARCH_AVR
#ifdef __UCLIBCXX_HAS_WCHAR__
	typedef basic_streambuf<wchar_t> wstreambuf;
	typedef basic_istream<wchar_t> wistream;
	typedef basic_ostream<wchar_t> wostream;
	typedef basic_iostream<wchar_t> wiostream;

	typedef basic_stringbuf<wchar_t> wstringbuf;
	typedef basic_istringstream<wchar_t> wistringstream;
	typedef basic_ostringstream<wchar_t> wostringstream;
	typedef basic_stringstream<wchar_t> wstringstream;
#endif
#endif
#ifdef __UCLIBCXX_HAS_WCHAR__
	typedef basic_serialbuf<wchar_t> wserialbuf;
	typedef basic_iserialstream<wchar_t> wiserstream;
	typedef basic_oserialstream<wchar_t> woserstream;
	typedef basic_serstream<wchar_t> wserstream;
#endif
#ifdef ARDUINO_ARCH_AVR
	template <class state>
	class fpos;
	typedef fpos<char_traits<char>::state_type> streampos;
#if defined(__UCLIBCXX_HAS_WCHAR__) && defined(ARDUINO_ARCH_SAM)
	typedef fpos<char_traits<wchar_t>::state_type> wstreampos;
#endif
#endif
}

#pragma GCC visibility pop