| /*************************************************************************** |
| * |
| * 27.forward.cpp - exercises lib.iostream.forward |
| * |
| * $Id$ |
| * |
| *************************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed |
| * with this work for additional information regarding copyright |
| * ownership. The ASF licenses this file to you under the Apache |
| * License, Version 2.0 (the "License"); you may not use this file |
| * except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
| * implied. See the License for the specific language governing |
| * permissions and limitations under the License. |
| * |
| * Copyright 1994-2005 Rogue Wave Software. |
| * |
| **************************************************************************/ |
| |
| #include <iosfwd> |
| |
| // IMPORTANT: do not #include any other header before the declarations |
| // below in order not to accidentally bring in any missing |
| // definitions from the #included header |
| |
| #ifndef _RWSTD_NO_NAMESPACE |
| # define std std |
| #else |
| # define std |
| #endif // _RWSTD_NO_NAMESPACE |
| |
| typedef char C; |
| |
| typedef std::char_traits<C> ctraits; |
| typedef std::allocator<C> calloc; |
| |
| typedef std::basic_ios<C, ctraits> C_basic_ios; |
| typedef std::basic_streambuf<C, ctraits> C_basic_streambuf; |
| typedef std::basic_istream<C, ctraits> C_basic_istream; |
| typedef std::basic_ostream<C, ctraits> C_basic_ostream; |
| typedef std::basic_iostream<C, ctraits> C_basic_iostream; |
| typedef std::basic_stringbuf<C, ctraits, calloc> C_basic_stringbuf; |
| typedef std::basic_istringstream<C, ctraits, calloc> C_basic_istringstream; |
| typedef std::basic_ostringstream<C, ctraits, calloc> C_basic_ostringstream; |
| typedef std::basic_stringstream<C, ctraits, calloc> C_basic_stringstream; |
| |
| typedef std::basic_filebuf<C, ctraits> C_basic_filebuf; |
| typedef std::basic_ifstream<C, ctraits> C_basic_ifstream; |
| typedef std::basic_ofstream<C, ctraits> C_basic_ofstream; |
| typedef std::basic_fstream<C, ctraits> C_basic_fstream; |
| |
| typedef std::istreambuf_iterator<C, ctraits> C_istreambuf_iterator; |
| typedef std::ostreambuf_iterator<C, ctraits> C_ostreambuf_iterator; |
| |
| #ifndef _RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES |
| |
| // make sure that default template arguments are specified |
| |
| typedef std::basic_ios<C> C_X_basic_ios; |
| typedef std::basic_streambuf<C> C_X_basic_streambuf; |
| typedef std::basic_istream<C> C_X_basic_istream; |
| typedef std::basic_ostream<C> C_X_basic_ostream; |
| typedef std::basic_iostream<C> C_X_basic_iostream; |
| typedef std::basic_stringbuf<C> C_X_basic_stringbuf; |
| typedef std::basic_istringstream<C> C_X_basic_istringstream; |
| typedef std::basic_ostringstream<C> C_X_basic_ostringstream; |
| typedef std::basic_stringstream<C> C_X_basic_stringstream; |
| |
| typedef std::basic_filebuf<C> C_X_basic_filebuf; |
| typedef std::basic_ifstream<C> C_X_basic_ifstream; |
| typedef std::basic_ofstream<C> C_X_basic_ofstream; |
| typedef std::basic_fstream<C> C_X_basic_fstream; |
| |
| typedef std::istreambuf_iterator<C> C_X_istreambuf_iterator; |
| typedef std::ostreambuf_iterator<C> C_X_ostreambuf_iterator; |
| |
| #endif // _RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES |
| |
| typedef std::fpos<C> C_fpos; |
| |
| // test whether all required typedefs are defined |
| typedef std::ios C_ios; |
| typedef std::streambuf C_streambuf; |
| typedef std::istream C_istream; |
| typedef std::ostream C_ostream; |
| typedef std::iostream C_iostream; |
| typedef std::stringbuf C_stringbuf; |
| typedef std::istringstream C_istringstream; |
| typedef std::ostringstream C_ostringstream; |
| typedef std::stringstream C_stringstream; |
| typedef std::filebuf C_filebuf; |
| typedef std::ifstream C_ifstream; |
| typedef std::ofstream C_ofstream; |
| typedef std::fstream C_fstream; |
| |
| typedef std::streampos C_streampos; |
| |
| |
| #ifndef _RWSTD_NO_WCHAR_T |
| |
| typedef std::wios W_wios; |
| typedef std::wstreambuf W_wstreambuf; |
| typedef std::wistream W_wistream; |
| typedef std::wostream W_wostream; |
| typedef std::wiostream W_wiostream; |
| typedef std::wstringbuf W_wstringbuf; |
| typedef std::wistringstream W_wistringstream; |
| typedef std::wostringstream W_wostringstream; |
| typedef std::wstringstream W_wstringstream; |
| typedef std::wfilebuf W_wfilebuf; |
| typedef std::wifstream W_wifstream; |
| typedef std::wofstream W_wofstream; |
| typedef std::wfstream W_wfstream; |
| |
| typedef std::wstreampos W_wstreampos; |
| |
| #endif // _RWSTD_NO_WCHAR_T |
| |
| /**************************************************************************/ |
| |
| #include <rw_driver.h> |
| |
| /**************************************************************************/ |
| |
| #ifndef _RWSTD_NO_PART_SPEC_OVERLOAD |
| |
| template <class T, class U> |
| bool is_same_type (const T*, const U*) { return false; } |
| |
| template <class T> |
| bool is_same_type (const T*, const T*) { return true; } |
| |
| #else // ifdef _RWSTD_NO_PART_SPEC_OVERLOAD |
| |
| template <class T, class U> |
| struct is_same |
| { |
| struct yes {}; |
| struct no { yes no_ [2]; }; |
| template <class T> |
| struct Type {}; |
| |
| static yes test (Type<T>, Type<T>); |
| static no test (...); |
| |
| enum { value = sizeof (test (Type<T> (), Type<U> ())) == sizeof (yes) }; |
| }; |
| |
| template <class T, class U> |
| bool is_same_type (const T*, const U*) { return is_same<T, U>::value; } |
| |
| #endif // _RWSTD_NO_PART_SPEC_OVERLOAD |
| |
| /**************************************************************************/ |
| |
| static int |
| run_test (int, char*[]) |
| { |
| #define TEST_TYPE(T) \ |
| rw_assert (is_same_type ((C_X_ ## T*)0, (C_ ## T*)0), 0, __LINE__, \ |
| "%s", #T); |
| |
| // check that default arguments are correct |
| TEST_TYPE (basic_ios); |
| TEST_TYPE (basic_streambuf); |
| TEST_TYPE (basic_istream); |
| TEST_TYPE (basic_ostream); |
| TEST_TYPE (basic_iostream); |
| TEST_TYPE (basic_stringbuf); |
| TEST_TYPE (basic_istringstream); |
| TEST_TYPE (basic_ostringstream); |
| TEST_TYPE (basic_stringstream); |
| |
| TEST_TYPE (basic_filebuf); |
| TEST_TYPE (basic_ifstream); |
| TEST_TYPE (basic_ofstream); |
| TEST_TYPE (basic_fstream); |
| |
| TEST_TYPE (istreambuf_iterator); |
| TEST_TYPE (ostreambuf_iterator); |
| |
| |
| #define TEST_TYPEDEF(T, U) \ |
| rw_assert (is_same_type ((T*)0, (U*)0), 0, __LINE__, \ |
| "%s == %s", #T, #U); |
| |
| // check that typedefs are correctly defined |
| TEST_TYPEDEF (std::ios, C_ios); |
| TEST_TYPEDEF (std::streambuf, C_streambuf); |
| TEST_TYPEDEF (std::istream, C_istream); |
| TEST_TYPEDEF (std::ostream, C_ostream); |
| TEST_TYPEDEF (std::iostream, C_iostream); |
| TEST_TYPEDEF (std::stringbuf, C_stringbuf); |
| TEST_TYPEDEF (std::istringstream, C_istringstream); |
| TEST_TYPEDEF (std::ostringstream, C_ostringstream); |
| TEST_TYPEDEF (std::stringstream, C_stringstream); |
| TEST_TYPEDEF (std::filebuf, C_filebuf); |
| TEST_TYPEDEF (std::ifstream, C_ifstream); |
| TEST_TYPEDEF (std::ofstream, C_ofstream); |
| TEST_TYPEDEF (std::fstream, C_fstream); |
| |
| #ifndef _RWSTD_NO_WCHAR_T |
| |
| TEST_TYPEDEF (std::wios, W_wios); |
| TEST_TYPEDEF (std::wstreambuf, W_wstreambuf); |
| TEST_TYPEDEF (std::wistream, W_wistream); |
| TEST_TYPEDEF (std::wostream, W_wostream); |
| TEST_TYPEDEF (std::wiostream, W_wiostream); |
| TEST_TYPEDEF (std::wstringbuf, W_wstringbuf); |
| TEST_TYPEDEF (std::wistringstream, W_wistringstream); |
| TEST_TYPEDEF (std::wostringstream, W_wostringstream); |
| TEST_TYPEDEF (std::wstringstream, W_wstringstream); |
| TEST_TYPEDEF (std::wfilebuf, W_wfilebuf); |
| TEST_TYPEDEF (std::wifstream, W_wifstream); |
| TEST_TYPEDEF (std::wofstream, W_wofstream); |
| TEST_TYPEDEF (std::wfstream, W_wfstream); |
| TEST_TYPEDEF (std::wstreampos, std::streampos); |
| |
| #endif // _RWSTD_NO_WCHAR_T |
| |
| return 0; |
| } |
| |
| /**************************************************************************/ |
| |
| int main (int argc, char *argv[]) |
| { |
| return rw_test (argc, argv, __FILE__, |
| "lib.iostream.forward", |
| 0, // no comment |
| run_test, |
| "", |
| 0); |
| } |