/*
 * Copyright (c) 1999
 * Silicon Graphics Computer Systems, Inc.
 *
 * Copyright (c) 1999
 * Boris Fomitchev
 *
 * This material is provided "as is", with absolutely no warranty expressed
 * or implied. Any use is at your own risk.
 *
 * Permission to use or copy this software for any purpose is hereby granted
 * without fee, provided the above notices are retained on all copies.
 * Permission to modify the code and to distribute modified code is granted,
 * provided the above notices are retained, and a notice that the code was
 * modified is included with the above copyright notice.
 *
 */


// This header defines classes basic_filebuf, basic_ifstream,
// basic_ofstream, and basic_fstream.  These classes represent
// streambufs and streams whose sources or destinations are files.

#ifndef _STLP_FSTREAM

#ifndef _STLP_OUTERMOST_HEADER_ID
#  define _STLP_OUTERMOST_HEADER_ID 0x1025
#  include <stl/_prolog.h>
#  define _STLP_FSTREAM
#  if defined (__DMC__) && defined (_DLL)
#    define _STLP_CLASS_IMPORT_DECLSPEC __declspec(dllimport)
#  endif
#endif

#if (_STLP_OUTERMOST_HEADER_ID == 0x1025) && \
   !(defined (_STLP_NO_IOSTREAMS) && defined (_STLP_IMPORT_VENDOR_STD))
#  include <stl/_ioserr.h>

#  ifndef _STLP_INTERNAL_FSTREAM_H
#    include <stl/_fstream.h>
#  endif
#endif

#if (_STLP_OUTERMOST_HEADER_ID != 0x1025) || defined (_STLP_IMPORT_VENDOR_STD)
#  if defined (_STLP_HAS_INCLUDE_NEXT)
#    include_next <fstream>
#  else
#    include _STLP_NATIVE_HEADER(fstream)
#  endif
#endif

#if (_STLP_OUTERMOST_HEADER_ID == 0x1025)
#  include <stl/_epilog.h>
#  undef _STLP_OUTERMOST_HEADER_ID
#  if defined (__DMC__) && defined (_DLL)
#    undef _STLP_CLASS_IMPORT_DECLSPEC
#    define _STLP_CLASS_IMPORT_DECLSPEC
#  endif
#endif

#endif /* _STLP_FSTREAM */


// Local Variables:
// mode:C++
// End:
